MySQL 9.4.0
Source Code Documentation
sql_class.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2025, 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#ifndef SQL_CLASS_INCLUDED
25#define SQL_CLASS_INCLUDED
26
27/*
28 This file contains the declaration of the THD class and classes which THD
29 depends on. It should contain as little else as possible to increase
30 cohesion and reduce coupling. Since THD is used in many places, many files
31 are dependent on this header and thus require recompilation if it changes.
32 Historically this file contained "Classes in mysql".
33*/
34
35#include "my_config.h"
36
37#include <limits.h>
38#include <stdarg.h>
39#include <stdio.h>
40#include <string.h>
41#ifdef HAVE_SYS_TIME_H
42#include <sys/time.h>
43#endif
44#include <sys/types.h>
45#include <atomic>
46#include <bitset>
47#include <memory>
48#include <new>
49#include <stack>
50#include <string>
51#include <unordered_map>
52
53#include "dur_prop.h" // durability_properties
54#include "lex_string.h"
55#include "map_helpers.h"
56#include "my_alloc.h"
57#include "my_base.h"
58#include "my_command.h"
59#include "my_compiler.h"
60#include "my_dbug.h"
61#include "my_inttypes.h"
62#include "my_io.h"
63#include "my_psi_config.h"
64#include "my_sqlcommand.h"
65#include "my_sys.h"
66#include "my_table_map.h"
67#include "my_thread_local.h"
68#include "my_time_t.h"
78#include "mysql/plugin_audit.h"
83#include "mysql/thread_type.h"
84#include "mysql_com_server.h" // NET_SERVER
85#include "mysqld_error.h"
86#include "pfs_thread_provider.h"
87#include "prealloced_array.h"
88#include "sql/auth/sql_security_ctx.h" // Security_context
89#include "sql/current_thd.h"
90#include "sql/dd/string_type.h" // dd::string_type
91#include "sql/discrete_interval.h" // Discrete_interval
92#include "sql/locked_tables_list.h" // enum_locked_tables_mode
93#include "sql/mdl.h"
94#include "sql/opt_costmodel.h"
95#include "sql/opt_trace_context.h" // Opt_trace_context
96#include "sql/parse_location.h"
97#include "sql/psi_memory_key.h"
98#include "sql/query_options.h"
101#include "sql/rpl_context.h" // Rpl_thd_context
102#include "sql/rpl_gtid.h"
103#include "sql/session_tracker.h" // Session_tracker
104#include "sql/sql_audit.h"
105#include "sql/sql_connect.h"
106#include "sql/sql_const.h"
107#include "sql/sql_digest_stream.h" // sql_digest_state
108#include "sql/sql_error.h"
109#include "sql/sql_list.h"
110#include "sql/sql_plugin_ref.h"
111#include "sql/sys_vars_resource_mgr.h" // Session_sysvar_resource_manager
112#include "sql/system_variables.h" // system_variables
113#include "sql/transaction_info.h" // Ha_trx_info
114#include "sql/xa.h"
116#include "sql_string.h"
117#include "template_utils.h"
118#include "thr_lock.h"
119#include "violite.h"
120
121enum enum_check_fields : int;
122enum enum_tx_isolation : int;
123enum ha_notification_type : int;
124class Item;
125class Parser_state;
126class PROFILING;
128class Relay_log_info;
129class THD;
130class partition_info;
131class Protocol;
132class Protocol_binary;
133class Protocol_classic;
134class Protocol_text;
135template <class T>
136class mem_root_deque;
137class sp_rcontext;
138class user_var_entry;
139struct LEX;
140struct LEX_USER;
141struct TABLE;
142class Table_ref;
143struct timeval;
144struct User_level_lock;
145
146namespace dd {
147namespace cache {
148class Dictionary_client;
149}
150
151class DD_kill_immunizer;
152} // namespace dd
153
156class Query_result;
158class Rows_log_event;
159class Time_zone;
160class sp_cache;
162struct Log_info;
163
164typedef struct user_conn USER_CONN;
165struct MYSQL_LOCK;
166
167extern "C" void thd_enter_cond(void *opaque_thd, mysql_cond_t *cond,
168 mysql_mutex_t *mutex,
169 const PSI_stage_info *stage,
170 PSI_stage_info *old_stage,
171 const char *src_function, const char *src_file,
172 int src_line);
173extern "C" void thd_exit_cond(void *opaque_thd, const PSI_stage_info *stage,
174 const char *src_function, const char *src_file,
175 int src_line);
176
177extern "C" void thd_enter_stage(void *opaque_thd,
178 const PSI_stage_info *new_stage,
179 PSI_stage_info *old_stage,
180 const char *src_function, const char *src_file,
181 int src_line);
182
183extern "C" void thd_set_waiting_for_disk_space(void *opaque_thd,
184 const bool waiting);
185
186#define THD_STAGE_INFO(thd, stage) \
187 (thd)->enter_stage(&stage, NULL, __func__, __FILE__, __LINE__)
188
189extern char empty_c_string[1];
190
191/*
192 We preallocate data for several storage engine plugins.
193 so: innodb + bdb + ndb + binlog + myisam + myisammrg + archive +
194 example + csv + heap + blackhole + federated + 0
195 (yes, the sum is deliberately inaccurate)
196*/
197constexpr size_t PREALLOC_NUM_HA = 15;
198
199#ifndef NDEBUG
200// Used to sample certain debug flags when a query is read but before the reply
201// is sent.
202enum class TDM { ANY, ON, ZERO, NOT_AVAILABLE };
204#endif /* not defined NDEBUG */
205
206/**
207 To be used for pool-of-threads (implemented differently on various OSs)
208*/
210 public:
211 void *data; /* scheduler-specific data structure */
212
214
215 ~thd_scheduler() = default;
216};
217
219void thd_set_psi(THD *thd, PSI_thread *psi);
220
221/**
222 Return @@session.terminology_use_previous for the current THD.
223
224 @return the integer value of one of the enumeration values in
225 terminology_use_previous::enum_compatibility_version.
226*/
227extern "C" unsigned int thd_get_current_thd_terminology_use_previous();
228
230 /**
231 Memory counter object doesn't update global memory counter and doesn't throw
232 OOM error.
233 */
235 /**
236 if MEM_CNT_UPDATE_GLOBAL_COUNTER is set, memory counter object updates
237 global memory counter.
238 */
240 /**
241 if MEM_CNT_GENERATE_ERROR is set, memory counter object generates OOM error if
242 any.
243*/
245 /**
246 if MEM_CNT_GENERATE_LOG_ERROR is set, memory counter object generates OOM
247 error to error log if any.
248*/
251
253 private:
254 bool m_enabled{false};
255 THD *m_thd{nullptr}; // Pointer to THD object.
256 Diagnostics_area m_da{false}; // Diagnostics area.
257 ulonglong mem_counter{0}; // Amount of memory consumed by thread.
258 ulonglong max_conn_mem{0}; // Max amount memory consumed by thread.
259 ulonglong glob_mem_counter{0}; // Amount of memory added to global
260 // memory counter.
261 uint curr_mode{MEM_CNT_DEFAULT}; // Current memory counter mode.
262 uint orig_mode{MEM_CNT_DEFAULT}; // Original memory counter mode
263 // (sets at init_mode() stage).
264 bool is_connection_stage{true}; // True on connection stage,
265 // resets to false after successful
266 // connection.
267 public:
270 assert(!m_enabled);
271 assert(glob_mem_counter == 0);
272 }
273 void set_thd(THD *thd) { m_thd = thd; }
274 void enable() { m_enabled = true; }
275 void disable();
276
277 void alloc_cnt(size_t size);
278 void free_cnt(size_t size);
279 int reset();
280 void flush();
281 /**
282 Restore original memory counter mode.
283 */
285 /**
286 Set NO ERROR memory counter mode.
287 */
290 }
291 /**
292 Function sets current memory counter mode.
293
294 @param mode_arg current memory counter mode.
295 */
296 void set_curr_mode(uint mode_arg) { curr_mode = mode_arg; }
297 /**
298 Function sets original memory counter mode.
299
300 @param mode_arg original memory counter mode.
301 */
302 void set_orig_mode(uint mode_arg) { orig_mode = mode_arg; }
303 /**
304 Check if memory counter error is issued.
305
306 @retval true if memory counter error is issued, false otherwise.
307 */
308 bool is_error() const { return m_da.is_error(); }
309 void set_thd_error_status() const;
310
311 private:
312 int generate_error(int err_no, ulonglong mem_limit, ulonglong mem_size);
313 /**
314 Check if memory counter is in error mode.
315
316 @retval true if memory counter is in error mode, false otherwise.
317 */
318 bool is_error_mode() const { return (curr_mode & MEM_CNT_GENERATE_ERROR); }
319 /**
320 Check if memory counter is in error log mode.
321
322 @retval true if memory counter is in error log mode, false otherwise.
323 */
324 bool is_error_log_mode() const {
326 }
327};
328
329/**
330 the struct aggregates two parameters that identify an event
331 uniquely in scope of communication of a particular master and slave couple.
332 I.e there can not be 2 events from the same staying connected master which
333 have the same coordinates.
334 @note
335 Such identifier is not yet unique generally as the event originating master
336 is resettable. Also the crashed master can be replaced with some other.
337*/
338typedef struct rpl_event_coordinates {
339 char *file_name; // binlog file name (directories stripped)
340 my_off_t pos; // event's position in the binlog file
342
343#define THD_SENTRY_MAGIC 0xfeedd1ff
344#define THD_SENTRY_GONE 0xdeadbeef
345
346#define THD_CHECK_SENTRY(thd) assert(thd->dbug_sentry == THD_SENTRY_MAGIC)
347
349 private:
350 /*
351 List of items created for this query. Every item adds itself to the list
352 on creation (see Item::Item() for details)
353 */
355
356 public:
357 MEM_ROOT *mem_root; // Pointer to current memroot
358 /// To check whether a reprepare operation is active
359 bool is_repreparing{false};
360 /*
361 The states reflects three different life cycles for three
362 different types of statements:
363 Prepared statement: STMT_INITIALIZED -> STMT_PREPARED -> STMT_EXECUTED.
364 Stored procedure: STMT_INITIALIZED_FOR_SP -> STMT_EXECUTED.
365 Other statements: STMT_REGULAR_EXECUTION never changes.
366 */
373 STMT_ERROR = -1
374 };
375
376 /*
377 State and state changes in SP:
378 1) When state is STMT_INITIALIZED_FOR_SP, objects in the item tree are
379 created on the statement memroot. This is enforced through
380 ps_arena_holder checking the state.
381 2) After the first execute (call p1()), this state should change to
382 STMT_EXECUTED. Objects will be created on the execution memroot and will
383 be destroyed at the end of each execution.
384 3) In case an ER_NEED_REPREPARE error occurs, state should be changed to
385 STMT_INITIALIZED_FOR_SP and objects will again be created on the
386 statement memroot. At the end of this execution, state should change to
387 STMT_EXECUTED.
388 */
389 private:
391
392 public:
393 Query_arena(MEM_ROOT *mem_root_arg, enum enum_state state_arg)
394 : m_item_list(nullptr), mem_root(mem_root_arg), state(state_arg) {}
395
396 /*
397 This constructor is used only when Query_arena is created as
398 backup storage for another instance of Query_arena.
399 */
402
403 virtual ~Query_arena() = default;
404
405 Item *item_list() const { return m_item_list; }
406 void reset_item_list() { m_item_list = nullptr; }
407 void set_item_list(Item *item) { m_item_list = item; }
408 void add_item(Item *item);
409 void free_items();
410 void set_state(enum_state state_arg) { state = state_arg; }
411 enum_state get_state() const { return state; }
412 bool is_stmt_prepare() const { return state == STMT_INITIALIZED; }
414 return (int)state < (int)STMT_PREPARED;
415 }
417 return (int)state <= (int)STMT_PREPARED;
418 }
419 /// @returns true if a regular statement, ie not prepared and not stored proc
420 bool is_regular() const { return state == STMT_REGULAR_EXECUTION; }
421
422 void *alloc(size_t size) { return mem_root->Alloc(size); }
423 void *mem_calloc(size_t size) {
424 void *ptr;
425 if ((ptr = mem_root->Alloc(size))) memset(ptr, 0, size);
426 return ptr;
427 }
428 template <typename T>
430 void *m = alloc(sizeof(T));
431 return m == nullptr ? nullptr : new (m) T;
432 }
433 template <typename T>
434 T *memdup_typed(const T *mem) {
435 return static_cast<T *>(memdup_root(mem_root, mem, sizeof(T)));
436 }
437 char *mem_strdup(const char *str) { return strdup_root(mem_root, str); }
438 char *strmake(const char *str, size_t size) const {
439 return strmake_root(mem_root, str, size);
440 }
442 LEX_CSTRING ret;
443 ret.str = strmake(str.str, str.length);
444 ret.length = ret.str ? str.length : 0;
445 return ret;
446 }
447 void *memdup(const void *str, size_t size) {
448 return memdup_root(mem_root, str, size);
449 }
450
451 /**
452 Copies memory-managing members from `set`. No references are kept to it.
453
454 @param set A Query_arena from which members are copied.
455 */
456 void set_query_arena(const Query_arena &set);
457
458 /**
459 Copy the current arena to `backup` and set the current
460 arena to match `source`
461
462 @param source A Query_arena from which members are copied.
463 @param backup A Query_arena to which members are first saved.
464 */
466};
467
469
470/**
471 Container for all prepared statements created/used in a connection.
472
473 Prepared statements in Prepared_statement_map have unique id
474 (guaranteed by id assignment in Prepared_statement::Prepared_statement).
475
476 Non-empty statement names are unique too: attempt to insert a new statement
477 with duplicate name causes older statement to be deleted.
478
479 Prepared statements are auto-deleted when they are removed from the map
480 and when the map is deleted.
481*/
482
484 public:
486
487 /**
488 Insert a new statement to the thread-local prepared statement map.
489
490 If there was an old statement with the same name, replace it with the
491 new one. Otherwise, check if max_prepared_stmt_count is not reached yet,
492 increase prepared_stmt_count, and insert the new statement. It's okay
493 to delete an old statement and fail to insert the new one.
494
495 All named prepared statements are also present in names_hash.
496 Prepared statement names in names_hash are unique.
497 The statement is added only if prepared_stmt_count < max_prepard_stmt_count
498 m_last_found_statement always points to a valid statement or is 0
499
500 @retval 0 success
501 @retval 1 error: out of resources or max_prepared_stmt_count limit has been
502 reached. An error is sent to the client, the statement
503 is deleted.
504 */
506
507 /** Find prepared statement by name. */
509
510 /** Find prepared statement by ID. */
511 Prepared_statement *find(ulong id);
512
513 /** Erase all prepared statements (calls Prepared_statement destructor). */
515
516 void claim_memory_ownership(bool claim);
517
518 void reset();
519
521
522 private:
526};
527
528/**
529 A registry for item tree transformations performed during
530 query optimization. We register only those changes which require
531 a rollback to re-execute a prepared statement or stored procedure
532 yet another time.
533*/
534
535class Item_change_record : public ilink<Item_change_record> {
536 private:
537 // not used
539
540 public:
546 bool m_cancel{false};
547};
548
550
551/**
552 Class that holds information about tables which were opened and locked
553 by the thread. It is also used to save/restore this information in
554 push_open_tables_state()/pop_open_tables_state().
555*/
556
558 private:
559 /**
560 A stack of Reprepare_observer-instances. The top most instance is the
561 currently active one. This stack is used during execution of prepared
562 statements and stored programs in order to detect metadata changes.
563 The locking subsystem reports a metadata change if the top-most item is not
564 NULL.
565
566 When Open_tables_state part of THD is reset to open a system or
567 INFORMATION_SCHEMA table, NULL is temporarily pushed to avoid spurious
568 ER_NEED_REPREPARE errors -- system and INFORMATION_SCHEMA tables are not
569 subject to metadata version tracking.
570
571 A stack is used here for the convenience -- in some cases we need to
572 temporarily override/disable current Reprepare_observer-instance.
573
574 NOTE: This is not a list of observers, only the top-most element will be
575 notified in case of a metadata change.
576
577 @sa check_and_update_table_version()
578 */
580
581 public:
583 return m_reprepare_observers.size() > 0 ? m_reprepare_observers.back()
584 : nullptr;
585 }
586
588 m_reprepare_observers.push_back(o);
589 }
590
593 m_reprepare_observers.pop_back();
594 return retval;
595 }
596
598
599 public:
600 /**
601 List of regular tables in use by this thread. Contains persistent base
602 tables that were opened with @see open_tables().
603 */
605 /**
606 List of temporary tables used by this thread. Contains user-level
607 temporary tables, created with CREATE TEMPORARY TABLE, and
608 intermediate tables used in ALTER TABLE implementation.
609 */
611 /*
612 During a MySQL session, one can lock tables in two modes: automatic
613 or manual. In automatic mode all necessary tables are locked just before
614 statement execution, and all acquired locks are stored in 'lock'
615 member. Unlocking takes place automatically as well, when the
616 statement ends.
617 Manual mode comes into play when a user issues a 'LOCK TABLES'
618 statement. In this mode the user can only use the locked tables.
619 Trying to use any other tables will give an error.
620 The locked tables are also stored in this member, however,
621 thd->locked_tables_mode is turned on. Manual locking is described in
622 the 'LOCK_TABLES' chapter of the MySQL manual.
623 See also lock_tables() for details.
624 */
626
627 /*
628 CREATE-SELECT keeps an extra lock for the table being
629 created. This field is used to keep the extra lock available for
630 lower level routines, which would otherwise miss that lock.
631 */
633
634 /*
635 Enum enum_locked_tables_mode and locked_tables_mode member are
636 used to indicate whether the so-called "locked tables mode" is on,
637 and what kind of mode is active.
638
639 Locked tables mode is used when it's necessary to open and
640 lock many tables at once, for usage across multiple
641 (sub-)statements.
642 This may be necessary either for queries that use stored functions
643 and triggers, in which case the statements inside functions and
644 triggers may be executed many times, or for implementation of
645 LOCK TABLES, in which case the opened tables are reused by all
646 subsequent statements until a call to UNLOCK TABLES.
647
648 The kind of locked tables mode employed for stored functions and
649 triggers is also called "prelocked mode".
650 In this mode, first open_tables() call to open the tables used
651 in a statement analyses all functions used by the statement
652 and adds all indirectly used tables to the list of tables to
653 open and lock.
654 It also marks the parse tree of the statement as requiring
655 prelocking. After that, lock_tables() locks the entire list
656 of tables and changes THD::locked_tables_modeto LTM_PRELOCKED.
657 All statements executed inside functions or triggers
658 use the prelocked tables, instead of opening their own ones.
659 Prelocked mode is turned off automatically once close_thread_tables()
660 of the main statement is called.
661 */
663
665 BACKUPS_AVAIL = (1U << 0), /* There are backups available. */
666 SYSTEM_TABLES = (1U << 1) /* We are opening system tables. */
667 };
668
669 /*
670 Flags with information about the open tables state.
671 */
673 /**
674 This constructor initializes Open_tables_state instance which can only
675 be used as backup storage. To prepare Open_tables_state instance for
676 operations which open/lock/close tables (e.g. open_table()) one has to
677 call init_open_tables_state().
678 */
681
683
685};
686
687/**
688 Storage for backup of Open_tables_state. Must
689 be used only to open system tables (TABLE_CATEGORY_SYSTEM
690 and TABLE_CATEGORY_LOG).
691*/
692
694 public:
695 /**
696 When we backup the open tables state to open a system
697 table or tables, we want to save state of metadata
698 locks which were acquired before the backup. It is used
699 to release metadata locks on system tables after they are
700 no longer used.
701 */
703};
704
705/**
706 Enum that represents which phase of secondary engine optimization
707 the current statement is in.
708*/
710 /**
711 The current statement should only use tables from primary storage
712 engines. Use of secondary storage engines is disabled.
713 */
715
716 /**
717 The current statement should only use tables from the primary
718 storage engine. However, use of secondary storage engines is not
719 disabled, so the optimizer may choose to trigger a repreparation
720 against the secondary storage engine if it believes that use of a
721 secondary storage engine is beneficial.
722 */
724
725 /**
726 The current statement should use tables from a secondary storage
727 engine if possible. Otherwise, fall back to using tables from
728 primary storage engine only.
729 */
730 SECONDARY,
731};
732
733/**
734 @class Sub_statement_state
735 @brief Used to save context when executing a function or trigger
736*/
737
738/* Defines used for Sub_statement_state::in_sub_stmt */
739
740#define SUB_STMT_TRIGGER 1
741#define SUB_STMT_FUNCTION 2
742#define SUB_STMT_DUALITY_VIEW 3
743
745 public:
758};
759
760inline char const *show_system_thread(enum_thread_type thread) {
761#define RETURN_NAME_AS_STRING(NAME) \
762 case (NAME): \
763 return #NAME
764 switch (thread) {
765 static char buf[64];
780 default:
781 sprintf(buf, "<UNKNOWN SYSTEM THREAD: %d>", thread);
782 return buf;
783 }
784#undef RETURN_NAME_AS_STRING
785}
786
787/**
788 Storage engine specific thread local data.
789*/
790
791struct Ha_data {
792 /**
793 Storage engine specific thread local data.
794 Lifetime: one user connection.
795 */
796 void *ha_ptr;
797 /**
798 A memorizer to engine specific "native" transaction object to provide
799 storage engine detach-re-attach facility.
800 The server level transaction object can dissociate from storage engine
801 transactions. The released "native" transaction reference
802 can be hold in the member until it is reconciled later.
803 Lifetime: Depends on caller of @c hton::replace_native_transaction_in_thd.
804 For instance in the case of slave server applier handling XA transaction
805 it is from XA START to XA PREPARE.
806 */
808 /**
809 0: Life time: one statement within a transaction. If @@autocommit is
810 on, also represents the entire transaction.
811 @sa trans_register_ha()
812
813 1: Life time: one transaction within a connection.
814 If the storage engine does not participate in a transaction,
815 this should not be used.
816 @sa trans_register_ha()
817 */
819
820 /**
821 NULL: engine is not bound to this thread
822 non-NULL: engine is bound to this thread, engine shutdown forbidden
823 */
825
827};
828
829/**
830 An instance of the global read lock in a connection.
831 Implemented in lock.cc.
832*/
833
835 public:
840 };
841
843 : m_state(GRL_NONE),
846
847 bool lock_global_read_lock(THD *thd);
848 void unlock_global_read_lock(THD *thd);
849
850 /**
851 Check if this connection can acquire protection against GRL and
852 emit error if otherwise.
853 */
855 if (m_state) {
856 my_error(ER_CANT_UPDATE_WITH_READLOCK, MYF(0));
857 return true;
858 }
859 return false;
860 }
862 bool is_acquired() const { return m_state != GRL_NONE; }
864
865 private:
867 /**
868 In order to acquire the global read lock, the connection must
869 acquire shared metadata lock in GLOBAL namespace, to prohibit
870 all DDL.
871 */
873 /**
874 Also in order to acquire the global read lock, the connection
875 must acquire a shared metadata lock in COMMIT namespace, to
876 prohibit commits.
877 */
879};
880
881extern "C" void my_message_sql(uint error, const char *str, myf MyFlags);
882
883/**
884 This class keeps the context of transactional DDL statements. Currently only
885 CREATE TABLE with START TRANSACTION uses this context.
886*/
888 public:
889 explicit Transactional_ddl_context(THD *thd) : m_thd(thd) {
890 assert(m_thd != nullptr);
891 }
892
894 assert(!m_hton);
895 post_ddl();
896 }
897
898 void init(dd::String_type db, dd::String_type tablename,
899 const handlerton *hton);
900
901 bool inited() { return m_hton != nullptr; }
902
903 void rollback();
904
905 void post_ddl();
906
907 private:
908 // The current thread.
909 THD *m_thd{nullptr};
910
911 // Handlerton pointer to table's engine begin created.
912 const handlerton *m_hton{nullptr};
913
914 // Schema and table name being created.
917};
918
919struct PS_PARAM;
920
922 std::pair<Event_tracking_class, Event_tracking_information *>;
923using Event_tracking_data_stack = std::stack<Event_tracking_data>;
924
925/**
926 Base class for secondary engine statement context objects. Secondary
927 storage engines may create classes derived from this one which
928 contain state they need to preserve in lifecycle of this query.
929*/
931 public:
932 /**
933 Destructs the secondary engine statement context object. It is
934 called after the query execution has completed. Secondary engines
935 may override the destructor in subclasses and add code that
936 performs cleanup tasks that are needed after query execution.
937 */
939
940 virtual bool is_primary_engine_optimal() const { return true; }
941};
942
943/**
944 @class THD
945 For each client connection we create a separate thread with THD serving as
946 a thread/connection descriptor
947*/
948
949class THD : public MDL_context_owner,
950 public Query_arena,
951 public Open_tables_state {
952 public:
953 /**
954 Controlled memory stats for this session.
955 This member is the first in THD,
956 to initialize Thd_mem_cnt() before allocating more memory.
957 */
959
960 private:
961 bool is_stmt_prepare() const = delete;
964 inline bool is_regular() const = delete;
965
966 public:
968
969 /**
970 MARK_COLUMNS_NONE: Means mark_used_columns is not set and no indicator to
971 handler of fields used is set
972 MARK_COLUMNS_READ: Means a bit in read set is set to inform handler
973 that the field is to be read. Update covering_keys
974 and merge_keys too.
975 MARK_COLUMNS_WRITE: Means a bit is set in write set to inform handler
976 that it needs to update this field in write_row
977 and update_row.
978 MARK_COLUMNS_TEMP: Mark bit in read set, but ignore key sets.
979 Used by filesort().
980 */
982 /**
983 Used by Item::check_column_privileges() to tell which privileges
984 to check for.
985 Set to ~0ULL before starting to resolve a statement.
986 Set to desired privilege mask before calling a resolver function that will
987 call Item::check_column_privileges().
988 After use, restore previous value as current value.
989 */
991
992 private:
993 /**
994 The lex to hold the parsed tree of conventional (non-prepared) queries.
995 Whereas for prepared and stored procedure statements we use an own lex
996 instance for each new query, for conventional statements we reuse
997 the same lex. (@see dispatch_sql_command for details).
998 */
999 std::unique_ptr<LEX> main_lex;
1000
1001 public:
1002 LEX *lex; // parse tree descriptor
1003 dd::cache::Dictionary_client *dd_client() const // Get the dictionary client.
1004 {
1005 return m_dd_client.get();
1006 }
1007
1008 private:
1009 std::unique_ptr<dd::cache::Dictionary_client> m_dd_client;
1010
1011 /**
1012 The query associated with this statement.
1013 */
1016 std::atomic<bool> m_safe_to_display;
1017
1018 /**
1019 Currently selected catalog.
1020 */
1021
1023 /**
1024 Name of the current (default) database.
1025
1026 If there is the current (default) database, "db" contains its name. If
1027 there is no current (default) database, "db" is NULL and "db_length" is
1028 0. In other words, "db", "db_length" must either be NULL, or contain a
1029 valid database name.
1030
1031 @note this attribute is set and allocated by the slave SQL thread (for
1032 the THD of that thread); that thread is (and must remain, for now) the
1033 only responsible for freeing this member.
1034 */
1036
1037 /**
1038 Resource group context indicating the current resource group
1039 and the name of the resource group to switch to during execution
1040 of a query.
1041 */
1043
1044 /**
1045 In some cases, we may want to modify the query (i.e. replace
1046 passwords with their hashes before logging the statement etc.).
1047
1048 In case the query was rewritten, the original query will live in
1049 m_query_string, while the rewritten query lives in rewritten_query.
1050 If rewritten_query is empty, m_query_string should be logged.
1051 If rewritten_query is non-empty, the rewritten query it contains
1052 should be used in logs (general log, slow query log, binary log).
1053
1054 Currently, password obfuscation is the only rewriting we do; more
1055 may follow at a later date, both pre- and post parsing of the query.
1056 Rewriting of binloggable statements must preserve all pertinent
1057 information.
1058
1059 Similar restrictions as for m_query_string (see there) hold for locking:
1060 - Value may only be (re)set from owning thread (current_thd)
1061 - Value must be modified using (reset|swap)_rewritten_query().
1062 Doing so will protect the update with LOCK_thd_query.
1063 - The owner (current_thd) may read the value without holding the lock.
1064 - Other threads may read the value, but must hold LOCK_thd_query to do so.
1065 */
1067
1068 /**
1069 Current query's secondary engine statement context.
1070 */
1071 std::unique_ptr<Secondary_engine_statement_context>
1073
1074 /* eligible secondary engine handlerton for this query */
1076
1077 public:
1078 /* Store a thread safe copy of protocol properties. */
1079 enum class cached_properties : int {
1080 NONE = 0, // No properties
1081 IS_ALIVE = 1, // protocol->is_connection_alive()
1082 RW_STATUS = 2, // protocol->get_rw_status()
1083 LAST = 4, // Next unused power of 2.
1084 ALL = (LAST - 1) // Mask selecting all properties.
1085 };
1088
1089 /* Used to execute base64 coded binlog events in MySQL server */
1091 /* Slave applier execution context */
1093
1094 /* Is transaction commit still pending */
1096
1097 /**
1098 The function checks whether the thread is processing queries from binlog,
1099 as automatically generated by mysqlbinlog.
1100
1101 @return true when the thread is a binlog applier
1102 */
1103 bool is_binlog_applier() const {
1104 return rli_fake && variables.pseudo_replica_mode;
1105 }
1106
1107 /**
1108 When the thread is a binlog or slave applier it detaches the engine
1109 ha_data associated with it and memorizes the fact of that.
1110 */
1112
1113 /*
1114 Set secondary_engine_statement_context to new context.
1115 This function assumes existing m_secondary_engine_statement_context is empty,
1116 such that there's only context throughout the query's lifecycle.
1117 */
1119 std::unique_ptr<Secondary_engine_statement_context> context);
1120
1123 }
1124
1126
1129 }
1130
1131 /**
1132 When the thread is a binlog or slave applier it reattaches the engine
1133 ha_data associated with it and memorizes the fact of that.
1134 */
1136
1137 /**
1138 @return true when the current binlog (rli_fake) or slave (rli_slave)
1139 applier thread has detached the engine ha_data,
1140 see @c rpl_detach_engine_ha_data.
1141 @note The detached transaction applier resets a memo
1142 mark at once with this check.
1143 */
1144 bool is_engine_ha_data_detached() const;
1145
1146 /// Iterates over the table and call check_and_registered_engine
1147 /// and emits error for non-composable engines
1148 /// @param[in] table_ref Tables involved in the query
1150
1152 /*
1153 Constant for THD::where initialization in the beginning of every query.
1154
1155 It's needed because we do not save/restore THD::where normally during
1156 primary (non subselect) query execution.
1157 */
1158 static const char *const DEFAULT_WHERE;
1159
1160 /** Additional network instrumentation for the server only. */
1162 /**
1163 Hash for user variables.
1164 User variables are per session,
1165 but can also be monitored outside of the session,
1166 so a lock is needed to prevent race conditions.
1167 Protected by @c LOCK_thd_data.
1168 */
1171 struct rand_struct rand; // used for authentication
1172 struct System_variables variables; // Changeable local variables
1173 struct System_status_var status_var; // Per thread statistic vars
1174 struct System_status_var
1175 *copy_status_var_ptr; // A copy of the statistic vars asof the start of
1176 // the query
1177 struct System_status_var *initial_status_var; /* used by show status */
1178 // has status_var already been added to global_status_var?
1180
1181 /**
1182 Session's connection attributes for the connected client
1183 */
1184 std::vector<char> m_connection_attributes;
1185
1186 /**
1187 Current query cost.
1188 @sa system_status_var::last_query_cost
1189 */
1191
1192 /**
1193 Current query partial plans.
1194 @sa system_status_var::last_query_partial_plans
1195 */
1197
1198 /**
1199 Clear the query costs attributes for the current query.
1200 */
1204 }
1205
1206 /**
1207 Save the current query costs attributes in
1208 the thread session status.
1209 Use this method only after the query execution is completed,
1210 so that
1211 @code SHOW SESSION STATUS like 'last_query_%' @endcode
1212 @code SELECT * from performance_schema.session_status
1213 WHERE VARIABLE_NAME like 'last_query_%' @endcode
1214 actually reports the previous query, not itself.
1215 */
1217 assert(!status_var_aggregated);
1220 }
1221
1222 /**
1223 Clear copy of the status variables.
1224 */
1226
1227 /**
1228 Copy status variables into a structure pointed by the specified pointer and
1229 keep track of the pointer internally.
1230
1231 @param dst_var status variable structure pointer, where internal status
1232 variables are copied into.
1233 */
1235 *dst_var = status_var;
1236 copy_status_var_ptr = dst_var;
1237 }
1238
1239 /**
1240 Copy status variables into a structure pointed by the specified pointer
1241 passed into copy_status_var method call.
1242 */
1244 if (copy_status_var_ptr) {
1245 /* Reset for values at start of next statement */
1247 }
1248 }
1249
1250 THR_LOCK_INFO lock_info; // Locking info of this thread
1251 /**
1252 Protects THD data accessed from other threads.
1253 The attributes protected are:
1254 - thd->is_killable (used by KILL statement and shutdown).
1255 - thd->user_vars (user variables, inspected by monitoring)
1256 Is locked when THD is deleted.
1257 */
1259
1260 /**
1261 Protects THD::m_query_string. No other mutexes should be locked
1262 while having this mutex locked.
1263 */
1265
1266 /**
1267 Protects THD::variables while being updated. This should be taken inside
1268 of LOCK_thd_data and outside of LOCK_global_system_variables.
1269 */
1271
1272#ifndef NDEBUG
1274#endif
1275
1276 /**
1277 Protects THD::m_protocol when it gets removed in x plugin.
1278 */
1280
1281 /**
1282 Protects THD::m_security_ctx from inspection (e.g. by old-style
1283 SHOW PROCESSLIST) while COM_CHANGE_USER changes the context.
1284 */
1286
1287 /**
1288 Protects query plan (SELECT/UPDATE/DELETE's) from being freed/changed
1289 while another thread explains it. Following structures are protected by
1290 this mutex:
1291 THD::Query_plan
1292 Modification_plan
1293 Query_block::join
1294 JOIN::plan_state
1295 Tree of Query_expression after THD::Query_plan was set till
1296 THD::Query_plan cleanup
1297 JOIN_TAB::select->quick
1298 Code that changes objects above should take this mutex.
1299 Explain code takes this mutex to block changes to named structures to
1300 avoid crashes in following functions:
1301 explain_single_table_modification
1302 explain_query
1303 Sql_cmd_explain_other_thread::execute
1304 When doing EXPLAIN CONNECTION:
1305 all explain code assumes that this mutex is already taken.
1306 When doing ordinary EXPLAIN:
1307 the mutex does need to be taken (no need to protect reading my own data,
1308 moreover EXPLAIN CONNECTION can't run on an ordinary EXPLAIN).
1309 */
1310 private:
1312
1313 /**
1314 Keep cached values of "connection alive" and "rw status". Update when
1315 pushing, popping or getting the protocol. Used by
1316 information_schema.processlist to avoid locking mutexes that might
1317 affect performance.
1318 */
1320 std::atomic<uint> m_cached_rw_status;
1321
1322 public:
1323 /// Locks the query plan of this THD
1326
1327 /** All prepared statements of this connection. */
1329 /*
1330 A pointer to the stack frame of handle_one_connection(),
1331 which is called first in the thread for handling a client
1332 */
1333 const char *thread_stack;
1334
1335 /**
1336 @note
1337 Some members of THD (currently 'Statement::db',
1338 'catalog' and 'query') are set and allocated by the slave SQL thread
1339 (for the THD of that thread); that thread is (and must remain, for now)
1340 the only responsible for freeing these 3 members. If you add members
1341 here, and you add code to set them in replication, don't forget to
1342 free_them_and_set_them_to_0 in replication properly. For details see
1343 the 'err:' label of the handle_slave_sql() in sql/slave.cc.
1344
1345 @see handle_slave_sql
1346 */
1347
1350
1353 if (sctx == m_security_ctx) return;
1354
1355 /*
1356 To prevent race conditions arising from concurrent threads executing
1357 I_S.PROCESSLIST, a mutex LOCK_thd_security_ctx safeguards the security
1358 context switch.
1359 */
1361 m_security_ctx = sctx;
1363 }
1365
1366 /**
1367 @note
1368 The optional password validation plugin doesn't have any API for
1369 temporally disable its functionality for a particular session.
1370 To get around this issue we introduce a boolean variable in the THD
1371 which we check before each call to the password validation plugin.
1372 Password validation is invoked from within the authentication plugin
1373 in the generate_authentication_string() method.
1374
1375 @see generate_authentication_string
1376 */
1378
1379 std::unique_ptr<Protocol_text> protocol_text; // Normal protocol
1380 std::unique_ptr<Protocol_binary> protocol_binary; // Binary protocol
1381
1382 const Protocol *get_protocol() const { return m_protocol; }
1383
1385
1387#ifndef NDEBUG
1388 if (current_thd != this) {
1389 /*
1390 When inspecting this thread from monitoring,
1391 the monitoring thread MUST lock LOCK_thd_data,
1392 to be allowed to safely inspect SSL status variables.
1393 */
1395 }
1396#endif
1397 return m_SSL;
1398 }
1399
1400 /**
1401 Asserts that the protocol is of type text or binary and then
1402 returns the m_protocol casted to Protocol_classic. This method
1403 is needed to prevent misuse of pluggable protocols by legacy code
1404 */
1406 assert(is_classic_protocol());
1407 return pointer_cast<const Protocol_classic *>(m_protocol);
1408 }
1409
1411
1412 private:
1413 Protocol *m_protocol; // Current protocol
1414 /**
1415 SSL data attached to this connection.
1416 This is an opaque pointer,
1417 When building with SSL, this pointer is non NULL
1418 only if the connection is using SSL.
1419 When building without SSL, this pointer is always NULL.
1420 The SSL data can be inspected to read per thread
1421 status variables,
1422 and this can be inspected while the thread is running.
1423 */
1424 SSL_handle m_SSL = {nullptr};
1425
1426 public:
1427 /**
1428 Query plan for EXPLAINable commands, should be locked with
1429 LOCK_query_plan before using.
1430 */
1432 private:
1433 THD *const thd;
1434 /// Original sql_command;
1436 /// LEX of topmost statement
1438 /// Query plan for UPDATE/DELETE/INSERT/REPLACE
1440 /// True if query is run in prepared statement
1441 bool is_ps;
1442
1443 explicit Query_plan(const Query_plan &); ///< not defined
1444 Query_plan &operator=(const Query_plan &); ///< not defined
1445
1446 public:
1447 /// Asserts that current_thd has locked this plan, if it does not own it.
1449#ifdef NDEBUG
1450 {}
1451#else
1452 ;
1453#endif
1454
1455 explicit Query_plan(THD *thd_arg)
1456 : thd(thd_arg),
1458 lex(nullptr),
1460 is_ps(false) {
1461 }
1462
1463 /**
1464 Set query plan.
1465
1466 @note This function takes THD::LOCK_query_plan mutex.
1467 */
1468 void set_query_plan(enum_sql_command sql_cmd, LEX *lex_arg, bool ps);
1469
1470 /*
1471 The 4 getters below expect THD::LOCK_query_plan to be already taken
1472 if called from another thread.
1473 */
1476 return sql_command;
1477 }
1478 LEX *get_lex() const {
1480 return lex;
1481 }
1484 return modification_plan;
1485 }
1486 bool is_ps_query() const {
1488 return is_ps;
1489 }
1490 bool is_single_table_plan() const;
1492
1494
1495 const LEX_CSTRING &catalog() const { return m_catalog; }
1496
1498
1499 private:
1501
1502 /*
1503 Points to info-string that we show in SHOW PROCESSLIST
1504 You are supposed to update thd->proc_info only if you have coded
1505 a time-consuming piece that MySQL can get stuck in for a long time.
1506
1507 Set it using the thd_proc_info(THD *thread, const char *message)
1508 macro/function.
1509
1510 This member is accessed and assigned without any synchronization.
1511 Therefore, it may point only to constant (statically
1512 allocated) strings, which memory won't go away over time.
1513 */
1514 const char *m_proc_info;
1515 /**
1516 Return the m_proc_info, possibly using the string of an older
1517 server release, according to @@terminology_use_previous.
1518
1519 @param sysvars Use the value of
1520 @@terminology_use_previous stored in this
1521 System_variables object.
1522
1523 @return The "proc_info", also known as "stage", of this thread.
1524 */
1525 const char *proc_info(const System_variables &sysvars) const;
1526
1527 public:
1528 // See comment in THD::enter_cond about why SUPPRESS_TSAN is needed.
1529 void enter_stage(const PSI_stage_info *stage, PSI_stage_info *old_stage,
1530 const char *calling_func, const char *calling_file,
1531 const unsigned int calling_line) SUPPRESS_TSAN;
1532 const char *proc_info() const { return m_proc_info; }
1533 /**
1534 Return the m_proc_info, possibly using the string of an older
1535 server release, according to
1536 @@session.terminology_use_previous.
1537
1538 @param invoking_thd Use
1539 @@session.terminology_use_previous of this session.
1540
1541 @return The "proc_info", also known as "stage", of this thread.
1542 */
1543 const char *proc_info_session(THD *invoking_thd) const {
1544 return proc_info(invoking_thd->variables);
1545 }
1548
1549 /*
1550 Used in error messages to tell user in what part of MySQL we found an
1551 error. E. g. when where= "having clause", if fix_fields() fails, user
1552 will know that the error was in having clause.
1553 */
1554 const char *where;
1555
1557
1561 /*
1562 A thread can hold named user-level locks. This variable
1563 contains granted tickets if a lock is present. See item_func.cc and
1564 chapter 'Miscellaneous functions', for functions GET_LOCK, RELEASE_LOCK.
1565 */
1568#ifndef NDEBUG
1569 uint dbug_sentry; // watch out for memory corruption
1570#endif
1572 /**
1573 Mutex protecting access to current_mutex and current_cond.
1574 */
1576 /**
1577 The mutex used with current_cond.
1578 @see current_cond
1579 */
1580 std::atomic<mysql_mutex_t *> current_mutex;
1581 /**
1582 Pointer to the condition variable the thread owning this THD
1583 is currently waiting for. If the thread is not waiting, the
1584 value is NULL. Set by THD::enter_cond().
1585
1586 If this thread is killed (shutdown or KILL stmt), another
1587 thread will broadcast on this condition variable so that the
1588 thread can be unstuck.
1589 */
1590 std::atomic<mysql_cond_t *> current_cond;
1591 /**
1592 Condition variable used for waiting by the THR_LOCK.c subsystem.
1593 */
1595
1596 /// @brief Enables ordering in ha_commit_low. Used in binlog::commit
1597 /// @note Additional requirements need to be met
1598 /// in order to invoke commit ordering in ha_commit_low
1599 /// @see is_ha_commit_low_invoking_commit_order
1601
1602 /// @brief Enables ordering in ha_commit_low. Used in binlog::commit
1603 /// @note Additional requirements need to be met
1604 /// in order to invoke commit ordering in ha_commit_low
1605 /// @see is_ha_commit_low_invoking_commit_order
1607
1608 /// @brief Obtains flag indicating whether additional ordering in the
1609 /// ha_commit_low function is enabled. If not, ordering will take place in
1610 /// binlog::commit
1611 /// @details Accessor for the m_is_low_level_commit_ordering_enabled
1612 /// @return When true, ha_commit_low may order this transaction
1614
1615 private:
1616 /// @brief Flag indicating whether additional ordering in the ha_commit_low
1617 /// function is enabled. If disabled, ordering will take place in
1618 /// binlog::commit. It is set up in binlog::commit
1620
1621 /**
1622 Type of current query: COM_STMT_PREPARE, COM_QUERY, etc.
1623 Set from first byte of the packet in do_command()
1624 */
1626
1627 private:
1629
1630 public:
1631 void set_admin_connection(bool admin) { m_is_admin_conn = admin; }
1632 bool is_admin_connection() const { return m_is_admin_conn; }
1633
1636 uint32 file_id; // for LOAD DATA INFILE
1637 /* remote (peer) port */
1639 struct timeval start_time;
1640 struct timeval user_time;
1641 /**
1642 Query start time, expressed in microseconds.
1643 */
1645
1646 private:
1647 /**
1648 Time spent waiting for TABLE locks and DATA locks.
1649 Expressed in microseconds.
1650 */
1652
1653 public:
1655 void inc_lock_usec(ulonglong usec);
1657 top = m_lock_usec;
1658 m_lock_usec = 0;
1659 }
1661
1662 /**
1663 Type of lock to be used for all DML statements, except INSERT, in cases
1664 when lock is not specified explicitly. Set to TL_WRITE or
1665 TL_WRITE_LOW_PRIORITY depending on whether low_priority_updates option is
1666 off or on.
1667 */
1669 /**
1670 Type of lock to be used for INSERT statement if lock is not specified
1671 explicitly. Set to TL_WRITE_CONCURRENT_INSERT or TL_WRITE_LOW_PRIORITY
1672 depending on whether low_priority_updates option is off or on.
1673 */
1675
1676 /* <> 0 if we are inside of trigger or stored function. */
1678
1679 /**
1680 Used by fill_status() to avoid acquiring LOCK_status mutex twice
1681 when this function is called recursively (e.g. queries
1682 that contains SELECT on I_S.GLOBAL_STATUS with subquery on the
1683 same I_S table).
1684 Incremented each time fill_status() function is entered and
1685 decremented each time before it returns from the function.
1686 */
1689
1690 private:
1691 /* container for handler's private per-connection data */
1693
1694 public:
1695 /**
1696 Retrieve Ha_data for a given slot. Each handler has a fixed slot nr.
1697 */
1698 Ha_data *get_ha_data(int slot) { return &ha_data[slot]; }
1699
1700 /**
1701 Copy ha_data into the provided argument. Used by Attachble_transaction.
1702 */
1704 /*
1705 Protect with LOCK_thd_data avoid accessing ha_data while it
1706 is being modified.
1707 */
1708 mysql_mutex_lock(&this->LOCK_thd_data);
1709 *backup = ha_data;
1710 mysql_mutex_unlock(&this->LOCK_thd_data);
1711 }
1712
1713 /**
1714 Restore ha_data from the provided backup copy.
1715 Used by Attachable_Transaction.
1716 */
1719 /*
1720 Protect with LOCK_thd_data to avoid e.g. KILL CONNECTION
1721 reading ha_data while it is being modified.
1722 */
1723 mysql_mutex_lock(&this->LOCK_thd_data);
1724 ha_data = backup;
1725 mysql_mutex_unlock(&this->LOCK_thd_data);
1726 }
1727
1728 /*
1729 Position of first event in Binlog
1730 *after* last event written by this
1731 thread.
1732 */
1734 void set_next_event_pos(const char *_filename, ulonglong _pos);
1735 void clear_next_event_pos();
1736
1737 /*
1738 Ptr to row event extra data to be written to Binlog /
1739 received from Binlog.
1740
1741 */
1743
1745
1746 /**
1747 * @brief Configure size of binlog transaction cache. Used to configure the
1748 * size of an individual cache, normally to a value that differs from the
1749 * default `binlog_cache_size` which controls the size otherwise.
1750 *
1751 * @note Assumes that the binlog cache manager already exist (i.e created
1752 * by call to binlog_setup_trx_data()) and is empty.
1753 *
1754 * @param new_size The new size of cache. Value exceeding
1755 * `max_binlog_cache_size` will be clamped and warning logged. Value must be
1756 * a multiple of IO_SIZE which is the block size for all binlog cache size
1757 * related variables.
1758 *
1759 * @return true if new cache size can't be configured, in that case the cache
1760 * is not usable.
1761 */
1762 bool binlog_configure_trx_cache_size(ulong new_size);
1763
1764 /*
1765 Public interface to write RBR events to the binlog
1766 */
1767 int binlog_write_table_map(TABLE *table, bool is_transactional,
1768 bool binlog_rows_query);
1769 int binlog_write_row(TABLE *table, bool is_transactional,
1770 const uchar *new_data,
1771 const unsigned char *extra_row_info);
1772 int binlog_delete_row(TABLE *table, bool is_transactional,
1773 const uchar *old_data,
1774 const unsigned char *extra_row_info);
1775 int binlog_update_row(TABLE *table, bool is_transactional,
1776 const uchar *old_data, const uchar *new_data,
1777 const uchar *extra_row_info);
1778 void set_server_id(uint32 sid) { server_id = sid; }
1779
1780 /*
1781 Member functions to handle pending event for row-level logging.
1782 */
1783 template <class RowsEventT>
1785 TABLE *table, uint32 serv_id, size_t needed, bool is_transactional,
1786 const unsigned char *extra_row_info, uint32 source_part_id = INT_MAX);
1787 Rows_log_event *binlog_get_pending_rows_event(bool is_transactional) const;
1788 inline int binlog_flush_pending_rows_event(bool stmt_end) {
1789 return (binlog_flush_pending_rows_event(stmt_end, false) ||
1790 binlog_flush_pending_rows_event(stmt_end, true));
1791 }
1792 int binlog_flush_pending_rows_event(bool stmt_end, bool is_transactional);
1793
1794 /**
1795 Determine the binlog format of the current statement.
1796
1797 @retval 0 if the current statement will be logged in statement
1798 format.
1799 @retval nonzero if the current statement will be logged in row
1800 format.
1801 */
1806 }
1807
1808 /**
1809 Determine if binlogging is currently disabled for this session.
1810
1811 There are two ways that binlogging can be disabled:
1812
1813 1. The binary log file is closed (globally). This can happen for
1814 two reasons: either --skip-log-bin was used on the command line,
1815 or a binlog write error happened when binlog_error_action=IGNORE_ERROR.
1816
1817 2. The binary log is disabled on session level. This can happen for
1818 two reasons: either the user has set @@session.sql_log_bin = 0,
1819 or the server code has internally disabled the binary log (by
1820 either setting thd->variables.option_bits &= ~OPTION_BIN_LOG or
1821 creating a Disable_binlog_guard object).
1822
1823 Even if this function returns true and the binary log is disabled,
1824 it is possible that the statement will be written to the binary log,
1825 in the cases where the server has merely temporarily disabled binary
1826 logging.
1827
1828 And even if this function returns false and the binary log is
1829 enabled, it is possible that the statement will not be written to
1830 the binary log, e.g. in case it is a no-op, it fails, it gets rolled
1831 back, or some other session closes the binary log due to a write
1832 error when using binlog_error_action=IGNORE_ERROR.
1833
1834 @retval true The binary log is currently disabled for the statement.
1835
1836 @retval false The binary log is currently enabled for the statement.
1837 */
1839
1840 /**
1841 Determine if binlogging is currently disabled for this session.
1842 If the binary log is disabled for this thread (either by log_bin=0 or
1843 sql_log_bin=0 or by log_replica_updates=0 for a slave thread), then the
1844 statement will not be written to the binary log.
1845
1846 @retval true The binary log is currently disabled for the statement.
1847
1848 @retval false The binary log is currently enabled for the statement.
1849 */
1851
1852 /**
1853 Checks whether binlog caches are disabled (binlog does not cache data) or
1854 empty in case binloggging is enabled in the current call to this function.
1855 This function may be safely called in case binlogging is disabled.
1856 @retval true binlog local caches are empty or disabled and binlogging is
1857 enabled
1858 @retval false binlog local caches are enabled and contain data or binlogging
1859 is disabled
1860 */
1862
1863 /**
1864 Determine if binloging is enabled in row format and write set extraction is
1865 enabled for this session
1866 @retval true if is enable
1867 @retval false otherwise
1868 */
1870
1871 /** Tells whether the given optimizer_switch flag is on */
1873 return (variables.optimizer_switch & flag);
1874 }
1875
1881
1884 }
1885
1889 }
1890
1894 }
1895
1897 return m_binlog_filter_state;
1898 }
1899
1900 /** Holds active timer object */
1902 /**
1903 After resetting(cancelling) timer, current timer object is cached
1904 with timer_cache timer to reuse.
1905 */
1907
1908 private:
1909 /*
1910 Indicates that the command which is under execution should ignore the
1911 'read_only' and 'super_read_only' options.
1912 */
1914
1915 /*
1916 Indicates that the command which is under execution should ignore the
1917 read only transaction mode.
1918 */
1920 /**
1921 Indicate if the current statement should be discarded
1922 instead of written to the binlog.
1923 This is used to discard special statements, such as
1924 DML or DDL that affects only 'local' (non replicated)
1925 tables, such as performance_schema.*
1926 */
1928
1929 /**
1930 Indicates the format in which the current statement will be
1931 logged. This can only be set from @c decide_logging_format().
1932 */
1934
1935 /**
1936 Bit field for the state of binlog warnings.
1937
1938 The first Lex::BINLOG_STMT_UNSAFE_COUNT bits list all types of
1939 unsafeness that the current statement has.
1940
1941 This must be a member of THD and not of LEX, because warnings are
1942 detected and issued in different places (@c
1943 decide_logging_format() and @c binlog_query(), respectively).
1944 Between these calls, the THD->lex object may change; e.g., if a
1945 stored routine is invoked. Only THD persists between the calls.
1946 */
1948
1949 /*
1950 Number of outstanding table maps, i.e., table maps in the
1951 transaction cache.
1952 */
1954 /*
1955 MTS: db names listing to be updated by the query databases
1956 */
1958
1959 /**
1960 The binary log position of the transaction.
1961
1962 The file and position are zero if the current transaction has not
1963 been written to the binary log.
1964
1965 @see set_trans_pos
1966 @see get_trans_pos
1967
1968 @todo Similar information is kept in the patch for BUG#11762277
1969 and by the master/slave heartbeat implementation. We should merge
1970 these positions instead of maintaining three different ones.
1971 */
1972 /**@{*/
1973 const char *m_trans_log_file;
1976 /**@}*/
1977 // NOTE: Ideally those two should be in Protocol,
1978 // but currently its design doesn't allow that.
1979 NET net; // client connection descriptor
1980 String packet; // dynamic buffer for network I/O
1981 public:
1982 const NET *get_net() const { return &net; }
1983
1985 skip_readonly_check = true;
1986 // Make a transaction skip the read only check set via the command
1987 // SET SESSION TRANSACTION READ ONLY
1989 }
1992 }
1994
1997 }
2001 }
2002
2006 }
2007
2008 void issue_unsafe_warnings();
2009
2012
2013 /*
2014 MTS: accessor to binlog_accessed_db_names list
2015 */
2018 }
2019
2020 /* MTS: method inserts a new unique name into binlog_updated_dbs */
2021 void add_to_binlog_accessed_dbs(const char *db);
2022
2023 bool is_applier_thread() const {
2026 }
2027
2028 private:
2029 std::unique_ptr<Transaction_ctx> m_transaction;
2030
2031 /** An utility struct for @c Attachable_trx */
2035 void backup(THD *thd);
2036 void restore(THD *thd);
2037
2038 /// SQL-command.
2040
2042
2043 /// Open-tables state.
2045
2046 /// SQL_MODE.
2048
2049 /// Transaction isolation level.
2051
2052 /// Ha_data array.
2054
2055 /// Transaction_ctx instance.
2057
2058 /// Transaction read-only state.
2060
2061 /// THD options.
2063
2064 /// Current transaction instrumentation.
2066
2067 /// Server status flags.
2069
2070 /// THD::in_lock_tables value.
2072
2073 /**
2074 Current time zone (i.e. @@session.time_zone) usage indicator.
2075
2076 Saving it allows data-dictionary code to read timestamp values
2077 as datetimes from system tables without disturbing user's statement.
2078
2079 TODO: We need to change DD code not to use @@session.time_zone at all and
2080 stick to UTC for internal storage of timestamps in DD objects.
2081 */
2083
2084 /**
2085 Transaction rollback request flag.
2086
2087 InnoDB can try to access table definition while rolling back regular
2088 transaction. So we need to be able to start attachable transaction
2089 without being affected by, and affecting, the rollback state of regular
2090 transaction.
2091 */
2093 };
2094
2095 public:
2097
2098 private:
2099 /**
2100 Class representing read-only attachable transaction, encapsulates
2101 knowledge how to backup state of current transaction, start
2102 read-only attachable transaction in SE, finalize it and then restore
2103 state of original transaction back. Also serves as a base class for
2104 read-write attachable transaction implementation.
2105 */
2107 public:
2108 Attachable_trx(THD *thd, Attachable_trx *prev_trx);
2109 virtual ~Attachable_trx();
2111 return m_prev_attachable_trx;
2112 }
2113 virtual bool is_read_only() const { return true; }
2114
2115 protected:
2116 /// THD instance.
2118
2120
2121 /**
2122 Attachable_trx which was active for the THD before when this
2123 transaction was started (NULL in most cases).
2124 */
2126
2127 /// Transaction state data.
2129
2130 private:
2133 };
2134
2135 /**
2136 A derived from THD::Attachable_trx class allows updates in
2137 the attachable transaction. Callers of the class methods must
2138 make sure the attachable_rw won't cause deadlock with the main transaction.
2139 The destructor does not invoke ha_commit_{stmt,trans} nor ha_rollback_trans
2140 on purpose.
2141 Burden to terminate the read-write instance also lies on the caller!
2142 In order to use this interface it *MUST* prove that no side effect to
2143 the global transaction state can be inflicted by a chosen method.
2144
2145 This class is being used only by class Gtid_table_access_context by
2146 replication and by dd::info_schema::Table_statistics.
2147 */
2148
2150 public:
2151 bool is_read_only() const override { return false; }
2152 explicit Attachable_trx_rw(THD *thd);
2153
2154 private:
2157 };
2158
2160
2161 public:
2163
2164 const Transaction_ctx *get_transaction() const { return m_transaction.get(); }
2165
2166 /**
2167 Changes the Transaction_ctx instance within THD-object. The previous
2168 Transaction_ctx instance is destroyed.
2169
2170 @note this is a THD-internal operation which MUST NOT be used outside.
2171
2172 @param transaction_ctx new Transaction_ctx instance to be associated with
2173 the THD-object.
2174 */
2175 void set_transaction(Transaction_ctx *transaction_ctx);
2176
2178
2179 Vio *active_vio = {nullptr};
2180
2181 /* Active network vio for clone remote connection. */
2182 Vio *clone_vio = {nullptr};
2183
2184 /**
2185 This is used to track transient changes to items during optimization of a
2186 prepared statement/stored procedure. Change objects are created by
2187 change_item_tree() in memory root of THD, and freed by
2188 rollback_item_tree_changes(). Changes recorded here are rolled back at
2189 the end of execution.
2190
2191 Transient changes require the following conditions:
2192 - The statement is not regular (ie. it is prepared or part of SP).
2193 - The change is performed outside preparation code (ie. it is
2194 performed during the optimization phase).
2195 - The change is applied to non-transient items (ie. items that have
2196 been created before or during preparation, not items that have been
2197 created in the optimization phase. Notice that the tree of AND/OR
2198 conditions is always as transient objects during optimization.
2199 Doing this should be quite harmless, though.)
2200 change_item_tree() only records changes to non-regular statements.
2201 It is also ensured that no changes are applied in preparation phase by
2202 asserting that the list of items is empty (see Sql_cmd_dml::prepare()).
2203 Other constraints are not enforced, in particular care must be taken
2204 so that all changes made during optimization to non-transient Items in
2205 non-regular statements must be recorded.
2206 */
2208
2209 /*
2210 A permanent memory area of the statement. For conventional
2211 execution, the parsed tree and execution runtime reside in the same
2212 memory root. In this case stmt_arena points to THD. In case of
2213 a prepared statement or a stored procedure statement, thd->mem_root
2214 conventionally points to runtime memory, and thd->stmt_arena
2215 points to the memory of the PS/SP, where the parsed tree of the
2216 statement resides. Whenever you need to perform a permanent
2217 transformation of a parsed tree, you should allocate new memory in
2218 stmt_arena, to allow correct re-execution of PS/SP.
2219 Note: in the parser, stmt_arena == thd, even for PS/SP.
2220 */
2222
2223 /*
2224 map for tables that will be updated for a multi-table update query
2225 statement, for other query statements, this will be zero.
2226 */
2228
2229 /* Tells if LAST_INSERT_ID(#) was called for the current statement */
2231 /*
2232 ALL OVER THIS FILE, "insert_id" means "*automatically generated* value for
2233 insertion into an auto_increment column".
2234 */
2235 /*
2236 This is the first autogenerated insert id which was *successfully*
2237 inserted by the previous statement (exactly, if the previous statement
2238 didn't successfully insert an autogenerated insert id, then it's the one
2239 of the statement before, etc).
2240 It can also be set by SET LAST_INSERT_ID=# or SELECT LAST_INSERT_ID(#).
2241 It is returned by LAST_INSERT_ID().
2242 */
2244 /*
2245 Variant of the above, used for storing in statement-based binlog. The
2246 difference is that the one above can change as the execution of a stored
2247 function progresses, while the one below is set once and then does not
2248 change (which is the value which statement-based binlog needs).
2249 */
2251 /*
2252 This is the first autogenerated insert id which was *successfully*
2253 inserted by the current statement. It is maintained only to set
2254 first_successful_insert_id_in_prev_stmt when statement ends.
2255 */
2257 /*
2258 We follow this logic:
2259 - when stmt starts, first_successful_insert_id_in_prev_stmt contains the
2260 first insert id successfully inserted by the previous stmt.
2261 - as stmt makes progress, handler::insert_id_for_cur_row changes;
2262 every time get_auto_increment() is called,
2263 auto_inc_intervals_in_cur_stmt_for_binlog is augmented with the
2264 reserved interval (if statement-based binlogging).
2265 - at first successful insertion of an autogenerated value,
2266 first_successful_insert_id_in_cur_stmt is set to
2267 handler::insert_id_for_cur_row.
2268 - when stmt goes to binlog,
2269 auto_inc_intervals_in_cur_stmt_for_binlog is binlogged if
2270 non-empty.
2271 - when stmt ends, first_successful_insert_id_in_prev_stmt is set to
2272 first_successful_insert_id_in_cur_stmt.
2273 */
2274 /*
2275 stmt_depends_on_first_successful_insert_id_in_prev_stmt is set when
2276 LAST_INSERT_ID() is used by a statement.
2277 If it is set, first_successful_insert_id_in_prev_stmt_for_binlog will be
2278 stored in the statement-based binlog.
2279 This variable is CUMULATIVE along the execution of a stored function or
2280 trigger: if one substatement sets it to 1 it will stay 1 until the
2281 function/trigger ends, thus making sure that
2282 first_successful_insert_id_in_prev_stmt_for_binlog does not change anymore
2283 and is propagated to the caller for binlogging.
2284 */
2286 /*
2287 List of auto_increment intervals reserved by the thread so far, for
2288 storage in the statement-based binlog.
2289 Note that its minimum is not first_successful_insert_id_in_cur_stmt:
2290 assuming a table with an autoinc column, and this happens:
2291 INSERT INTO ... VALUES(3);
2292 SET INSERT_ID=3; INSERT IGNORE ... VALUES (NULL);
2293 then the latter INSERT will insert no rows
2294 (first_successful_insert_id_in_cur_stmt == 0), but storing "INSERT_ID=3"
2295 in the binlog is still needed; the list's minimum will contain 3.
2296 This variable is cumulative: if several statements are written to binlog
2297 as one (stored functions or triggers are used) this list is the
2298 concatenation of all intervals reserved by all statements.
2299 */
2301 /* Used by replication and SET INSERT_ID */
2303 /*
2304 There is BUG#19630 where statement-based replication of stored
2305 functions/triggers with two auto_increment columns breaks.
2306 We however ensure that it works when there is 0 or 1 auto_increment
2307 column; our rules are
2308 a) on master, while executing a top statement involving substatements,
2309 first top- or sub- statement to generate auto_increment values wins the
2310 exclusive right to see its values be written to binlog (the write
2311 will be done by the statement or its caller), and the losers won't see
2312 their values be written to binlog.
2313 b) on slave, while replicating a top statement involving substatements,
2314 first top- or sub- statement to need to read auto_increment values from
2315 the master's binlog wins the exclusive right to read them (so the losers
2316 won't read their values from binlog but instead generate on their own).
2317 a) implies that we mustn't backup/restore
2318 auto_inc_intervals_in_cur_stmt_for_binlog.
2319 b) implies that we mustn't backup/restore auto_inc_intervals_forced.
2320
2321 If there are more than 1 auto_increment columns, then intervals for
2322 different columns may mix into the
2323 auto_inc_intervals_in_cur_stmt_for_binlog list, which is logically wrong,
2324 but there is no point in preventing this mixing by preventing intervals
2325 from the secondly inserted column to come into the list, as such
2326 prevention would be wrong too.
2327 What will happen in the case of
2328 INSERT INTO t1 (auto_inc) VALUES(NULL);
2329 where t1 has a trigger which inserts into an auto_inc column of t2, is
2330 that in binlog we'll store the interval of t1 and the interval of t2 (when
2331 we store intervals, soon), then in slave, t1 will use both intervals, t2
2332 will use none; if t1 inserts the same number of rows as on master,
2333 normally the 2nd interval will not be used by t1, which is fine. t2's
2334 values will be wrong if t2's internal auto_increment counter is different
2335 from what it was on master (which is likely). In 5.1, in mixed binlogging
2336 mode, row-based binlogging is used for such cases where two
2337 auto_increment columns are inserted.
2338 */
2342 }
2345 /* It's the first time we read it */
2349 }
2351 }
2358 }
2359
2360 /*
2361 Used by Intvar_log_event::do_apply_event() and by "SET INSERT_ID=#"
2362 (mysqlbinlog). We'll soon add a variant which can take many intervals in
2363 argument.
2364 */
2366 auto_inc_intervals_forced.clear(); // in case of multiple SET INSERT_ID
2367 auto_inc_intervals_forced.append(next_id, ULLONG_MAX, 0);
2368 }
2369
2370 /**
2371 Stores the result of the FOUND_ROWS() function. Set at query end, stable
2372 throughout the query.
2373 */
2375 /**
2376 Dynamic, collected and set also in subqueries. Not stable throughout query.
2377 previous_found_rows is a snapshot of this take at query end making it
2378 stable throughout the next query, see update_previous_found_rows.
2379 */
2381
2382 /*
2383 Indicate if the gtid_executed table is being operated implicitly
2384 within current transaction. This happens because we are inserting
2385 a GTID specified through SET GTID_NEXT by user client or
2386 slave SQL thread/workers.
2387 */
2389 /*
2390 Indicate that a sub-statement is being operated implicitly
2391 within current transaction.
2392 As we don't want that this implicit sub-statement to consume the
2393 GTID of the actual transaction, we set it true at the beginning of
2394 the sub-statement and set it false again after "committing" the
2395 sub-statement.
2396 When it is true, the applier will not save the transaction owned
2397 gtid into mysql.gtid_executed table before transaction prepare, as
2398 it does when binlog is disabled, or binlog is enabled and
2399 log_replica_updates is disabled.
2400 Also the flag is made to defer updates to the slave info table from
2401 intermediate commits by non-atomic DDL.
2402 Rpl_info_table::do_flush_info(), rpl_rli.h::is_atomic_ddl_commit_on_slave()
2403 uses this flag.
2404 */
2406
2407 private:
2408 /**
2409 Stores the result of ROW_COUNT() function.
2410
2411 ROW_COUNT() function is a MySQL extension, but we try to keep it
2412 similar to ROW_COUNT member of the GET DIAGNOSTICS stack of the SQL
2413 standard (see SQL99, part 2, search for ROW_COUNT). Its value is
2414 implementation defined for anything except INSERT, DELETE, UPDATE.
2415
2416 ROW_COUNT is assigned according to the following rules:
2417
2418 - In my_ok():
2419 - for DML statements: to the number of affected rows;
2420 - for DDL statements: to 0.
2421
2422 - In my_eof(): to -1 to indicate that there was a result set.
2423
2424 We derive this semantics from the JDBC specification, where int
2425 java.sql.Statement.getUpdateCount() is defined to (sic) "return the
2426 current result as an update count; if the result is a ResultSet
2427 object or there are no more results, -1 is returned".
2428
2429 - In my_error(): to -1 to be compatible with the MySQL C API and
2430 MySQL ODBC driver.
2431
2432 - For SIGNAL statements: to 0 per WL#2110 specification (see also
2433 sql_signal.cc comment). Zero is used since that's the "default"
2434 value of ROW_COUNT in the Diagnostics Area.
2435 */
2436
2437 longlong m_row_count_func; /* For the ROW_COUNT() function */
2438
2439 public:
2441
2442 inline void set_row_count_func(longlong row_count_func) {
2443 m_row_count_func = row_count_func;
2444 }
2445
2447
2448 private:
2449 /**
2450 Number of rows we actually sent to the client, including "synthetic"
2451 rows in ROLLUP etc.
2452 */
2454
2455 /**
2456 Number of rows read and/or evaluated for a statement. Used for
2457 slow log reporting.
2458
2459 An examined row is defined as a row that is read and/or evaluated
2460 according to a statement condition, including in
2461 create_sort_index(). Rows may be counted more than once, e.g., a
2462 statement including ORDER BY could possibly evaluate the row in
2463 filesort() before reading it for e.g. update.
2464 */
2466
2467 private:
2469
2470 public:
2471 void set_user_connect(USER_CONN *uc);
2472 const USER_CONN *get_user_connect() const { return m_user_connect; }
2473
2476
2478
2480
2482
2484
2485 public:
2487
2489
2491
2494
2504 void inc_status_sort_range();
2506 void inc_status_sort_scan();
2509
2511#if defined(ENABLED_PROFILING)
2512 std::unique_ptr<PROFILING> profiling;
2513#endif
2514
2515 /** Current stage progress instrumentation. */
2517 /** Current statement digest. */
2519 /** Current statement digest token array. */
2520 unsigned char *m_token_array;
2521 /** Top level statement digest. */
2523
2524 /** Current statement instrumentation. */
2526#ifdef HAVE_PSI_STATEMENT_INTERFACE
2527 /** Current statement instrumentation state. */
2529#endif /* HAVE_PSI_STATEMENT_INTERFACE */
2530
2531 /** Current transaction instrumentation. */
2533#ifdef HAVE_PSI_TRANSACTION_INTERFACE
2534 /** Current transaction instrumentation state. */
2536#endif /* HAVE_PSI_TRANSACTION_INTERFACE */
2537
2538 /** Idle instrumentation. */
2540#ifdef HAVE_PSI_IDLE_INTERFACE
2541 /** Idle instrumentation state. */
2543#endif /* HAVE_PSI_IDLE_INTERFACE */
2544 /** True if the server code is IDLE for this connection. */
2546
2547 /*
2548 Id of current query. Statement can be reused to execute several queries
2549 query_id is global in context of the whole MySQL server.
2550 ID is automatically generated from mutex-protected counter.
2551 It's used in handler code for various purposes: to check which columns
2552 from table are necessary for this select, to check if it's necessary to
2553 update auto-updatable fields (like auto_increment and timestamp).
2554 */
2556
2557 /* Statement id is thread-wide. This counter is used to generate ids */
2561 /**
2562 This counter is 32 bit because of the client protocol.
2563
2564 @note It is not meant to be used for my_thread_self(), see @c real_id for
2565 this.
2566
2567 @note Set to reserved_thread_id on initialization. This is a magic
2568 value that is only to be used for temporary THDs not present in
2569 the global THD list.
2570 */
2571 private:
2573
2574 public:
2575 /**
2576 Assign a value to m_thread_id by calling
2577 Global_THD_manager::get_new_thread_id().
2578 */
2579 void set_new_thread_id();
2581
2585
2586 // Check if this THD belongs to a system thread.
2588
2589 // Check if this THD belongs to a dd bootstrap system thread.
2590 bool is_dd_system_thread() const {
2593 }
2594
2595 // Check if this THD belongs to the initialize system thread. The
2596 // initialize thread executes statements that are compiled into the
2597 // server.
2600 }
2601
2602 // Check if this THD is executing statements passed through a init file.
2605 }
2606
2607 // Check if this THD belongs to a bootstrap system thread. Note that
2608 // this thread type may execute statements submitted by the user.
2612 }
2613
2614 // Check if this THD belongs to a server upgrade thread. Server upgrade
2615 // threads execute statements that are compiled into the server.
2618 }
2619
2620 /*
2621 Current or next transaction isolation level.
2622 When a connection is established, the value is taken from
2623 @@session.tx_isolation (default transaction isolation for
2624 the session), which is in turn taken from @@global.tx_isolation
2625 (the global value).
2626 If there is no transaction started, this variable
2627 holds the value of the next transaction's isolation level.
2628 When a transaction starts, the value stored in this variable
2629 becomes "actual".
2630 At transaction commit or rollback, we assign this variable
2631 again from @@session.tx_isolation.
2632 The only statement that can otherwise change the value
2633 of this variable is SET TRANSACTION ISOLATION LEVEL.
2634 Its purpose is to effect the isolation level of the next
2635 transaction in this session. When this statement is executed,
2636 the value in this variable is changed. However, since
2637 this statement is only allowed when there is no active
2638 transaction, this assignment (naturally) only affects the
2639 upcoming transaction.
2640 At the end of the current active transaction the value is
2641 be reset again from @@session.tx_isolation, as described
2642 above.
2643 */
2645 /*
2646 Current or next transaction access mode.
2647 See comment above regarding tx_isolation.
2648 */
2650 /*
2651 Transaction cannot be rolled back must be given priority.
2652 When two transactions conflict inside InnoDB, the one with
2653 greater priority wins.
2654 */
2656 /*
2657 All transactions executed by this thread will have high
2658 priority mode, independent of tx_priority value.
2659 */
2661
2663
2664 // For user variables replication
2666 MEM_ROOT *user_var_events_alloc; /* Allocate above array elements here */
2667
2668 /**
2669 Used by MYSQL_BIN_LOG to maintain the commit queue for binary log
2670 group commit.
2671 */
2673
2674 /**
2675 The member is served for marking a query that CREATEs or ALTERs
2676 a table declared with a TIMESTAMP column as dependent on
2677 @@session.explicit_defaults_for_timestamp.
2678 Is set to true by parser, unset at the end of the query.
2679 Possible marking in checked by binary logger.
2680 */
2682
2683 /**
2684 Functions to set and get transaction position.
2685
2686 These functions are used to set the transaction position for the
2687 transaction written when committing this transaction.
2688 */
2689 /**@{*/
2690 void set_trans_pos(const char *file, my_off_t pos) {
2691 DBUG_TRACE;
2692 assert(((file == nullptr) && (pos == 0)) ||
2693 ((file != nullptr) && (pos != 0)));
2694 if (file) {
2695 DBUG_PRINT("enter", ("file: %s, pos: %llu", file, pos));
2696 // Only the file name should be used, not the full path
2700 assert(strlen(m_trans_log_file) <= FN_REFLEN);
2702 } else {
2703 m_trans_log_file = nullptr;
2704 m_trans_fixed_log_file = nullptr;
2705 }
2706
2707 m_trans_end_pos = pos;
2708 DBUG_PRINT("return",
2709 ("m_trans_log_file: %s, m_trans_fixed_log_file: %s, "
2710 "m_trans_end_pos: %llu",
2712 return;
2713 }
2714
2715 void get_trans_pos(const char **file_var, my_off_t *pos_var) const {
2716 DBUG_TRACE;
2717 if (file_var) *file_var = m_trans_log_file;
2718 if (pos_var) *pos_var = m_trans_end_pos;
2719 DBUG_PRINT("return",
2720 ("file: %s, pos: %llu", file_var ? *file_var : "<none>",
2721 pos_var ? *pos_var : 0));
2722 return;
2723 }
2724
2725 void get_trans_fixed_pos(const char **file_var, my_off_t *pos_var) const {
2726 DBUG_TRACE;
2727 if (file_var) *file_var = m_trans_fixed_log_file;
2728 if (pos_var) *pos_var = m_trans_end_pos;
2729 DBUG_PRINT("return",
2730 ("file: %s, pos: %llu", file_var ? *file_var : "<none>",
2731 pos_var ? *pos_var : 0));
2732 return;
2733 }
2734
2735 /**@}*/
2736
2737 /*
2738 Error code from committing or rolling back the transaction.
2739 */
2748
2749 /*
2750 Define durability properties that engines may check to
2751 improve performance.
2752 */
2754
2755 /*
2756 If checking this in conjunction with a wait condition, please
2757 include a check after enter_cond() if you want to avoid a race
2758 condition. For details see the implementation of awake(),
2759 especially the "broadcast" part.
2760 */
2763 KILL_CONNECTION = ER_SERVER_SHUTDOWN,
2764 KILL_QUERY = ER_QUERY_INTERRUPTED,
2765 KILL_TIMEOUT = ER_QUERY_TIMEOUT,
2766 KILLED_NO_VALUE /* means neither of the states */
2768 std::atomic<killed_state> killed;
2769
2770 /**
2771 Whether we are currently in the execution phase of an EXPLAIN ANALYZE query.
2772 If so, send_kill_message() won't actually set an error; we will add a
2773 warning near the end of the execution instead.
2774 */
2776
2777 /**
2778 When operation on DD tables is in progress then THD is set to kill immune
2779 mode.
2780 This member holds DD_kill_immunizer object created to make DD operations
2781 immune from the kill operations. Member also indicated whether THD is in
2782 kill immune mode or not.
2783 */
2785
2786 /* scramble - random string sent to client on handshake */
2788
2789 /// @todo: slave_thread is completely redundant, we should use 'system_thread'
2790 /// instead /sven
2792
2794
2795 private:
2796 /**
2797 Set to true if execution of the current compound statement
2798 can not continue. In particular, disables activation of
2799 CONTINUE or EXIT handlers of stored routines.
2800 Reset in the end of processing of the current user request, in
2801 @see mysql_reset_thd_for_next_command().
2802 */
2804
2805 public:
2806 /**
2807 Set by a storage engine to request the entire
2808 transaction (that possibly spans multiple engines) to
2809 rollback. Reset in ha_rollback.
2810 */
2812 /**
2813 true if we are in a sub-statement and the current error can
2814 not be safely recovered until we left the sub-statement mode.
2815 In particular, disables activation of CONTINUE and EXIT
2816 handlers inside sub-statements. E.g. if it is a deadlock
2817 error and requires a transaction-wide rollback, this flag is
2818 raised (traditionally, MySQL first has to close all the reads
2819 via @see handler::ha_index_or_rnd_end() and only then perform
2820 the rollback).
2821 Reset to false when we leave the sub-statement mode.
2822 */
2827 /**
2828 True if a slave error. Causes the slave to stop. Not the same
2829 as the statement execution error (is_error()), since
2830 a statement may be expected to return an error, e.g. because
2831 it returned an error on master, and this is OK on the slave.
2832 */
2834
2835 /** is set if some thread specific value(s) used in a statement. */
2837 /**
2838 is set if a statement accesses a temporary table created through
2839 CREATE TEMPORARY TABLE.
2840 */
2843 bool enable_slow_log; /* enable slow log for current statement */
2844 /* set during loop of derived table processing */
2846 // Set while parsing INFORMATION_SCHEMA system views.
2848 // Set while parsing JSON duality view.
2850
2851 /** Current SP-runtime context. */
2855
2856 /** number of name_const() substitutions, see sp_head.cc:subst_spvars() */
2858
2859 /* Used by the sys_var class to store temporary values */
2860 union {
2867
2868 struct {
2869 /*
2870 If true, mysql_bin_log::write(Log_event) call will not write events to
2871 binlog, and maintain 2 below variables instead (use
2872 mysql_bin_log.start_union_events to turn this on)
2873 */
2875 /*
2876 If true, at least one mysql_bin_log::write(Log_event) call has been
2877 made after last mysql_bin_log.start_union_events() call.
2878 */
2880 /*
2881 If true, at least one mysql_bin_log::write(Log_event e), where
2882 e.cache_stmt == true call has been made after last
2883 mysql_bin_log.start_union_events() call.
2884 */
2886
2887 /*
2888 'queries' (actually SP statements) that run under inside this binlog
2889 union have thd->query_id >= first_query_id.
2890 */
2893
2894 /**
2895 Internal parser state.
2896 Note that since the parser is not re-entrant, we keep only one parser
2897 state here. This member is valid only when executing code during parsing.
2898 */
2900
2902
2904
2905 /**
2906 Array of active audit plugins which have been used by this THD.
2907 This list is later iterated to invoke release_thd() on those
2908 plugins.
2909 */
2911 /**
2912 Array of bits indicating which audit classes have already been
2913 added to the list of audit plugins which are currently in use.
2914 */
2916
2917#if defined(ENABLED_DEBUG_SYNC)
2918 /* Debug Sync facility. See debug_sync.cc. */
2919 struct st_debug_sync_control *debug_sync_control;
2920#endif /* defined(ENABLED_DEBUG_SYNC) */
2921
2922 // We don't want to load/unload plugins for unit tests.
2924
2925 /*
2926 Audit API events are generated, when this flag is true. The flag
2927 is initially true, but it can be set false in some cases, e.g.
2928 Session Service's THDs are created with auditing disabled. Auditing
2929 is enabled on EVENT_TRACKING_CONNECTION_CONNECT event.
2930 */
2932
2933 explicit THD(bool enable_plugins = true);
2934
2935 /*
2936 The THD dtor is effectively split in two:
2937 THD::release_resources() and ~THD().
2938
2939 We want to minimize the time we hold LOCK_thd_list,
2940 so when destroying a global thread, do:
2941
2942 thd->release_resources()
2943 Global_THD_manager::get_instance()->remove_thd();
2944 delete thd;
2945 */
2946 ~THD() override;
2947
2948 void release_resources();
2949 /**
2950 @returns true if THD resources are released.
2951 */
2952 bool release_resources_done() const;
2953 /**
2954 Check if THD is being disposed (i.e. m_thd_life_cycle_stage >=
2955 SCHEDULED_FOR_DISPOSAL)
2956
2957 Non-owner thread should acquire LOCK_thd_data to check THD state without
2958 getting into races.
2959
2960 @returns true of THD is being disposed.
2961 */
2962 bool is_being_disposed() const;
2963
2964 private:
2965 /**
2966 Represents life cycle stages of THD instance.
2967 Stage transition in THD clean up:
2968 1. ACTIVE -> ACTIVE_AND_CLEAN
2969
2970 Stage transition in THD disposal:
2971 1. ACTIVE -> SCHEDULED_FOR_DISPOSAL -> CLEANED_UP -> RESOURCES_RELEASED
2972 -> DISPOSED.
2973 2. ACTIVE_AND_CLEAN -> CLEANED_UP -> RESOURCES_RELEASED -> DISPOSED.
2974 */
2981 DISPOSED
2984 enum_thd_life_cycle_stages::ACTIVE};
2985
2986 /**
2987 Set THD in ACTIVE life stage to disposal stage.
2988
2989 To avoid race conditions with non-owner thread checking THD disposal state,
2990 LOCK_thd_data should be acquired before changing THD stage to disposal
2991 stage.
2992 */
2993 void start_disposal();
2994
2995 /**
2996 @returns true if THD is cleaned up.
2997 */
2998 bool is_cleanup_done();
2999 void cleanup(void);
3000
3001 void init(void);
3002
3003 public:
3004 /**
3005 Initialize memory roots necessary for query processing and (!)
3006 pre-allocate memory for it. We can't do that in THD constructor because
3007 there are use cases (acl_init, watcher threads,
3008 killing mysqld) where it's vital to not allocate excessive and not used
3009 memory. Note, that we still don't return error from init_query_mem_roots()
3010 if preallocation fails, we should notice that at the first call to
3011 alloc_root.
3012 */
3013 void init_query_mem_roots();
3014 void cleanup_connection(void);
3015 void cleanup_after_query();
3016 void store_globals();
3017 void restore_globals();
3018
3019 inline void set_active_vio(Vio *vio) {
3021 active_vio = vio;
3023 }
3024
3025 inline void set_ssl(Vio *vio) {
3027 m_SSL = (SSL *)vio->ssl_arg;
3029 }
3030
3031 inline void clear_active_vio() {
3033 active_vio = nullptr;
3034 m_SSL = nullptr;
3036 }
3037
3038 /** Set active clone network Vio for remote clone.
3039 @param[in] vio network vio */
3040 inline void set_clone_vio(Vio *vio) {
3042 clone_vio = vio;
3044 }
3045
3046 /** Clear clone network Vio for remote clone. */
3047 inline void clear_clone_vio() {
3049 clone_vio = nullptr;
3051 }
3052
3053 /** Check if clone network Vio is active. */
3054 inline bool check_clone_vio() {
3056 const bool is_active = (clone_vio != nullptr);
3058 return (is_active);
3059 }
3060
3061 /** Shutdown clone vio, if active. */
3062 void shutdown_clone_vio();
3063
3065
3066 void shutdown_active_vio();
3067 void awake(THD::killed_state state_to_set);
3068
3069 /** Disconnect the associated communication endpoint. */
3070 void disconnect(bool server_shutdown = false);
3071
3073 /* The query can be logged in row format or in statement format. */
3075
3076 /* The query has to be logged in statement format. */
3078
3081
3082 int binlog_query(enum_binlog_query_type qtype, const char *query,
3083 size_t query_len, bool is_trans, bool direct,
3084 bool suppress_use, int errcode);
3085
3086 // Begin implementation of MDL_context_owner interface.
3087
3089 const PSI_stage_info *stage, PSI_stage_info *old_stage,
3090 const char *src_function, const char *src_file,
3091 int src_line) override {
3092 DBUG_TRACE;
3094 /*
3095 Sic: We don't lock LOCK_current_cond here.
3096 If we did, we could end up in deadlock with THD::awake()
3097 which locks current_mutex while LOCK_current_cond is locked.
3098 */
3099 current_mutex = mutex;
3100 current_cond = cond;
3101 enter_stage(stage, old_stage, src_function, src_file, src_line);
3102 return;
3103 }
3104
3105 void exit_cond(const PSI_stage_info *stage, const char *src_function,
3106 const char *src_file, int src_line) override {
3107 DBUG_TRACE;
3108 /*
3109 current_mutex must be unlocked _before_ LOCK_current_cond is
3110 locked (if that would not be the case, you'll get a deadlock if someone
3111 does a THD::awake() on you).
3112 */
3115 current_mutex = nullptr;
3116 current_cond = nullptr;
3118 enter_stage(stage, nullptr, src_function, src_file, src_line);
3119 return;
3120 }
3121
3122 int is_killed() const final { return killed; }
3124 /*
3125 We need to return if this thread can have any commit order waiters
3126 which are still accounted by MDL deadlock detector (even in absence
3127 of any MDL locks). We approximate this check by testing whether
3128 this thread is replication applier. Doing more precise check is going
3129 to be more expensive and possibly racy.
3130 */
3131 return slave_thread;
3132 }
3133
3134 THD *get_thd() override { return this; }
3135
3136 /**
3137 A callback to the server internals that is used to address
3138 special cases of the locking protocol.
3139 Invoked when acquiring an exclusive lock, for each thread that
3140 has a conflicting shared metadata lock.
3141
3142 This function aborts waiting of the thread on a data lock, to make
3143 it notice the pending exclusive lock and back off.
3144
3145 @note This function does not wait for the thread to give away its
3146 locks. Waiting is done outside for all threads at once.
3147
3148 @param ctx_in_use The MDL context owner (thread) to wake up.
3149 @param needs_thr_lock_abort Indicates that to wake up thread
3150 this call needs to abort its waiting
3151 on table-level lock.
3152 */
3153 void notify_shared_lock(MDL_context_owner *ctx_in_use,
3154 bool needs_thr_lock_abort) override;
3155
3156 bool notify_hton_pre_acquire_exclusive(const MDL_key *mdl_key,
3157 bool *victimized) override;
3158
3159 void notify_hton_post_release_exclusive(const MDL_key *mdl_key) override;
3160
3161 /**
3162 Provide thread specific random seed for MDL_context's PRNG.
3163
3164 Note that even if two connections will request seed during handling of
3165 statements which were started at exactly the same time, and thus will
3166 get the same values in PRNG at the start, they will naturally diverge
3167 soon, since calls to PRNG in MDL subsystem are affected by many factors
3168 making process quite random. OTOH the fact that we use time as a seed
3169 gives more randomness and thus better coverage in tests as opposed to
3170 using thread_id for the same purpose.
3171 */
3172 uint get_rand_seed() const override { return (uint)start_utime; }
3173
3174 // End implementation of MDL_context_owner interface.
3175
3176 inline bool is_strict_mode() const {
3177 return (variables.sql_mode &
3179 }
3180 inline const CHARSET_INFO *collation() {
3181 return variables.collation_server ? variables.collation_server
3183 }
3185 time_zone_used = true;
3186 return variables.time_zone;
3187 }
3188 time_t query_start_in_secs() const { return start_time.tv_sec; }
3190 void set_time();
3191 void set_time(const struct timeval *t) {
3192 user_time = *t;
3193 set_time();
3194 }
3195 inline bool is_fsp_truncate_mode() const {
3197 }
3198
3199 /**
3200 Evaluate the current time, and if it exceeds the long-query-time
3201 setting, mark the query as slow.
3202 */
3204
3206
3207 /*
3208 Call when it is clear that the query is ended and we have collected the
3209 right value for current_found_rows. Calling this method makes a snapshot of
3210 that value and makes it ready and stable for subsequent FOUND_ROWS() call
3211 in the next statement.
3212 */
3215 }
3216
3217 /**
3218 Returns true if session is in a multi-statement transaction mode.
3219
3220 OPTION_NOT_AUTOCOMMIT: When autocommit is off, a multi-statement
3221 transaction is implicitly started on the first statement after a
3222 previous transaction has been ended.
3223
3224 OPTION_BEGIN: Regardless of the autocommit status, a multi-statement
3225 transaction can be explicitly started with the statements "START
3226 TRANSACTION", "BEGIN [WORK]", "[COMMIT | ROLLBACK] AND CHAIN", etc.
3227
3228 Note: this doesn't tell you whether a transaction is active.
3229 A session can be in multi-statement transaction mode, and yet
3230 have no active transaction, e.g., in case of:
3231 set \@\@autocommit=0;
3232 set \@a= 3; <-- these statements don't
3233 set transaction isolation level serializable; <-- start an active
3234 flush tables; <-- transaction
3235
3236 I.e. for the above scenario this function returns true, even
3237 though no active transaction has begun.
3238 @sa in_active_multi_stmt_transaction()
3239 */
3241 return variables.option_bits & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN);
3242 }
3243 /**
3244 true if the session is in a multi-statement transaction mode
3245 (@sa in_multi_stmt_transaction_mode()) *and* there is an
3246 active transaction, i.e. there is an explicit start of a
3247 transaction with BEGIN statement, or implicit with a
3248 statement that uses a transactional engine.
3249
3250 For example, these scenarios don't start an active transaction
3251 (even though the server is in multi-statement transaction mode):
3252
3253 @verbatim
3254 set @@autocommit=0;
3255 select * from nontrans_table;
3256 set @var = true;
3257 flush tables;
3258 @endverbatim
3259
3260 Note, that even for a statement that starts a multi-statement
3261 transaction (i.e. select * from trans_table), this
3262 flag won't be set until we open the statement's tables
3263 and the engines register themselves for the transaction
3264 (see trans_register_ha()),
3265 hence this method is reliable to use only after
3266 open_tables() has completed.
3267
3268 Why do we need a flag?
3269 ----------------------
3270 We need to maintain a (at first glance redundant)
3271 session flag, rather than looking at thd->transaction.all.ha_list
3272 because of explicit start of a transaction with BEGIN.
3273
3274 I.e. in case of
3275 BEGIN;
3276 select * from nontrans_t1; <-- in_active_multi_stmt_transaction() is true
3277 */
3280 }
3282 return !stmt_arena->is_stmt_prepare();
3283 }
3284
3286 const char *from, size_t from_length,
3287 const CHARSET_INFO *from_cs, bool report_error = false);
3288
3290
3291 /**
3292 Clear the current error, if any.
3293 We do not clear is_fatal_error or is_fatal_sub_stmt_error since we
3294 assume this is never called if the fatal error is set.
3295 @todo: To silence an error, one should use Internal_error_handler
3296 mechanism. In future this function will be removed.
3297 */
3298 inline void clear_error() {
3299 DBUG_TRACE;
3301 is_slave_error = false;
3302 return;
3303 }
3304
3305 bool is_classic_protocol() const;
3306
3307 /** Return false if connection to client is broken. */
3308 bool is_connected(bool use_cached_connection_alive = false) final;
3309
3310 /** Return the cached protocol rw status. */
3312
3313 /**
3314 Mark the current error as fatal. Warning: this does not
3315 set any error, it sets a property of the error, so must be
3316 followed or prefixed with my_error().
3317 */
3319 bool is_fatal_error() const { return m_is_fatal_error; }
3320 /**
3321 true if there is an error in the error stack.
3322
3323 Please use this method instead of direct access to
3324 net.report_error.
3325
3326 If true, the current (sub)-statement should be aborted.
3327 The main difference between this member and is_fatal_error
3328 is that a fatal error can not be handled by a stored
3329 procedure continue handler, whereas a normal error can.
3330
3331 To raise this flag, use my_error().
3332 */
3333 inline bool is_error() const { return get_stmt_da()->is_error(); }
3334
3335 /// Returns first Diagnostics Area for the current statement.
3337
3338 /// Returns first Diagnostics Area for the current statement.
3339 const Diagnostics_area *get_stmt_da() const { return m_stmt_da; }
3340
3341 /// Returns the second Diagnostics Area for the current statement.
3343 return get_stmt_da()->stacked_da();
3344 }
3345
3346 /**
3347 Returns thread-local Diagnostics Area for parsing.
3348 We need to have a clean DA in case errors or warnings are thrown
3349 during parsing, but we can't just reset the main DA in case we
3350 have a diagnostic statement on our hand that needs the old DA
3351 to answer questions about the previous execution.
3352 Keeping a static per-thread DA for parsing is less costly than
3353 allocating a temporary one for each statement we parse.
3354 */
3356
3357 /**
3358 Returns thread-local Diagnostics Area to be used by query rewrite plugins.
3359 Query rewrite plugins use their own diagnostics area. The reason is that
3360 they are invoked right before and right after parsing, and we don't want
3361 conditions raised by plugins in either statement nor parser DA until we
3362 know which type of statement we have parsed.
3363
3364 @note The diagnostics area is instantiated the first time it is asked for.
3365 */
3368 }
3369
3370 /**
3371 Push the given Diagnostics Area on top of the stack, making
3372 it the new first Diagnostics Area. Conditions in the new second
3373 Diagnostics Area will be copied to the new first Diagnostics Area.
3374
3375 @param da Diagnostics Area to be come the top of
3376 the Diagnostics Area stack.
3377 @param copy_conditions
3378 Copy the conditions from the new second Diagnostics Area
3379 to the new first Diagnostics Area, as per SQL standard.
3380 */
3382 bool copy_conditions = true) {
3383 get_stmt_da()->push_diagnostics_area(this, da, copy_conditions);
3384 m_stmt_da = da;
3385 }
3386
3387 /// Pop the top DA off the Diagnostics Area stack.
3390 }
3391
3392 /**
3393 Inserts the new protocol at the top of the protocol stack, and make it
3394 the current protocol for this thd.
3395
3396 @param protocol Protocol to be inserted.
3397 */
3398 void push_protocol(Protocol *protocol);
3399
3400 template <typename ProtocolClass>
3401 void push_protocol(const std::unique_ptr<ProtocolClass> &protocol) {
3402 push_protocol(protocol.get());
3403 }
3404
3405 /**
3406 Pops the top protocol of the Protocol stack and sets the previous one
3407 as the current protocol.
3408 */
3409 void pop_protocol();
3410
3411 public:
3413 void update_charset();
3414
3415 /**
3416 Record a transient change to a pointer to an Item within another Item.
3417 */
3418 void change_item_tree(Item **place, Item *new_value) {
3419 /* TODO: check for OOM condition here */
3420 if (!stmt_arena->is_regular()) {
3421 DBUG_PRINT("info", ("change_item_tree place %p old_value %p new_value %p",
3422 place, *place, new_value));
3423 nocheck_register_item_tree_change(place, new_value);
3424 }
3425 *place = new_value;
3426 }
3427
3428 /**
3429 Remember that place was updated with new_value so it can be restored
3430 by rollback_item_tree_changes().
3431
3432 @param[in] place the location that will change, and whose old value
3433 we need to remember for restoration
3434 @param[in] new_value new value about to be inserted into *place
3435 */
3436 void nocheck_register_item_tree_change(Item **place, Item *new_value);
3437
3438 /**
3439 Restore locations set by calls to nocheck_register_item_tree_change().
3440 Note that this needs to happen before Item::cleanup is called.
3441 */
3443
3444 /*
3445 Cleanup statement parse state (parse tree, lex) and execution
3446 state after execution of a non-prepared SQL statement.
3447 */
3448 void end_statement();
3449 void send_kill_message() const;
3450
3452 uint add_state_flags);
3456
3457 public:
3458 /**
3459 Start a read-only attachable transaction.
3460 There must be no active attachable transactions (in other words, there can
3461 be only one active attachable transaction at a time).
3462 */
3464
3465 /**
3466 Start a read-write attachable transaction.
3467 All the read-only class' requirements apply.
3468 Additional requirements are documented along the class
3469 declaration.
3470 */
3472
3473 /**
3474 End an active attachable transaction. Applies to both the read-only
3475 and the read-write versions.
3476 Note, that the read-write attachable transaction won't be terminated
3477 inside this method.
3478 To invoke the function there must be active attachable transaction.
3479 */
3481
3482 /**
3483 @return true if there is an active attachable transaction.
3484 */
3486 return m_attachable_trx != nullptr && m_attachable_trx->is_read_only();
3487 }
3488
3489 /**
3490 @return true if there is an active attachable transaction.
3491 */
3493 return m_attachable_trx != nullptr;
3494 }
3495
3496 /**
3497 @return true if there is an active rw attachable transaction.
3498 */
3500 return m_attachable_trx != nullptr && !m_attachable_trx->is_read_only();
3501 }
3502
3503 public:
3504 /*
3505 @todo Make these methods private or remove them completely. Only
3506 decide_logging_format should call them. /Sven
3507 */
3509 DBUG_TRACE;
3510 /*
3511 This should only be called from decide_logging_format.
3512
3513 @todo Once we have ensured this, uncomment the following
3514 statement, remove the big comment below that, and remove the
3515 in_sub_stmt==0 condition from the following 'if'.
3516 */
3517 /* assert(in_sub_stmt == 0); */
3518 /*
3519 If in a stored/function trigger, the caller should already have done the
3520 change. We test in_sub_stmt to prevent introducing bugs where people
3521 wouldn't ensure that, and would switch to row-based mode in the middle
3522 of executing a stored function/trigger (which is too late, see also
3523 reset_current_stmt_binlog_format_row()); this condition will make their
3524 tests fail and so force them to propagate the
3525 lex->binlog_row_based_if_mixed upwards to the caller.
3526 */
3527 if ((variables.binlog_format == BINLOG_FORMAT_MIXED) && (in_sub_stmt == 0))
3529
3530 return;
3531 }
3533 DBUG_TRACE;
3535 return;
3536 }
3538 DBUG_TRACE;
3540 return;
3541 }
3543 DBUG_TRACE;
3544 DBUG_PRINT("debug", ("in_sub_stmt: %d, system_thread: %s", in_sub_stmt != 0,
3546 if (in_sub_stmt == 0) {
3547 if (variables.binlog_format == BINLOG_FORMAT_ROW)
3549 else
3551 }
3552 return;
3553 }
3554
3555 /**
3556 Copies variables.original_commit_timestamp to
3557 ((Slave_worker *)rli_slave)->original_commit_timestamp,
3558 if this is a slave thread.
3559 */
3561
3562 /// Return the value of @@gtid_next_list: either a Gtid_set or NULL.
3564 return variables.gtid_next_list.is_non_null
3565 ? variables.gtid_next_list.gtid_set
3566 : nullptr;
3567 }
3568
3569 /// Return the value of @@gtid_next_list: either a Gtid_set or NULL.
3571 return const_cast<THD *>(this)->get_gtid_next_list();
3572 }
3573
3574 /**
3575 Return true if the statement/transaction cache is currently empty,
3576 false otherwise.
3577
3578 @param is_transactional if true, check the transaction cache.
3579 If false, check the statement cache.
3580 */
3581 bool is_binlog_cache_empty(bool is_transactional) const;
3582
3583 /**
3584 The GTID of the currently owned transaction.
3585
3586 ==== Modes of ownership ====
3587
3588 The following modes of ownership are possible:
3589
3590 - owned_gtid.sidno==0: the thread does not own any transaction.
3591
3592 - owned_gtid.sidno==THD::OWNED_SIDNO_ANONYMOUS(==-2): the thread
3593 owns an anonymous transaction
3594
3595 - owned_gtid.sidno>0 and owned_gtid.gno>0: the thread owns a GTID
3596 transaction.
3597
3598 - (owned_gtid.sidno==THD::OWNED_SIDNO_GTID_SET(==-1): this is
3599 currently not used. It was reserved for the case where multiple
3600 GTIDs are owned (using gtid_next_list). This was one idea to
3601 make GTIDs work with NDB: due to the epoch concept, multiple
3602 transactions can be combined into one in NDB, and therefore a
3603 single transaction on a slave can have multiple GTIDs.)
3604
3605 ==== Life cycle of ownership ====
3606
3607 Generally, transaction ownership starts when the transaction is
3608 assigned its GTID and ends when the transaction commits or rolls
3609 back. On a master (GTID_NEXT=AUTOMATIC), the GTID is assigned
3610 just before binlog flush; on a slave (GTID_NEXT=UUID:NUMBER or
3611 GTID_NEXT=ANONYMOUS) it is assigned before starting the
3612 transaction.
3613
3614 A new client always starts with owned_gtid.sidno=0.
3615
3616 Ownership can be acquired in the following ways:
3617
3618 A1. If GTID_NEXT = 'AUTOMATIC' and GTID_MODE = OFF/OFF_PERMISSIVE:
3619 The thread acquires anonymous ownership in
3620 gtid_state->generate_automatic_gtid called from
3621 MYSQL_BIN_LOG::write_transaction.
3622
3623 A2. If GTID_NEXT = 'AUTOMATIC' and GTID_MODE = ON/ON_PERMISSIVE:
3624 The thread generates the GTID and acquires ownership in
3625 gtid_state->generate_automatic_gtid called from
3626 MYSQL_BIN_LOG::write_transaction.
3627
3628 A3. If GTID_NEXT = 'UUID:NUMBER': The thread acquires ownership in
3629 the following ways:
3630
3631 - In a client, the SET GTID_NEXT statement acquires ownership.
3632
3633 - The slave's analogy to a clients SET GTID_NEXT statement is
3634 Gtid_log_event::do_apply_event. So the slave acquires
3635 ownership in this function.
3636
3637 Note: if the GTID UUID:NUMBER is already included in
3638 GTID_EXECUTED, then the transaction must be skipped (the GTID
3639 auto-skip feature). Thus, ownership is *not* acquired in this
3640 case and owned_gtid.sidno==0.
3641
3642 A4. If GTID_NEXT = 'ANONYMOUS':
3643
3644 - In a client, the SET GTID_NEXT statement acquires ownership.
3645
3646 - In a slave thread, Gtid_log_event::do_apply_event acquires
3647 ownership.
3648
3649 - Contrary to the case of GTID_NEXT='UUID:NUMBER', it is
3650 allowed to execute two transactions in sequence without
3651 changing GTID_NEXT (cf. R1 and R2 below). Both transactions
3652 should be executed as anonymous transactions. But ownership
3653 is released when the first transaction commits. Therefore,
3654 when GTID_NEXT='ANONYMOUS', we also acquire anonymous
3655 ownership when starting to execute a statement, in
3656 gtid_reacquire_ownership_if_anonymous called from
3657 gtid_pre_statement_checks (usually called from
3658 mysql_execute_command).
3659
3660 A5. Slave applier threads start in a special mode, having
3661 GTID_NEXT='NOT_YET_DETERMINED'. This mode cannot be set in a
3662 regular client. When GTID_NEXT=NOT_YET_DETERMINED, the slave
3663 thread is postponing the decision of the value of GTID_NEXT
3664 until it has more information. There are three cases:
3665
3666 - If the first transaction of the relay log has a
3667 Gtid_log_event, then it will set GTID_NEXT=GTID:NUMBER and
3668 acquire GTID ownership in Gtid_log_event::do_apply_event.
3669
3670 - If the first transaction of the relay log has a
3671 Anonymous_gtid_log_event, then it will set
3672 GTID_NEXT=ANONYMOUS and acquire anonymous ownership in
3673 Gtid_log_event::do_apply_event.
3674
3675 - If the relay log was received from a pre-5.7.6 master with
3676 GTID_MODE=OFF (or a pre-5.6 master), then there are neither
3677 Gtid_log_events nor Anonymous_log_events in the relay log.
3678 In this case, the slave sets GTID_NEXT=ANONYMOUS and
3679 acquires anonymous ownership when executing a
3680 Query_log_event (Query_log_event::do_apply_event calls
3681 dispatch_sql_command which calls gtid_pre_statement_checks which
3682 calls gtid_reacquire_ownership_if_anonymous).
3683
3684 Ownership is released in the following ways:
3685
3686 R1. A thread that holds GTID ownership releases ownership at
3687 transaction commit or rollback. If GTID_NEXT=AUTOMATIC, all
3688 is fine. If GTID_NEXT=UUID:NUMBER, the UUID:NUMBER cannot be
3689 used for another transaction, since only one transaction can
3690 have any given GTID. To avoid the user mistake of forgetting
3691 to set back GTID_NEXT, on commit we set
3692 thd->variables.gtid_next.type=UNDEFINED_GTID. Then, any
3693 statement that user tries to execute other than SET GTID_NEXT
3694 will generate an error.
3695
3696 R2. A thread that holds anonymous ownership releases ownership at
3697 transaction commit or rollback. In this case there is no harm
3698 in leaving GTID_NEXT='ANONYMOUS', so
3699 thd->variables.gtid_next.type will remain ANONYMOUS_GTID and
3700 not UNDEFINED_GTID.
3701
3702 There are statements that generate multiple transactions in the
3703 binary log. This includes the following:
3704
3705 M1. DROP TABLE that is used with multiple tables, and the tables
3706 belong to more than one of the following groups: non-temporary
3707 table, temporary transactional table, temporary
3708 non-transactional table. DROP TABLE is split into one
3709 transaction for each of these groups of tables.
3710
3711 M2. DROP DATABASE that fails e.g. because rmdir fails. Then a
3712 single DROP TABLE is generated, which lists all tables that
3713 were dropped before the failure happened. But if the list of
3714 tables is big, and grows over a limit, the statement will be
3715 split into multiple statements.
3716
3717 M3. CREATE TABLE ... SELECT that is logged in row format. Then
3718 the server generates a single CREATE statement, followed by a
3719 BEGIN ... row events ... COMMIT transaction.
3720
3721 M4. A statement that updates both transactional and
3722 non-transactional tables in the same statement, and is logged
3723 in row format. Then it generates one transaction for the
3724 non-transactional row updates, followed by one transaction for
3725 the transactional row updates.
3726
3727 M5. CALL is executed as multiple transactions and logged as
3728 multiple transactions.
3729
3730 The general rules for multi-transaction statements are:
3731
3732 - If GTID_NEXT=AUTOMATIC and GTID_MODE=ON or ON_PERMISSIVE, one
3733 GTID should be generated for each transaction within the
3734 statement. Therefore, ownership must be released after each
3735 commit so that a new GTID can be generated by the next
3736 transaction. Typically mysql_bin_log.commit() is called to
3737 achieve this. (Note that some of these statements are currently
3738 disallowed when GTID_MODE=ON.)
3739
3740 - If GTID_NEXT=AUTOMATIC and GTID_MODE=OFF or OFF_PERMISSIVE, one
3741 Anonymous_gtid_log_event should be generated for each
3742 transaction within the statement. Similar to the case above, we
3743 call mysql_bin_log.commit() and release ownership between
3744 transactions within the statement.
3745
3746 This works for all the special cases M1-M5 except M4. When a
3747 statement writes both non-transactional and transactional
3748 updates to the binary log, both the transaction cache and the
3749 statement cache are flushed within the same call to
3750 flush_thread_caches(THD) from within the binary log group commit
3751 code. At that point we cannot use mysql_bin_log.commit().
3752 Instead we release ownership using direct calls to
3753 gtid_state->release_anonymous_ownership() and
3754 thd->clear_owned_gtids() from binlog_cache_mngr::flush.
3755
3756 - If GTID_NEXT=ANONYMOUS, anonymous ownership must be *preserved*
3757 between transactions within the statement, to prevent that a
3758 concurrent SET GTID_MODE=ON makes it impossible to log the
3759 statement. To avoid that ownership is released if
3760 mysql_bin_log.commit() is called, we set
3761 thd->is_commit_in_middle_of_statement before calling
3762 mysql_bin_log.commit. Note that we must set this flag only if
3763 GTID_NEXT=ANONYMOUS, not if the transaction is anonymous when
3764 GTID_NEXT=AUTOMATIC and GTID_MODE=OFF.
3765
3766 This works for all the special cases M1-M5 except M4. When a
3767 statement writes non-transactional updates in the middle of a
3768 transaction, but keeps some transactional updates in the
3769 transaction cache, then it is not easy to know at the time of
3770 calling mysql_bin_log.commit() whether anonymous ownership needs
3771 to be preserved or not. Instead, we directly check if the
3772 transaction cache is nonempty before releasing anonymous
3773 ownership inside Gtid_state::update_gtids_impl.
3774
3775 - If GTID_NEXT='UUID:NUMBER', it is impossible to log a
3776 multi-transaction statement, since each GTID can only be used by
3777 one transaction. Therefore, an error must be generated in this
3778 case. Errors are generated in different ways for the different
3779 statement types:
3780
3781 - DROP TABLE: we can detect the situation before it happens,
3782 since the table type is known once the tables are opened. So
3783 we generate an error before even executing the statement.
3784
3785 - DROP DATABASE: we can't detect the situation until it is too
3786 late; the tables have already been dropped and we cannot log
3787 anything meaningful. So we don't log at all.
3788
3789 - CREATE TABLE ... SELECT: this is not allowed when
3790 enforce_gtid_consistency is ON; the statement will be
3791 forbidden in is_ddl_gtid_compatible.
3792
3793 - Statements that update both transactional and
3794 non-transactional tables are disallowed when GTID_MODE=ON, so
3795 this normally does not happen. However, it can happen if the
3796 slave uses a different engine type than the master, so that a
3797 statement that updates InnoDB+InnoDB on master updates
3798 InnoDB+MyISAM on slave. In this case the statement will be
3799 forbidden in is_dml_gtid_compatible and will not be allowed to
3800 execute.
3801
3802 - CALL: the second statement will generate an error because
3803 GTID_NEXT is 'undefined'. Note that this situation can only
3804 happen if user does it on purpose: A CALL on master is logged
3805 as multiple statements, so a slave never executes CALL with
3806 GTID_NEXT='UUID:NUMBER'.
3807
3808 Finally, ownership release is suppressed in one more corner case:
3809
3810 C1. Administration statements including OPTIMIZE TABLE, REPAIR
3811 TABLE, or ANALYZE TABLE are written to the binary log even if
3812 they fail. This means that the thread first calls
3813 trans_rollack, and then writes the statement to the binlog.
3814 Rollback normally releases ownership. But ownership must be
3815 kept until writing the binlog. The solution is that these
3816 statements set thd->skip_gtid_rollback=true before calling
3817 trans_rollback, and Gtid_state::update_on_rollback does not
3818 release ownership if the flag is set.
3819
3820 @todo It would probably be better to encapsulate this more, maybe
3821 use Gtid_specification instead of Gtid.
3822 */
3824 static const int OWNED_SIDNO_GTID_SET = -1;
3825 static const int OWNED_SIDNO_ANONYMOUS = -2;
3826
3827 /**
3828 For convenience, this contains the TSID component of the GTID
3829 stored in owned_gtid.
3830 */
3832
3833 /** SE GTID persistence flag types. */
3834 enum Se_GTID_flag : size_t {
3835 /** Pin owned GTID */
3837 /** Cleanup GTID during unpin. */
3839 /** SE would persist GTID for current transaction. */
3841 /** If RESET log in progress. */
3843 /** Explicit request for SE to persist GTID for current transaction. */
3845 /** Max element holding the biset size. */
3848
3849 using Se_GTID_flagset = std::bitset<SE_GTID_MAX>;
3850
3851 /** Flags for SE GTID persistence. */
3853
3854 /** Defer freeing owned GTID and TSID till unpinned. */
3856
3857 /** Unpin and free GTID and TSID. */
3858 void unpin_gtid() {
3860 /* Do any deferred cleanup */
3864 }
3865 }
3866
3867 /** @return true, if single phase XA commit operation. */
3868 bool is_one_phase_commit();
3869
3870 /** Set when binlog reset operation is started. */
3872
3873 /** Cleared after flushing SE logs during binlog reset. */
3875
3876 /** @return true, if binlog reset operation. */
3878
3879 /** Set by SE when it guarantees GTID persistence. */
3881
3882 /** Request SE to persist GTID explicitly. */
3886 }
3887
3888 /** Reset by SE at transaction end after persisting GTID. */
3892 }
3893
3894 /** @return true, if SE persists GTID for current transaction. */
3895 bool se_persists_gtid() const {
3896 DBUG_EXECUTE_IF("disable_se_persists_gtid", return (false););
3897 auto trx = get_transaction();
3898 auto xid_state = trx->xid_state();
3899 /* XA transactions are always persisted by Innodb. */
3900 return (!xid_state->has_state(XID_STATE::XA_NOTR) ||
3902 }
3903
3904 /** @return true, if SE is explicitly set to persists GTID. */
3906 DBUG_EXECUTE_IF("disable_se_persists_gtid", return (false););
3908 }
3909
3910 /** @return true, if external XA transaction is in progress. */
3911 bool is_extrenal_xa() const {
3912 auto trx = get_transaction();
3913 auto xid_state = trx->xid_state();
3914 return !xid_state->has_state(XID_STATE::XA_NOTR);
3915 }
3916
3917#ifdef HAVE_GTID_NEXT_LIST
3918 /**
3919 If this thread owns a set of GTIDs (i.e., GTID_NEXT_LIST != NULL),
3920 then this member variable contains the subset of those GTIDs that
3921 are owned by this thread.
3922 */
3923 Gtid_set owned_gtid_set;
3924#endif
3925
3926 /*
3927 Replication related context.
3928
3929 @todo: move more parts of replication related fields in THD to inside this
3930 class.
3931 */
3933
3935 /* Defer GTID cleanup if pinned. Used for XA transactions where
3936 SE(Innodb) needs to read GTID. */
3939 return;
3940 }
3942#ifdef HAVE_GTID_NEXT_LIST
3943 owned_gtid_set.clear();
3944#else
3945 assert(0);
3946#endif
3947 }
3948 owned_gtid.clear();
3949 owned_tsid.clear();
3950 owned_gtid.dbug_print(nullptr, "set owned_gtid in clear_owned_gtids");
3951 }
3952
3953 /** @return true, if owned GTID is empty or waiting for deferred cleanup. */
3956 return (true);
3957 }
3958 return (owned_gtid.is_empty());
3959 }
3960
3961 /*
3962 There are some statements (like OPTIMIZE TABLE, ANALYZE TABLE and
3963 REPAIR TABLE) that might call trans_rollback_stmt() and also will be
3964 successfully executed and will have to go to the binary log.
3965 For these statements, the skip_gtid_rollback flag must be set to avoid
3966 problems when the statement is executed with a GTID_NEXT set to
3967 ASSIGNED_GTID (like the SQL thread do when applying events from other
3968 server). When this flag is set, a call to gtid_rollback() will do nothing.
3969 */
3971 /*
3972 There are some statements (like DROP DATABASE that fails on rmdir
3973 and gets rewritten to multiple DROP TABLE statements) that may
3974 call trans_commit_stmt() before it has written all statements to
3975 the binlog. When using GTID_NEXT = ANONYMOUS, such statements
3976 should not release ownership of the anonymous transaction until
3977 all statements have been written to the binlog. To prevent that
3978 update_gtid_impl releases ownership, such statements must set this
3979 flag.
3980 */
3982
3983 /*
3984 True while the transaction is executing, if one of
3985 is_ddl_gtid_consistent or is_dml_gtid_consistent returned false.
3986 */
3988
3989 const LEX_CSTRING &db() const { return m_db; }
3990
3991 /**
3992 Set the current database; use deep copy of C-string.
3993
3994 @param new_db the new database name.
3995
3996 Initialize the current database from a NULL-terminated string with
3997 length. If we run out of memory, we free the current database and
3998 return true. This way the user will notice the error as there will be
3999 no current database selected (in addition to the error message set by
4000 malloc).
4001
4002 @note This operation just sets {db, db_length}. Switching the current
4003 database usually involves other actions, like switching other database
4004 attributes including security context. In the future, this operation
4005 will be made private and more convenient interface will be provided.
4006
4007 @return Operation status
4008 @retval false Success
4009 @retval true Out-of-memory error
4010 */
4011 bool set_db(const LEX_CSTRING &new_db);
4012
4013 /**
4014 Set the current database; use shallow copy of C-string.
4015
4016 @param new_db the new database name.
4017
4018 @note This operation just sets {db, db_length}. Switching the current
4019 database usually involves other actions, like switching other database
4020 attributes including security context. In the future, this operation
4021 will be made private and more convenient interface will be provided.
4022 */
4023 void reset_db(const LEX_CSTRING &new_db) {
4024 m_db.str = new_db.str;
4025 m_db.length = new_db.length;
4026#ifdef HAVE_PSI_THREAD_INTERFACE
4027 PSI_THREAD_CALL(set_thread_db)(new_db.str, static_cast<int>(new_db.length));
4028#endif
4029 }
4030 /*
4031 Copy the current database to the argument. Use the current arena to
4032 allocate memory for a deep copy: current database may be freed after
4033 a statement is parsed but before it's executed.
4034 */
4035 bool copy_db_to(char const **p_db, size_t *p_db_length) const {
4036 if (m_db.str == nullptr) {
4037 my_error(ER_NO_DB_ERROR, MYF(0));
4038 return true;
4039 }
4040 *p_db = strmake(m_db.str, m_db.length);
4041 *p_db_length = m_db.length;
4042 return false;
4043 }
4044
4045 bool copy_db_to(char **p_db, size_t *p_db_length) const {
4046 return copy_db_to(const_cast<char const **>(p_db), p_db_length);
4047 }
4048
4050
4051 /**
4052 Get resource group context.
4053
4054 @returns pointer to resource group context.
4055 */
4056
4058 return &m_resource_group_ctx;
4059 }
4060
4061 public:
4062 /**
4063 Save the performance schema thread instrumentation
4064 associated with this user session.
4065 @param psi Performance schema thread instrumentation
4066 */
4067 void set_psi(PSI_thread *psi) { m_psi = psi; }
4068
4069 /**
4070 Read the performance schema thread instrumentation
4071 associated with this user session.
4072 This method is safe to use from a different thread.
4073 */
4074 PSI_thread *get_psi() const { return m_psi; }
4075
4076 private:
4077 /**
4078 Performance schema thread instrumentation for this session.
4079 This member is maintained using atomic operations,
4080 do not access it directly.
4081 @sa set_psi
4082 @sa get_psi
4083 */
4084 std::atomic<PSI_thread *> m_psi;
4085
4086 public:
4088 return m_internal_handler;
4089 }
4090
4091 /**
4092 Add an internal error handler to the thread execution context.
4093 @param handler the exception handler to add
4094 */
4096
4097 private:
4098 /**
4099 Handle a sql condition.
4100 @param sql_errno the condition error number
4101 @param sqlstate the condition sqlstate
4102 @param level the condition level
4103 @param msg the condition message text
4104 @return true if the condition is handled
4105 */
4106 bool handle_condition(uint sql_errno, const char *sqlstate,
4108 const char *msg);
4109
4110 public:
4111 /**
4112 Remove the error handler last pushed.
4113 */
4115
4116 Opt_trace_context opt_trace; ///< optimizer trace of current statement
4117 /**
4118 Raise an exception condition.
4119 @param code the MYSQL_ERRNO error code of the error
4120 */
4121 void raise_error(uint code);
4122
4123 /**
4124 Raise an exception condition, with a formatted message.
4125 @param code the MYSQL_ERRNO error code of the error
4126 */
4127 void raise_error_printf(uint code, ...);
4128
4129 /**
4130 Raise a completion condition (warning).
4131 @param code the MYSQL_ERRNO error code of the warning
4132 */
4133 void raise_warning(uint code);
4134
4135 /**
4136 Raise a completion condition (warning), with a formatted message.
4137 @param code the MYSQL_ERRNO error code of the warning
4138 */
4139 void raise_warning_printf(uint code, ...);
4140
4141 /**
4142 Raise a completion condition (note), with a fixed message.
4143 @param code the MYSQL_ERRNO error code of the note
4144 */
4145 void raise_note(uint code);
4146
4147 /**
4148 Raise an completion condition (note), with a formatted message.
4149 @param code the MYSQL_ERRNO error code of the note
4150 */
4151 void raise_note_printf(uint code, ...);
4152
4153 private:
4154 /*
4155 Only the implementation of the SIGNAL and RESIGNAL statements
4156 is permitted to raise SQL conditions in a generic way,
4157 or to raise them by bypassing handlers (RESIGNAL).
4158 To raise a SQL condition, the code should use the public
4159 raise_error() or raise_warning() methods provided by class THD.
4160 */
4162 friend class Sql_cmd_signal;
4163 friend class Sql_cmd_resignal;
4164 friend void push_warning(THD *thd,
4166 uint code, const char *message_text);
4167 friend void my_message_sql(uint, const char *, myf);
4168
4169 /**
4170 Raise a generic SQL condition. Also calls
4171 mysql_event_tracking_general_notify() unless the condition is handled by a
4172 SQL condition handler.
4173
4174 @param sql_errno the condition error number
4175 @param sqlstate the condition SQLSTATE
4176 @param level the condition level
4177 @param msg the condition message text
4178 @param fatal_error should the fatal_error flag be set?
4179 @return The condition raised, or NULL
4180 */
4181 Sql_condition *raise_condition(uint sql_errno, const char *sqlstate,
4183 const char *msg, bool fatal_error = false);
4184
4185 public:
4186 void set_command(enum enum_server_command command);
4187
4188 inline enum enum_server_command get_command() const { return m_command; }
4189
4190 /**
4191 For safe and protected access to the query string, the following
4192 rules should be followed:
4193 1: Only the owner (current_thd) can set the query string.
4194 This will be protected by LOCK_thd_query.
4195 2: The owner (current_thd) can read the query string without
4196 locking LOCK_thd_query.
4197 3: Other threads must lock LOCK_thd_query before reading
4198 the query string.
4199
4200 This means that write-write conflicts are avoided by LOCK_thd_query.
4201 Read(by owner or other thread)-write(other thread) are disallowed.
4202 Read(other thread)-write(by owner) conflicts are avoided by LOCK_thd_query.
4203 Read(by owner)-write(by owner) won't happen as THD=thread.
4204
4205 We want to keep current_thd out of header files, so the debug assert,
4206 is moved to the .cc file. In optimized mode, we want this getter to
4207 be fast, so we inline it.
4208 */
4209 void debug_assert_query_locked() const;
4210 const LEX_CSTRING &query() const {
4211#ifndef NDEBUG
4213#endif
4214 return m_query_string;
4215 }
4216
4217 /**
4218 The current query in normalized form. The format is intended to be
4219 identical to the digest text of performance_schema, but not limited in
4220 size. In this case the parse tree is traversed as opposed to a (limited)
4221 token buffer. The string is allocated by this Statement and will be
4222 available until the next call to this function or this object is deleted.
4223
4224 @note We have no protection against out-of-memory errors as this function
4225 relies on the Item::print() interface which does not propagate errors.
4226
4227 @return The current query in normalized form.
4228 */
4229 const String normalized_query();
4230
4231 /**
4232 Set query to be displayed in performance schema (threads table etc.). Also
4233 mark the query safe to display for information_schema.process_list.
4234 */
4235 void set_query_for_display(const char *query_arg [[maybe_unused]],
4236 size_t query_length_arg [[maybe_unused]]) {
4237 // Set in pfs events statements table
4239 static_cast<uint>(query_length_arg));
4240#ifdef HAVE_PSI_THREAD_INTERFACE
4241 // Set in pfs threads table
4242 PSI_THREAD_CALL(set_thread_info)
4243 (query_arg, static_cast<uint>(query_length_arg));
4244#endif
4245 set_safe_display(true);
4246 }
4247
4248 /**
4249 Reset query string to be displayed in PFS. Also reset the safety flag
4250 for information_schema.process_list for next query.
4251 */
4253 set_query_for_display(nullptr, 0);
4254 m_safe_to_display.store(false);
4255 }
4256
4257 /** @return true, if safe to display the query string. */
4258 bool safe_to_display() const { return m_safe_to_display.load(); }
4259
4260 /** Set if the query string to be safe to display.
4261 @param[in] safe if it is safe to display query string */
4262 void set_safe_display(bool safe) { m_safe_to_display.store(safe); }
4263
4264 /**
4265 Assign a new value to thd->m_query_string.
4266 Protected with the LOCK_thd_query mutex.
4267 */
4268 void set_query(const char *query_arg, size_t query_length_arg) {
4269 const LEX_CSTRING tmp = {query_arg, query_length_arg};
4270 set_query(tmp);
4271 }
4272 void set_query(LEX_CSTRING query_arg);
4274
4275 /**
4276 Set the rewritten query (with passwords obfuscated etc.) on the THD.
4277 Wraps this in the LOCK_thd_query mutex to protect against race conditions
4278 with SHOW PROCESSLIST inspecting that string.
4279
4280 This uses swap() and therefore "steals" the argument from the caller;
4281 the caller MUST take care not to try to use its own string after calling
4282 this function! This is an optimization for mysql_rewrite_query() so we
4283 don't copy its temporary string (which may get very long, up to
4284 @@max_allowed_packet).
4285
4286 Using this outside of mysql_rewrite_query() is almost certainly wrong;
4287 please check with the runtime team!
4288
4289 @param query_arg The rewritten query to use for slow/bin/general logging.
4290 The value will be released in the caller and MUST NOT
4291 be used there after calling this function.
4292 */
4293 void swap_rewritten_query(String &query_arg);
4294
4295 /**
4296 Get the rewritten query (with passwords obfuscated etc.) from the THD.
4297 If done from a different thread (from the one that the rewritten_query
4298 is set on), the caller must hold LOCK_thd_query while calling this!
4299 */
4300 const String &rewritten_query() const {
4301#ifndef NDEBUG
4303#endif
4304 return m_rewritten_query;
4305 }
4306
4307 /**
4308 Reset thd->m_rewritten_query. Protected with the LOCK_thd_query mutex.
4309 */
4311 if (rewritten_query().length()) {
4312 String empty;
4314 }
4315 }
4316
4317 /**
4318 Assign a new value to thd->query_id.
4319 Protected with the LOCK_thd_data mutex.
4320 */
4321 void set_query_id(query_id_t new_query_id) {
4323 query_id = new_query_id;
4326 }
4327
4328 /**
4329 Assign a new value to open_tables.
4330 Protected with the LOCK_thd_data mutex.
4331 */
4332 void set_open_tables(TABLE *open_tables_arg) {
4334 open_tables = open_tables_arg;
4336 }
4337
4338 /**
4339 Assign a new value to is_killable
4340 Protected with the LOCK_thd_data mutex.
4341 */
4342 void set_is_killable(bool is_killable_arg) {
4344 is_killable = is_killable_arg;
4346 }
4347
4349 assert(locked_tables_mode == LTM_NONE);
4350
4351 if (mode_arg == LTM_LOCK_TABLES) {
4352 /*
4353 When entering LOCK TABLES mode we should set explicit duration
4354 for all metadata locks acquired so far in order to avoid releasing
4355 them till UNLOCK TABLES statement.
4356 We don't do this when entering prelocked mode since sub-statements
4357 don't release metadata locks and restoring status-quo after leaving
4358 prelocking mode gets complicated.
4359 */
4361 }
4362
4363 locked_tables_mode = mode_arg;
4364 }
4366 int decide_logging_format(Table_ref *tables);
4367 /**
4368 is_dml_gtid_compatible() and is_ddl_gtid_compatible() check if the
4369 statement that is about to be processed will safely get a
4370 GTID. Currently, the following cases may lead to errors
4371 (e.g. duplicated GTIDs) and as such are forbidden:
4372
4373 1. DML statements that mix non-transactional updates with
4374 transactional updates.
4375
4376 2. Transactions that use non-transactional tables after
4377 having used transactional tables.
4378
4379 3. CREATE...SELECT statement;
4380
4381 4. CREATE TEMPORARY TABLE or DROP TEMPORARY TABLE within a
4382 transaction
4383
4384 The first two conditions have to be checked in
4385 decide_logging_format, because that's where we know if the table
4386 is transactional or not. These are implemented in
4387 is_dml_gtid_compatible().
4388
4389 The third and fourth conditions have to be checked in
4390 mysql_execute_command because (1) that prevents implicit commit
4391 from being executed if the statement fails; (2) DROP TEMPORARY
4392 TABLE does not invoke decide_logging_format. These are
4393 implemented in is_ddl_gtid_compatible().
4394
4395 In the cases where GTID violations generate errors,
4396 is_ddl_gtid_compatible() needs to be called before the implicit
4397 pre-commit, so that there is no implicit commit if the statement
4398 fails.
4399
4400 In the cases where GTID violations do not generate errors,
4401 is_ddl_gtid_compatible() needs to be called after the implicit
4402 pre-commit, because in these cases the function will increase the
4403 global counter automatic_gtid_violating_transaction_count or
4404 anonymous_gtid_violating_transaction_count. If there is an
4405 ongoing transaction, the implicit commit will commit the
4406 transaction, which will call update_gtids_impl, which should
4407 decrease the counters depending on whether the *old* was violating
4408 GTID-consistency or not. Thus, we should increase the counters
4409 only after the old transaction is committed.
4410
4411 @param some_transactional_table true if the statement updates some
4412 transactional table; false otherwise.
4413
4414 @param some_non_transactional_table true if the statement updates
4415 some non-transactional table; false otherwise.
4416
4417 @param non_transactional_tables_are_tmp true if all updated
4418 non-transactional tables are temporary.
4419
4420 @retval true if the statement is compatible;
4421 @retval false if the statement is not compatible.
4422 */
4423 bool is_dml_gtid_compatible(bool some_transactional_table,
4424 bool some_non_transactional_table,
4425 bool non_transactional_tables_are_tmp);
4428 bool need_binlog_invoker() const { return m_binlog_invoker; }
4429 void get_definer(LEX_USER *definer);
4431 m_invoker_user.str = user->str;
4432 m_invoker_user.length = user->length;
4433 m_invoker_host.str = host->str;
4434 m_invoker_host.length = host->length;
4435 }
4438 bool has_invoker() const { return m_invoker_user.str != nullptr; }
4439
4441
4442 private:
4443 /** The current internal error handler for this thread, or NULL. */
4445
4446 /**
4447 This memory root is used for two purposes:
4448 - for conventional queries, to allocate structures stored in main_lex
4449 during parsing, and allocate runtime data (execution plan, etc.)
4450 during execution.
4451 - for prepared queries, only to allocate runtime data. The parsed
4452 tree itself is reused between executions and thus is stored elsewhere.
4453 */
4456 Diagnostics_area m_parser_da; /**< cf. get_parser_da() */
4459
4461
4462 /**
4463 It will be set TRUE if CURRENT_USER() is called in account management
4464 statements or default definer is set in CREATE/ALTER SP, SF, Event,
4465 TRIGGER or VIEW statements.
4466
4467 Current user will be binlogged into Query_log_event if current_user_used
4468 is true; It will be stored into m_invoker_host and m_invoker_user by SQL
4469 thread.
4470 */
4472
4473 /**
4474 It points to the invoker in the Query_log_event.
4475 SQL thread use it as the default definer in CREATE/ALTER SP, SF, Event,
4476 TRIGGER or VIEW statements or current user in account management
4477 statements if it is not NULL.
4478 */
4481
4482 friend class Protocol_classic;
4483
4484 private:
4485 /**
4486 Optimizer cost model for server operations.
4487 */
4490
4491 public:
4492 /**
4493 Initialize the optimizer cost model.
4494
4495 This function should be called each time a new query is started.
4496 */
4497 void init_cost_model();
4498
4499 /**
4500 Retrieve the optimizer cost model for this connection.
4501 */
4502 const Cost_model_server *cost_model() const;
4503
4506
4507 void syntax_error() { syntax_error(ER_SYNTAX_ERROR); }
4508 void syntax_error(const char *format, ...)
4509 MY_ATTRIBUTE((format(printf, 2, 3)));
4510 void syntax_error(int mysql_errno, ...);
4511
4512 void syntax_error_at(const POS &location) {
4513 syntax_error_at(location, ER_SYNTAX_ERROR);
4514 }
4515 void syntax_error_at(const POS &location, const char *format, ...)
4516 MY_ATTRIBUTE((format(printf, 3, 4)));
4517 void syntax_error_at(const POS &location, int mysql_errno, ...);
4518
4519 void vsyntax_error_at(const POS &location, const char *format, va_list args)
4520 MY_ATTRIBUTE((format(printf, 3, 0)));
4521 void vsyntax_error_at(const char *pos_in_lexer_raw_buffer, const char *format,
4522 va_list args) MY_ATTRIBUTE((format(printf, 3, 0)));
4523
4524 /**
4525 Send name and type of result to client.
4526
4527 Sum fields has table name empty and field_name.
4528
4529 @param list List of items to send to client
4530 @param flags Bit mask with the following functions:
4531 - 1 send number of rows
4532 - 2 send default values
4533 - 4 don't write eof packet
4534
4535 @retval
4536 false ok
4537 @retval
4538 true Error (Note that in this case the error is not sent to the client)
4539 */
4540
4541 bool send_result_metadata(const mem_root_deque<Item *> &list, uint flags);
4542
4543 /**
4544 Send one result set row.
4545
4546 @param row_items a collection of column values for that row
4547
4548 @return Error status.
4549 @retval true Error.
4550 @retval false Success.
4551 */
4552
4553 bool send_result_set_row(const mem_root_deque<Item *> &row_items);
4554
4555 /*
4556 Send the status of the current statement execution over network.
4557
4558 In MySQL, there are two types of SQL statements: those that return
4559 a result set and those that return status information only.
4560
4561 If a statement returns a result set, it consists of 3 parts:
4562 - result set meta-data
4563 - variable number of result set rows (can be 0)
4564 - followed and terminated by EOF or ERROR packet
4565
4566 Once the client has seen the meta-data information, it always
4567 expects an EOF or ERROR to terminate the result set. If ERROR is
4568 received, the result set rows are normally discarded (this is up
4569 to the client implementation, libmysql at least does discard them).
4570 EOF, on the contrary, means "successfully evaluated the entire
4571 result set". Since we don't know how many rows belong to a result
4572 set until it's evaluated, EOF/ERROR is the indicator of the end
4573 of the row stream. Note, that we can not buffer result set rows
4574 on the server -- there may be an arbitrary number of rows. But
4575 we do buffer the last packet (EOF/ERROR) in the Diagnostics_area and
4576 delay sending it till the very end of execution (here), to be able to
4577 change EOF to an ERROR if commit failed or some other error occurred
4578 during the last cleanup steps taken after execution.
4579
4580 A statement that does not return a result set doesn't send result
4581 set meta-data either. Instead it returns one of:
4582 - OK packet
4583 - ERROR packet.
4584 Similarly to the EOF/ERROR of the previous statement type, OK/ERROR
4585 packet is "buffered" in the Diagnostics Area and sent to the client
4586 in the end of statement.
4587
4588 @note This method defines a template, but delegates actual
4589 sending of data to virtual Protocol::send_{ok,eof,error}. This
4590 allows for implementation of protocols that "intercept" ok/eof/error
4591 messages, and store them in memory, etc, instead of sending to
4592 the client.
4593
4594 @pre The Diagnostics Area is assigned or disabled. It can not be empty
4595 -- we assume that every SQL statement or COM_* command
4596 generates OK, ERROR, or EOF status.
4597
4598 @post The status information is encoded to protocol format and sent to the
4599 client.
4600
4601 @return We conventionally return void, since the only type of error
4602 that can happen here is a NET (transport) error, and that one
4603 will become visible when we attempt to read from the NET the
4604 next command.
4605 Diagnostics_area::is_sent is set for debugging purposes only.
4606 */
4607
4608 void send_statement_status();
4609
4610 /**
4611 This is only used by master dump threads.
4612 When the master receives a new connection from a slave with a
4613 UUID (for slave versions >= 5.6)/server_id(for slave versions < 5.6)
4614 that is already connected, it will set this flag true
4615 before killing the old slave connection.
4616 */
4618
4619 /**
4620 Claim all the memory used by the THD object.
4621 This method is to keep memory instrumentation statistics
4622 updated, when an object is transferred across threads.
4623 */
4624 void claim_memory_ownership(bool claim);
4625
4628
4629 /**
4630 Returns the plugin, the thd belongs to.
4631 @return pointer to the plugin id
4632 */
4633 const st_plugin_int *get_plugin() const { return m_plugin; }
4634 /**
4635 Sets the plugin id to the value provided as parameter
4636 @param plugin the id of the plugin the thd belongs to
4637 */
4638 void set_plugin(const st_plugin_int *plugin) { m_plugin = plugin; }
4639#ifndef NDEBUG
4641 void set_tmp_table_seq_id(uint arg) { tmp_table_seq_id = arg; }
4642#endif
4643
4646
4647 private:
4648 /**
4649 Variable to mark if the object is part of a Srv_session object, which
4650 aggregates THD.
4651 */
4653
4654 /// Stores the plugin id it is attached to (if any).
4655 const st_plugin_int *m_plugin{nullptr};
4656
4657 /**
4658 Creating or dropping plugin native table through a plugin service.
4659 This variable enables the DDL command execution from
4660 dd::create_native_table() to be executed without committing the
4661 transaction.
4662 */
4664
4665#ifndef NDEBUG
4666 /**
4667 Sequential number of internal tmp table created in the statement. Useful for
4668 tracking tmp tables when number of them is involved in a query.
4669 */
4671
4672 public:
4673 /*
4674 The member serves to guard against duplicate use of the same xid
4675 at binary logging.
4676 */
4678#endif
4679 private:
4680 /*
4681 Flag set by my_write before waiting for disk space.
4682
4683 This is used by replication to decide if the I/O thread should be
4684 killed or not when stopping the replication threads.
4685
4686 In ordinary STOP REPLICA case, the I/O thread will wait for disk space
4687 or to be killed regardless of this flag value.
4688
4689 In server shutdown case, if this flag is true, the I/O thread will be
4690 signaled with KILL_CONNECTION to abort the waiting, letting the server
4691 to shutdown promptly.
4692 */
4694
4695 public:
4696 /**
4697 Set the waiting_for_disk_space flag.
4698
4699 @param waiting The value to set in the flag.
4700 */
4701 void set_waiting_for_disk_space(bool waiting) {
4702 waiting_for_disk_space = waiting;
4703 }
4704 /**
4705 Returns the current waiting_for_disk_space flag value.
4706 */
4708
4709 bool sql_parser();
4710
4711 /// Enables or disables use of secondary storage engines in this session.
4714 }
4715 /// cleanup all secondary engine relevant members after statement execution.
4717
4718 /**
4719 Can secondary storage engines be used for query execution in
4720 this session?
4721 */
4724 }
4725
4726 /**
4727 Checks if queries in this session can use a secondary storage engine for
4728 execution.
4729
4730 @return true if secondary storage engines can be used in this
4731 session, or false otherwise
4732 */
4734
4735 /// Indicate whether secondary storage engine is forced for this execution
4738 }
4739
4741
4742 private:
4743 /**
4744 This flag tells if a secondary storage engine can be used to
4745 execute a query in this session.
4746 */
4749
4750 /**
4751 Flag that tells whether secondary storage engine is forced for execution.
4752 Notice that use_secondary_engine is not reliable because it may be restored
4753 early.
4754 */
4756
4758
4759 /**
4760 Flag that indicates if the user of current session has SYSTEM_USER privilege
4761 */
4762 std::atomic<bool> m_is_system_user;
4763 /**
4764 Flag that indicates if the user of current session has CONNECTION_ADMIN
4765 privilege
4766 */
4767 std::atomic<bool> m_is_connection_admin;
4768
4769 public:
4770 bool is_system_user();
4771 void set_system_user(bool system_user_flag);
4772
4773 bool is_connection_admin();
4774 void set_connection_admin(bool connection_admin_flag);
4775
4776 public:
4778
4779 /**
4780 Flag to indicate this thread is executing
4781 @ref sys_var::update for a @ref OPT_GLOBAL variable.
4782
4783 This flag imply the thread already holds @ref LOCK_global_system_variables.
4784 Knowing this is required to resolve reentrancy issues
4785 in the system variable code, when callers
4786 read system variable Y while inside an update function
4787 for system variable X.
4788 Executing table io while inside a system variable update function
4789 will indirectly cause this.
4790 @todo Clean up callers and remove m_inside_system_variable_global_update.
4791 */
4793
4794 public:
4795 /** The parameter value bindings for the current query. Allocated on the THD
4796 * memroot. Can be empty */
4798 /** the number of elements in parameters */
4800
4801 public:
4802 /**
4803 Copy session properties that affect table access
4804 from the parent session to the current session.
4805
4806 The following properties:
4807 - the OPTION_BIN_LOG flag,
4808 - the skip_readonly_check flag,
4809 - the transaction isolation (tx_isolation)
4810 are copied from the parent to the current THD.
4811
4812 This is useful to execute an isolated, internal THD session
4813 to access tables, while leaving tables in the parent session
4814 unchanged.
4815
4816 @param thd parent session
4817 */
4821
4824
4825#ifndef NDEBUG
4826 const char *current_key_name;
4830 return (is_error() &&
4831 (get_stmt_da()->mysql_errno() == ER_DA_GLOBAL_CONN_LIMIT ||
4832 get_stmt_da()->mysql_errno() == ER_DA_CONN_LIMIT));
4833 }
4834#endif
4835
4836 public:
4837 bool add_external(unsigned int slot, void *data);
4838 void *fetch_external(unsigned int slot);
4840
4841 private:
4842 std::unordered_map<unsigned int, void *> external_store_;
4843
4844 public:
4845 /* Indicates if we are inside loadable function */
4847
4848 public:
4850 if (!event_tracking_data_.empty()) return event_tracking_data_.top();
4851 return std::make_pair(Event_tracking_class::LAST, nullptr);
4852 }
4853
4855 unsigned long subevent, bool check_audited);
4856 bool event_notify(struct st_mysql_event_generic *event_data);
4859 }
4860
4861 private:
4865
4867
4871
4872 public:
4873 /// Flag indicating whether this session incremented the number of sessions
4874 /// with GTID_NEXT set to AUTOMATIC:tag
4876
4877 /// Count of Regular Statement Handles in use.
4879
4880 /// Increment the owned temptable counter. This is used to find leaked
4881 /// temptable handles during close_connection calls
4883 /// Decrement the owned temptable counter.
4885 /// Return currently owned temptable count.
4887
4888 private:
4889 /** Each THD can open multiple temptables, we create these temptable objects
4890 in the temptable engine. These objects have their lifetime controlled with
4891 create and delete_table calls in the temptable handler. The sql layer is
4892 responsible for calling the create and delete_table functions. We increment
4893 this counter in create, and decrement it in delete_table. This allows us to
4894 detect any situation where we call close_connection which releases the
4895 underlying memory in the temptable engine, before all temptable objects
4896 have been deleted. This way we can react and clean up any temptable objects
4897 before we free the underlying memory. So we can think of the THD as owning
4898 multiple temptable objects in the temptable engine, and we tie the lifetime
4899 of these objects to the lifetime of the THD. In normal operation they
4900 should be deleted before the close_connection call but this enforces
4901 defined behaviour when they aren't.
4902 */
4904};
4905
4906/**
4907 Return lock_tables_mode for secondary engine.
4908 @param cthd thread context
4909 @retval true if lock_tables_mode is on
4910 @retval false, otherwise
4911 */
4912inline bool secondary_engine_lock_tables_mode(const THD &cthd) {
4913 return (cthd.locked_tables_mode == LTM_LOCK_TABLES ||
4915}
4916
4917/** A short cut for thd->get_stmt_da()->set_ok_status(). */
4918void my_ok(THD *thd, ulonglong affected_rows = 0, ulonglong id = 0,
4919 const char *message = nullptr);
4920
4921/** A short cut for thd->get_stmt_da()->set_eof_status(). */
4922void my_eof(THD *thd);
4923
4924bool add_item_to_list(THD *thd, Item *item);
4925
4926/*************************************************************************/
4927
4928/**
4929 Check if engine substitution is allowed in the current thread context.
4930
4931 @param thd thread context
4932 @retval true if engine substitution is allowed
4933 @retval false otherwise
4934*/
4935
4936inline bool is_engine_substitution_allowed(const THD *thd) {
4938}
4939
4940/**
4941 Returns if the user of the session has the SYSTEM_USER privilege or not.
4942
4943 @retval true User has SYSTEM_USER privilege
4944 @retval false Otherwise
4945*/
4946inline bool THD::is_system_user() {
4947 return m_is_system_user.load(std::memory_order_seq_cst);
4948}
4949
4950/**
4951 Sets the system_user flag atomically for the current session.
4952
4953 @param [in] system_user_flag boolean flag that indicates value to set.
4954*/
4955inline void THD::set_system_user(bool system_user_flag) {
4956 m_is_system_user.store(system_user_flag, std::memory_order_seq_cst);
4957}
4958
4959/**
4960 Returns if the user of the session has the CONNECTION_ADMIN privilege or not.
4961
4962 @retval true User has CONNECTION_ADMIN privilege
4963 @retval false Otherwise
4964*/
4966 return m_is_connection_admin.load(std::memory_order_seq_cst);
4967}
4968
4969/**
4970 Sets the connection_admin flag atomically for the current session.
4971
4972 @param [in] connection_admin_flag boolean flag that indicates value to set.
4973*/
4974inline void THD::set_connection_admin(bool connection_admin_flag) {
4975 m_is_connection_admin.store(connection_admin_flag, std::memory_order_seq_cst);
4976}
4977
4978/**
4979 Returns true if xa transactions are detached as part of executing XA PREPARE.
4980*/
4981inline bool is_xa_tran_detached_on_prepare(const THD *thd) {
4982 return thd->variables.xa_detach_on_prepare;
4983}
4984
4985/**
4986 Return if source replication node is older than the given version.
4987 @param thd thread context
4988 @param version version number to compare
4989
4990 @retval true if source version is older
4991 @retval false otherwise
4992 */
4993inline bool is_rpl_source_older(const THD *thd, uint version) {
4994 return thd->is_applier_thread() &&
4995 (thd->variables.original_server_version == UNDEFINED_SERVER_VERSION ||
4996 thd->variables.original_server_version < version);
4997}
4998
4999#endif /* SQL_CLASS_INCLUDED */
app_data_ptr new_data(u_int n, char *val, cons_type consensus)
uint32_t Access_bitmask
Definition: auth_acls.h:34
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:247
int64 query_id_t
Definition: binlog.h:72
API for getting cost estimates for server operations that are not directly related to a table object.
Definition: opt_costmodel.h:54
Stores status of the currently executed statement.
Definition: sql_error.h:270
bool is_error() const
Definition: sql_error.h:367
void reset_diagnostics_area()
Clear this Diagnostics Area.
Definition: sql_error.cc:361
Diagnostics_area * pop_diagnostics_area()
Pop "this" off the Diagnostics Area stack.
Definition: sql_error.cc:643
const Diagnostics_area * stacked_da() const
Returns the Diagnostics Area below the current diagnostics area on the stack.
Definition: sql_error.h:593
void push_diagnostics_area(THD *thd, Diagnostics_area *da, bool copy_conditions)
Push the given Diagnostics Area on top of the stack.
Definition: sql_error.cc:632
List of Discrete_interval objects.
Definition: discrete_interval.h:87
bool append(Discrete_interval *new_interval)
Definition: discrete_interval.h:117
void clear()
Definition: discrete_interval.h:144
Definition: reference_caching_setup.h:109
void refresh_all()
Definition: reference_caching_setup.cc:260
Definition: sql_audit.h:375
An instance of the global read lock in a connection.
Definition: sql_class.h:834
bool can_acquire_protection() const
Check if this connection can acquire protection against GRL and emit error if otherwise.
Definition: sql_class.h:854
MDL_ticket * m_mdl_blocks_commits_lock
Also in order to acquire the global read lock, the connection must acquire a shared metadata lock in ...
Definition: sql_class.h:878
MDL_ticket * m_mdl_global_shared_lock
In order to acquire the global read lock, the connection must acquire shared metadata lock in GLOBAL ...
Definition: sql_class.h:872
enum_grl_state m_state
Definition: sql_class.h:866
bool is_acquired() const
Definition: sql_class.h:862
Global_read_lock()
Definition: sql_class.h:842
enum_grl_state
Definition: sql_class.h:836
@ GRL_ACQUIRED_AND_BLOCKS_COMMIT
Definition: sql_class.h:839
@ GRL_ACQUIRED
Definition: sql_class.h:838
@ GRL_NONE
Definition: sql_class.h:837
Represents a set of GTIDs.
Definition: rpl_gtid.h:1557
void clear()
Removes all gtids from this Gtid_set.
Definition: rpl_gtid_set.cc:276
Either statement transaction or normal transaction - related thread-specific storage engine data.
Definition: transaction_info.h:414
This class represents the interface for internal error handlers.
Definition: error_handler.h:47
A registry for item tree transformations performed during query optimization.
Definition: sql_class.h:535
bool m_cancel
Definition: sql_class.h:546
Item * old_value
Definition: sql_class.h:544
Item_change_record(Item **place, Item *new_value)
Definition: sql_class.h:541
Item ** place
Definition: sql_class.h:543
Item * new_value
Definition: sql_class.h:545
Item_change_record()=default
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:927
Definition: sql_list.h:494
Tables that were locked with LOCK TABLES statement.
Definition: locked_tables_list.h:89
An interface to separate the MDL module from the THD, and the rest of the server code.
Definition: mdl.h:86
Context of the owner of metadata locks.
Definition: mdl.h:1415
void set_explicit_duration_for_all_locks()
Set explicit duration for all locks in the context.
Definition: mdl.cc:4637
Savepoint for MDL context.
Definition: mdl.h:1320
A granted metadata lock.
Definition: mdl.h:988
Table modification plan for JOIN-less statements (update/delete)
Definition: opt_explain.h:82
Storage for backup of Open_tables_state.
Definition: sql_class.h:693
MDL_savepoint mdl_system_tables_svp
When we backup the open tables state to open a system table or tables, we want to save state of metad...
Definition: sql_class.h:702
Class that holds information about tables which were opened and locked by the thread.
Definition: sql_class.h:557
MYSQL_LOCK * lock
Definition: sql_class.h:625
TABLE * open_tables
List of regular tables in use by this thread.
Definition: sql_class.h:604
MYSQL_LOCK * extra_lock
Definition: sql_class.h:632
Open_tables_state()
This constructor initializes Open_tables_state instance which can only be used as backup storage.
Definition: sql_class.h:679
uint state_flags
Definition: sql_class.h:672
void reset_open_tables_state()
Definition: sql_class.cc:665
Reprepare_observer * pop_reprepare_observer()
Definition: sql_class.h:591
void push_reprepare_observer(Reprepare_observer *o)
Definition: sql_class.h:587
enum_flags
Definition: sql_class.h:664
@ BACKUPS_AVAIL
Definition: sql_class.h:665
@ SYSTEM_TABLES
Definition: sql_class.h:666
enum enum_locked_tables_mode locked_tables_mode
Definition: sql_class.h:662
Reprepare_observer * get_reprepare_observer() const
Definition: sql_class.h:582
TABLE * temporary_tables
List of temporary tables used by this thread.
Definition: sql_class.h:610
void reset_reprepare_observers()
Definition: sql_class.h:597
void set_open_tables_state(Open_tables_state *state)
Definition: sql_class.cc:650
Prealloced_array< Reprepare_observer *, 4 > m_reprepare_observers
A stack of Reprepare_observer-instances.
Definition: sql_class.h:579
A per-session context which is always available at any point of execution, because in practice it's a...
Definition: opt_trace_context.h:94
Profiling state for a single THD; contains multiple QUERY_PROFILE objects.
Definition: sql_profile.h:226
Internal state of the parser.
Definition: sql_lexer_parser_state.h:44
Plugin array helper class.
Definition: sql_plugin_ref.h:110
A typesafe replacement for DYNAMIC_ARRAY.
Definition: prealloced_array.h:71
Container for all prepared statements created/used in a connection.
Definition: sql_class.h:483
Prepared_statement_map()
Definition: sql_class.cc:2153
void claim_memory_ownership(bool claim)
Definition: sql_class.cc:2215
Prepared_statement * find_by_name(const LEX_CSTRING &name)
Find prepared statement by name.
Definition: sql_class.cc:2190
int insert(Prepared_statement *statement)
Insert a new statement to the thread-local prepared statement map.
Definition: sql_class.cc:2159
Prepared_statement * m_last_found_statement
Definition: sql_class.h:525
~Prepared_statement_map()
Definition: sql_class.cc:2239
void reset()
Definition: sql_class.cc:2221
void erase(Prepared_statement *statement)
Erase all prepared statements (calls Prepared_statement destructor).
Definition: sql_class.cc:2204
collation_unordered_map< std::string, Prepared_statement * > names_hash
Definition: sql_class.h:524
malloc_unordered_map< ulong, std::unique_ptr< Prepared_statement > > st_hash
Definition: sql_class.h:523
Prepared_statement * find(ulong id)
Find prepared statement by ID.
Definition: sql_class.cc:2195
Prepared_statement: a statement that can contain placeholders.
Definition: sql_prepare.h:150
Definition: protocol_classic.h:242
Definition: protocol_classic.h:54
Class used for the old (MySQL 4.0 protocol).
Definition: protocol_classic.h:220
Definition: protocol.h:33
Definition: sql_class.h:348
enum_state get_state() const
Definition: sql_class.h:411
bool is_stmt_prepare_or_first_stmt_execute() const
Definition: sql_class.h:416
T * memdup_typed(const T *mem)
Definition: sql_class.h:434
enum_state
Definition: sql_class.h:367
@ STMT_INITIALIZED
Definition: sql_class.h:368
@ STMT_ERROR
Definition: sql_class.h:373
@ STMT_REGULAR_EXECUTION
Definition: sql_class.h:371
@ STMT_PREPARED
Definition: sql_class.h:370
@ STMT_INITIALIZED_FOR_SP
Definition: sql_class.h:369
@ STMT_EXECUTED
Definition: sql_class.h:372
bool is_repreparing
To check whether a reprepare operation is active.
Definition: sql_class.h:359
bool is_stmt_prepare() const
Definition: sql_class.h:412
LEX_CSTRING strmake(LEX_CSTRING str)
Definition: sql_class.h:441
void reset_item_list()
Definition: sql_class.h:406
char * mem_strdup(const char *str)
Definition: sql_class.h:437
void free_items()
Definition: sql_class.cc:2117
Item * m_item_list
Definition: sql_class.h:354
void * alloc(size_t size)
Definition: sql_class.h:422
Query_arena(MEM_ROOT *mem_root_arg, enum enum_state state_arg)
Definition: sql_class.h:393
bool is_regular() const
Definition: sql_class.h:420
void set_query_arena(const Query_arena &set)
Copies memory-managing members from set.
Definition: sql_class.cc:2128
char * strmake(const char *str, size_t size) const
Definition: sql_class.h:438
enum_state state
Definition: sql_class.h:390
void set_item_list(Item *item)
Definition: sql_class.h:407
void add_item(Item *item)
Definition: sql_class.cc:2111
void * mem_calloc(size_t size)
Definition: sql_class.h:423
void swap_query_arena(const Query_arena &source, Query_arena *backup)
Copy the current arena to backup and set the current arena to match source
Definition: sql_class.cc:2134
void set_state(enum_state state_arg)
Definition: sql_class.h:410
T * alloc_typed()
Definition: sql_class.h:429
Query_arena()
Definition: sql_class.h:400
Item * item_list() const
Definition: sql_class.h:405
bool is_stmt_prepare_or_first_sp_execute() const
Definition: sql_class.h:413
void * memdup(const void *str, size_t size)
Definition: sql_class.h:447
MEM_ROOT * mem_root
Definition: sql_class.h:357
virtual ~Query_arena()=default
Definition: query_result.h:60
Definition: sql_lex.h:2760
Definition: rpl_rli.h:206
An interface that is used to take an action when the locking module notices that a table version has ...
Definition: sql_prepare.h:80
Common base class for all row-containing log events.
Definition: log_event.h:2785
Definition: rpl_context.h:411
Base class for secondary engine statement context objects.
Definition: sql_class.h:930
virtual bool is_primary_engine_optimal() const
Definition: sql_class.h:940
virtual ~Secondary_engine_statement_context()=default
Destructs the secondary engine statement context object.
A set of THD members describing the current authenticated user.
Definition: sql_security_ctx.h:54
Definition: sys_vars_resource_mgr.h:70
Definition: session_tracker.h:129
Sql_cmd_common_signal represents the common properties of the SIGNAL and RESIGNAL statements.
Definition: sql_signal.h:88
Sql_cmd_resignal represents a RESIGNAL statement.
Definition: sql_signal.h:168
Sql_cmd_signal represents a SIGNAL statement.
Definition: sql_signal.h:148
Representation of a SQL condition.
Definition: sql_error.h:59
enum_severity_level
Enumeration value describing the severity of the condition.
Definition: sql_error.h:64
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:169
Used to save context when executing a function or trigger.
Definition: sql_class.h:744
ulonglong option_bits
Definition: sql_class.h:746
bool enable_slow_log
Definition: sql_class.h:755
ulong client_capabilities
Definition: sql_class.h:753
ulonglong first_successful_insert_id_in_cur_stmt
Definition: sql_class.h:748
ha_rows examined_row_count
Definition: sql_class.h:752
SAVEPOINT * savepoints
Definition: sql_class.h:756
ulonglong current_found_rows
Definition: sql_class.h:750
ha_rows sent_row_count
Definition: sql_class.h:752
ulonglong previous_found_rows
Definition: sql_class.h:751
enum enum_check_fields check_for_truncated_fields
Definition: sql_class.h:757
Discrete_intervals_list auto_inc_intervals_forced
Definition: sql_class.h:749
ha_rows num_truncated_fields
Definition: sql_class.h:752
uint in_sub_stmt
Definition: sql_class.h:754
ulonglong first_successful_insert_id_in_prev_stmt
Definition: sql_class.h:747
A derived from THD::Attachable_trx class allows updates in the attachable transaction.
Definition: sql_class.h:2149
bool is_read_only() const override
Definition: sql_class.h:2151
Attachable_trx_rw(const Attachable_trx_rw &)
Attachable_trx_rw & operator=(const Attachable_trx_rw &)
Attachable_trx_rw(THD *thd)
Definition: sql_class.cc:580
Class representing read-only attachable transaction, encapsulates knowledge how to backup state of cu...
Definition: sql_class.h:2106
THD * m_thd
THD instance.
Definition: sql_class.h:2117
Transaction_state m_trx_state
Transaction state data.
Definition: sql_class.h:2128
virtual ~Attachable_trx()
Definition: sql_class.cc:536
Attachable_trx * m_prev_attachable_trx
Attachable_trx which was active for the THD before when this transaction was started (NULL in most ca...
Definition: sql_class.h:2125
Attachable_trx(THD *thd, Attachable_trx *prev_trx)
Definition: sql_class.cc:441
virtual bool is_read_only() const
Definition: sql_class.h:2113
enum_reset_lex m_reset_lex
Definition: sql_class.h:2119
Attachable_trx * get_prev_attachable_trx() const
Definition: sql_class.h:2110
Attachable_trx(const Attachable_trx &)
Attachable_trx & operator=(const Attachable_trx &)
Query plan for EXPLAINable commands, should be locked with LOCK_query_plan before using.
Definition: sql_class.h:1431
void set_query_plan(enum_sql_command sql_cmd, LEX *lex_arg, bool ps)
Set query plan.
Definition: sql_class.cc:2784
void assert_plan_is_locked_if_other() const
Asserts that current_thd has locked this plan, if it does not own it.
Definition: sql_class.cc:2779
bool is_single_table_plan() const
Definition: sql_class.cc:3126
THD *const thd
Definition: sql_class.h:1433
Query_plan & operator=(const Query_plan &)
not defined
Query_plan(const Query_plan &)
not defined
bool is_ps_query() const
Definition: sql_class.h:1486
LEX * lex
LEX of topmost statement.
Definition: sql_class.h:1437
bool is_ps
True if query is run in prepared statement.
Definition: sql_class.h:1441
const Modification_plan * modification_plan
Query plan for UPDATE/DELETE/INSERT/REPLACE.
Definition: sql_class.h:1439
Modification_plan const * get_modification_plan() const
Definition: sql_class.h:1482
enum_sql_command get_command() const
Definition: sql_class.h:1474
LEX * get_lex() const
Definition: sql_class.h:1478
Query_plan(THD *thd_arg)
Definition: sql_class.h:1455
enum_sql_command sql_command
Original sql_command;.
Definition: sql_class.h:1435
void set_modification_plan(Modification_plan *plan_arg)
Definition: sql_class.cc:2800
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
bool is_being_disposed() const
Check if THD is being disposed (i.e.
Definition: sql_class.cc:1412
enum_vio_type get_vio_type() const
Definition: sql_class.cc:2029
std::atomic< mysql_cond_t * > current_cond
Pointer to the condition variable the thread owning this THD is currently waiting for.
Definition: sql_class.h:1590
bool has_gtid_consistency_violation
Definition: sql_class.h:3987
std::unique_ptr< Secondary_engine_statement_context > m_secondary_engine_statement_context
Current query's secondary engine statement context.
Definition: sql_class.h:1072
friend void my_message_sql(uint, const char *, myf)
All global error messages are sent here where the first one is stored for the client.
Definition: mysqld.cc:3964
Rpl_thd_context rpl_thd_ctx
Definition: sql_class.h:3932
struct THD_timer_info * timer
Holds active timer object.
Definition: sql_class.h:1901
void notify_hton_post_release_exclusive(const MDL_key *mdl_key) override
Notify interested storage engines that we have just released exclusive lock for the key.
Definition: sql_class.cc:3153
uint fill_variables_recursion_level
Definition: sql_class.h:1688
thd_scheduler scheduler
Definition: sql_class.h:4049
ulonglong first_successful_insert_id_in_prev_stmt_for_binlog
Definition: sql_class.h:2250
mysql_mutex_t LOCK_thd_query
Protects THD::m_query_string.
Definition: sql_class.h:1264
PSI_statement_locker * m_statement_psi
Current statement instrumentation.
Definition: sql_class.h:2525
std::unique_ptr< dd::cache::Dictionary_client > m_dd_client
Definition: sql_class.h:1009
void disconnect(bool server_shutdown=false)
Disconnect the associated communication endpoint.
Definition: sql_class.cc:1717
bool m_is_admin_conn
Definition: sql_class.h:1628
PSI_transaction_locker_state m_transaction_state
Current transaction instrumentation state.
Definition: sql_class.h:2535
PSI_stage_progress * m_stage_progress_psi
Current stage progress instrumentation.
Definition: sql_class.h:2516
std::atomic< bool > m_is_system_user
Flag that indicates if the user of current session has SYSTEM_USER privilege.
Definition: sql_class.h:4762
void cleanup_connection(void)
Definition: sql_class.cc:1248
Gtid owned_gtid
The GTID of the currently owned transaction.
Definition: sql_class.h:3823
sql_digest_state * m_digest
Current statement digest.
Definition: sql_class.h:2518
Diagnostics_area m_query_rewrite_plugin_da
Definition: sql_class.h:4457
void clear_binlog_local_stmt_filter()
Definition: sql_class.h:1886
struct System_status_var * initial_status_var
Definition: sql_class.h:1177
ulonglong first_successful_insert_id_in_cur_stmt
Definition: sql_class.h:2256
void store_globals()
Definition: sql_class.cc:1788
Secondary_engine_optimization m_secondary_engine_optimization
This flag tells if a secondary storage engine can be used to execute a query in this session.
Definition: sql_class.h:4747
void push_lock_usec(ulonglong &top)
Definition: sql_class.h:1656
rpl_event_coordinates binlog_next_event_pos
Definition: sql_class.h:1733
void reset_n_backup_open_tables_state(Open_tables_backup *backup, uint add_state_flags)
Definition: sql_class.cc:2283
void claim_memory_ownership(bool claim)
Claim all the memory used by the THD object.
Definition: sql_class.cc:3032
std::atomic< uint > m_cached_rw_status
Definition: sql_class.h:1320
void inc_status_select_range()
Definition: sql_class.cc:2521
void set_row_count_func(longlong row_count_func)
Definition: sql_class.h:2442
std::unordered_map< unsigned int, void * > external_store_
Definition: sql_class.h:4842
bool is_a_srv_session() const
Definition: sql_class.h:4626
void set_catalog(const LEX_CSTRING &catalog)
Definition: sql_class.h:1497
void clear_binlog_table_maps()
Definition: sql_class.h:2011
void enable_low_level_commit_ordering()
Enables ordering in ha_commit_low.
Definition: sql_class.cc:3111
void unlock_query_plan()
Definition: sql_class.h:1325
void get_trans_pos(const char **file_var, my_off_t *pos_var) const
Definition: sql_class.h:2715
void rpl_detach_engine_ha_data()
When the thread is a binlog or slave applier it detaches the engine ha_data associated with it and me...
Definition: sql_class.cc:3066
uint fill_status_recursion_level
Used by fill_status() to avoid acquiring LOCK_status mutex twice when this function is called recursi...
Definition: sql_class.h:1687
longlong m_row_count_func
Stores the result of ROW_COUNT() function.
Definition: sql_class.h:2437
unsigned long bind_parameter_values_count
the number of elements in parameters
Definition: sql_class.h:4799
bool is_current_stmt_binlog_disabled() const
Determine if binlogging is currently disabled for this session.
Definition: sql_class.cc:3092
PS_PARAM * bind_parameter_values
The parameter value bindings for the current query.
Definition: sql_class.h:4797
static const int OWNED_SIDNO_GTID_SET
Definition: sql_class.h:3824
Discrete_intervals_list auto_inc_intervals_forced
Definition: sql_class.h:2302
void set_psi(PSI_thread *psi)
Save the performance schema thread instrumentation associated with this user session.
Definition: sql_class.h:4067
bool add_external(unsigned int slot, void *data)
Definition: sql_class.cc:3362
void request_persist_gtid_by_se()
Request SE to persist GTID explicitly.
Definition: sql_class.h:3883
void set_query(const char *query_arg, size_t query_length_arg)
Assign a new value to thd->m_query_string.
Definition: sql_class.h:4268
const String normalized_query()
The current query in normalized form.
Definition: sql_class.cc:3131
void reset_query_for_display()
Reset query string to be displayed in PFS.
Definition: sql_class.h:4252
PSI_thread * get_psi() const
Read the performance schema thread instrumentation associated with this user session.
Definition: sql_class.h:4074
void init_cost_model()
Initialize the optimizer cost model.
Definition: sql_class.cc:3843
std::bitset< SE_GTID_MAX > Se_GTID_flagset
Definition: sql_class.h:3849
ulong statement_id_counter
Definition: sql_class.h:2558
void enter_cond(mysql_cond_t *cond, mysql_mutex_t *mutex, const PSI_stage_info *stage, PSI_stage_info *old_stage, const char *src_function, const char *src_file, int src_line) override
Enter a condition wait.
Definition: sql_class.h:3088
bool is_log_reset() const
Definition: sql_class.h:3877
bool slave_thread
Definition: sql_class.h:2791
bool m_is_fatal_error
Set to true if execution of the current compound statement can not continue.
Definition: sql_class.h:2803
void shutdown_active_vio()
Definition: sql_class.cc:2034
std::unique_ptr< Protocol_binary > protocol_binary
Definition: sql_class.h:1380
bool is_waiting_for_disk_space() const
Returns the current waiting_for_disk_space flag value.
Definition: sql_class.h:4707
uint dbug_sentry
Definition: sql_class.h:1569
ulonglong first_successful_insert_id_in_prev_stmt
Definition: sql_class.h:2243
Diagnostics_area main_da
Definition: sql_class.h:4455
dd::cache::Dictionary_client * dd_client() const
Definition: sql_class.h:1003
enum_binlog_query_type
Definition: sql_class.h:3072
@ ROW_QUERY_TYPE
Definition: sql_class.h:3074
@ QUERY_TYPE_COUNT
Definition: sql_class.h:3079
@ STMT_QUERY_TYPE
Definition: sql_class.h:3077
SSL_handle m_SSL
SSL data attached to this connection.
Definition: sql_class.h:1424
dd::DD_kill_immunizer * kill_immunizer
When operation on DD tables is in progress then THD is set to kill immune mode.
Definition: sql_class.h:2784
LEX_CSTRING m_invoker_host
Definition: sql_class.h:4480
Prealloced_array< unsigned long, 11 > audit_class_mask
Array of bits indicating which audit classes have already been added to the list of audit plugins whi...
Definition: sql_class.h:2915
bool is_applier_thread() const
Definition: sql_class.h:2023
void set_invoker(const LEX_STRING *user, const LEX_STRING *host)
Definition: sql_class.h:4430
void set_new_thread_id()
Assign a value to m_thread_id by calling Global_THD_manager::get_new_thread_id().
Definition: sql_class.cc:1232
XID debug_binlog_xid_last
Definition: sql_class.h:4677
PSI_statement_locker_state m_statement_state
Current statement instrumentation state.
Definition: sql_class.h:2528
bool notify_hton_pre_acquire_exclusive(const MDL_key *mdl_key, bool *victimized) override
Notify/get permission from interested storage engines before acquiring exclusive lock for the key.
Definition: sql_class.cc:3147
const st_plugin_int * m_plugin
Stores the plugin id it is attached to (if any).
Definition: sql_class.h:4655
void pop_diagnostics_area()
Pop the top DA off the Diagnostics Area stack.
Definition: sql_class.h:3388
bool m_binlog_invoker
It will be set TRUE if CURRENT_USER() is called in account management statements or default definer i...
Definition: sql_class.h:4471
MDL_context mdl_context
Definition: sql_class.h:967
void unpin_gtid()
Unpin and free GTID and TSID.
Definition: sql_class.h:3858
mysql_cond_t COND_thr_lock
Condition variable used for waiting by the THR_LOCK.c subsystem.
Definition: sql_class.h:1594
thr_lock_type insert_lock_default
Type of lock to be used for INSERT statement if lock is not specified explicitly.
Definition: sql_class.h:1674
bool running_explain_analyze
Whether we are currently in the execution phase of an EXPLAIN ANALYZE query.
Definition: sql_class.h:2775
void clear_current_query_costs()
Clear the query costs attributes for the current query.
Definition: sql_class.h:1201
bool has_invoker() const
Definition: sql_class.h:4438
std::unique_ptr< Protocol_text > protocol_text
Definition: sql_class.h:1379
void increment_updates_counter()
Definition: sql_class.cc:2741
const char * proc_info_session(THD *invoking_thd) const
Return the m_proc_info, possibly using the string of an older server release, according to @session....
Definition: sql_class.h:1543
collation_unordered_map< std::string, unique_ptr_my_free< Table_ref > > handler_tables_hash
Definition: sql_class.h:1559
enum_tx_isolation tx_isolation
Definition: sql_class.h:2644
bool is_error() const
true if there is an error in the error stack.
Definition: sql_class.h:3333
unsigned char * m_token_array
Current statement digest token array.
Definition: sql_class.h:2520
void set_ssl(Vio *vio)
Definition: sql_class.h:3025
void save_current_query_costs()
Save the current query costs attributes in the thread session status.
Definition: sql_class.h:1216
bool is_cleanup_done()
Definition: sql_class.cc:1300
my_off_t m_trans_end_pos
Definition: sql_class.h:1975
void restore_sub_statement_state(Sub_statement_state *backup)
Definition: sql_class.cc:2398
THD * get_thd() override
Within MDL subsystem this one is only used for DEBUG_SYNC.
Definition: sql_class.h:3134
void leave_locked_tables_mode()
Leave explicit LOCK TABLES or prelocked mode and restore value of transaction sentinel in MDL subsyst...
Definition: sql_class.cc:2615
bool skip_transaction_read_only_check
Definition: sql_class.h:1919
my_thread_id thread_id() const
Definition: sql_class.h:2580
resourcegroups::Resource_group_ctx * resource_group_ctx()
Get resource group context.
Definition: sql_class.h:4057
void set_trans_pos(const char *file, my_off_t pos)
Functions to set and get transaction position.
Definition: sql_class.h:2690
my_thread_t real_id
Definition: sql_class.h:2560
void push_protocol(const std::unique_ptr< ProtocolClass > &protocol)
Definition: sql_class.h:3401
void begin_attachable_rw_transaction()
Start a read-write attachable transaction.
Definition: sql_class.cc:2318
void lock_query_plan()
Locks the query plan of this THD.
Definition: sql_class.h:1324
void nocheck_register_item_tree_change(Item **place, Item *new_value)
Remember that place was updated with new_value so it can be restored by rollback_item_tree_changes().
Definition: sql_class.cc:2074
ha_rows get_examined_row_count() const
Definition: sql_class.h:2488
void get_trans_fixed_pos(const char **file_var, my_off_t *pos_var) const
Definition: sql_class.h:2725
bool copy_db_to(char **p_db, size_t *p_db_length) const
Definition: sql_class.h:4045
void set_security_context(Security_context *sctx)
Definition: sql_class.h:1352
void send_kill_message() const
Definition: sql_class.cc:2247
void inc_status_select_scan()
Definition: sql_class.cc:2537
Event_tracking_data_stack event_tracking_data_
Definition: sql_class.h:4869
void reset_gtid_persisted_by_se()
Reset by SE at transaction end after persisting GTID.
Definition: sql_class.h:3889
bool tx_commit_pending
Definition: sql_class.h:1095
void decrement_temptable_count()
Decrement the owned temptable counter.
Definition: sql_class.h:4884
USER_CONN * m_user_connect
Definition: sql_class.h:2468
void swap_rewritten_query(String &query_arg)
Set the rewritten query (with passwords obfuscated etc.) on the THD.
Definition: sql_class.cc:3226
Cost_model_server m_cost_model
Optimizer cost model for server operations.
Definition: sql_class.h:4488
char scramble[SCRAMBLE_LENGTH+1]
Definition: sql_class.h:2787
my_timeval query_start_timeval_trunc(uint decimals)
Definition: sql_class.cc:1066
void inc_status_sort_scan()
Definition: sql_class.cc:2570
PSI_stage_key m_current_stage_key
Definition: sql_class.h:1500
Relay_log_info * rli_slave
Definition: sql_class.h:1092
uint open_options
Definition: sql_class.h:2583
double double_value
Definition: sql_class.h:2865
List< Security_context > m_view_ctx_list
Definition: sql_class.h:1364
bool is_current_stmt_binlog_enabled_and_caches_empty() const
Checks whether binlog caches are disabled (binlog does not cache data) or empty in case binloggging i...
Definition: sql_class.cc:3102
Query_arena * stmt_arena
Definition: sql_class.h:2221
enum_binlog_format current_stmt_binlog_format
Indicates the format in which the current statement will be logged.
Definition: sql_class.h:1933
void reset_query()
Definition: sql_class.h:4273
void clear_clone_vio()
Clear clone network Vio for remote clone.
Definition: sql_class.h:3047
void inc_status_created_tmp_tables()
Definition: sql_class.cc:2492
uint get_rand_seed() const override
Provide thread specific random seed for MDL_context's PRNG.
Definition: sql_class.h:3172
ha_rows m_sent_row_count
Number of rows we actually sent to the client, including "synthetic" rows in ROLLUP etc.
Definition: sql_class.h:2453
std::atomic< PSI_thread * > m_psi
Performance schema thread instrumentation for this session.
Definition: sql_class.h:4084
void raise_error_printf(uint code,...)
Raise an exception condition, with a formatted message.
Definition: sql_class.cc:1016
bool m_is_low_level_commit_ordering_enabled
Flag indicating whether additional ordering in the ha_commit_low function is enabled.
Definition: sql_class.h:1619
void set_status_no_index_used()
Definition: sql_class.cc:2578
size_t m_opened_temptable_count
Each THD can open multiple temptables, we create these temptable objects in the temptable engine.
Definition: sql_class.h:4903
static const int OWNED_SIDNO_ANONYMOUS
Definition: sql_class.h:3825
bool push_event_tracking_data(Event_tracking_class event, const Event_tracking_information *Event_tracking_information)
Definition: sql_class.cc:3412
Vio * clone_vio
Definition: sql_class.h:2182
bool is_server_upgrade_thread() const
Definition: sql_class.h:2616
void end_statement()
Definition: sql_class.cc:2140
LEX_CSTRING m_query_string
The query associated with this statement.
Definition: sql_class.h:1014
const CHARSET_INFO * collation()
Definition: sql_class.h:3180
bool charset_is_collation_connection
Definition: sql_class.h:2841
LEX_CSTRING m_invoker_user
It points to the invoker in the Query_log_event.
Definition: sql_class.h:4479
bool is_extrenal_xa() const
Definition: sql_class.h:3911
void reset_binlog_local_stmt_filter()
Definition: sql_class.h:1882
mysql_mutex_t LOCK_query_plan
Protects query plan (SELECT/UPDATE/DELETE's) from being freed/changed while another thread explains i...
Definition: sql_class.h:1311
void time_out_user_resource_limits()
Definition: sql_class.cc:2764
void clear_active_vio()
Definition: sql_class.h:3031
const Protocol * get_protocol() const
Definition: sql_class.h:1382
ulonglong m_lock_usec
Time spent waiting for TABLE locks and DATA locks.
Definition: sql_class.h:1651
bool need_binlog_invoker() const
Definition: sql_class.h:4428
bool is_dd_system_thread() const
Definition: sql_class.h:2590
ulong max_client_packet_length
Definition: sql_class.h:1556
int thd_tx_priority
Definition: sql_class.h:2660
LEX_CSTRING m_db
Name of the current (default) database.
Definition: sql_class.h:1035
std::atomic< bool > m_safe_to_display
Definition: sql_class.h:1016
binlog_filter_state get_binlog_local_stmt_filter() const
Definition: sql_class.h:1896
uchar * binlog_row_event_extra_data
Definition: sql_class.h:1742
THR_LOCK_INFO lock_info
Definition: sql_class.h:1250
bool derived_tables_processing
Definition: sql_class.h:2845
void pop_event_tracking_data()
Definition: sql_class.cc:3457
void record_first_successful_insert_id_in_cur_stmt(ulonglong id_arg)
Definition: sql_class.h:2339
unsigned short m_regular_statement_handle_count
Count of Regular Statement Handles in use.
Definition: sql_class.h:4878
long long_value
Definition: sql_class.h:2862
LEX_CSTRING m_catalog
Currently selected catalog.
Definition: sql_class.h:1022
Opt_trace_context opt_trace
optimizer trace of current statement
Definition: sql_class.h:4116
bool in_loadable_function
Definition: sql_class.h:4846
bool send_result_set_row(const mem_root_deque< Item * > &row_items)
Send one result set row.
Definition: sql_class.cc:2975
bool is_system_thread() const
Definition: sql_class.h:2587
void set_admin_connection(bool admin)
Definition: sql_class.h:1631
class THD::Query_plan query_plan
void reset_sub_statement_state(Sub_statement_state *backup, uint new_state)
Definition: sql_class.cc:2353
bool is_a_srv_session_thd
Variable to mark if the object is part of a Srv_session object, which aggregates THD.
Definition: sql_class.h:4652
Thd_mem_cnt m_mem_cnt
Controlled memory stats for this session.
Definition: sql_class.h:958
LEX * lex
Definition: sql_class.h:1002
bool status_var_aggregated
Definition: sql_class.h:1179
ulonglong current_found_rows
Dynamic, collected and set also in subqueries.
Definition: sql_class.h:2380
void increment_questions_counter()
Definition: sql_class.cc:2747
void increment_user_connections_counter()
Definition: sql_class.cc:2722
void set_clone_vio(Vio *vio)
Set active clone network Vio for remote clone.
Definition: sql_class.h:3040
Time_zone * time_zone()
Definition: sql_class.h:3184
void set_system_user(bool system_user_flag)
Sets the system_user flag atomically for the current session.
Definition: sql_class.h:4955
const Diagnostics_area * get_stmt_da() const
Returns first Diagnostics Area for the current statement.
Definition: sql_class.h:3339
query_id_t query_id
Definition: sql_class.h:2555
void set_safe_display(bool safe)
Set if the query string to be safe to display.
Definition: sql_class.h:4262
ulonglong get_lock_usec()
Definition: sql_class.h:1654
Session_sysvar_resource_manager session_sysvar_res_mgr
Definition: sql_class.h:4505
void send_statement_status()
Definition: sql_class.cc:2994
bool is_connected(bool use_cached_connection_alive=false) final
Return false if connection to client is broken.
Definition: sql_class.cc:3277
const char * thread_stack
Definition: sql_class.h:1333
LEX_CSTRING get_invoker_user() const
Definition: sql_class.h:4436
bool fill_information_schema_tables() const
Definition: sql_class.h:3281
void set_waiting_for_disk_space(bool waiting)
Set the waiting_for_disk_space flag.
Definition: sql_class.h:4701
std::atomic< mysql_mutex_t * > current_mutex
The mutex used with current_cond.
Definition: sql_class.h:1580
void decrement_user_connections_counter()
Definition: sql_class.cc:2728
~THD() override
Definition: sql_class.cc:1511
my_thread_id m_thread_id
This counter is 32 bit because of the client protocol.
Definition: sql_class.h:2572
void set_command(enum enum_server_command command)
Definition: sql_class.cc:2592
bool event_notify(struct st_mysql_event_generic *event_data)
Definition: sql_class.cc:3465
bool is_admin_connection() const
Definition: sql_class.h:1632
Protocol * m_protocol
Definition: sql_class.h:1413
void set_current_stmt_binlog_format_row_if_mixed()
Definition: sql_class.h:3508
String m_normalized_query
Definition: sql_class.h:1015
void init_query_mem_roots()
Initialize memory roots necessary for query processing and (!) pre-allocate memory for it.
Definition: sql_class.cc:1226
void fatal_error()
Mark the current error as fatal.
Definition: sql_class.h:3318
void set_connection_admin(bool connection_admin_flag)
Sets the connection_admin flag atomically for the current session.
Definition: sql_class.h:4974
const LEX_CSTRING & catalog() const
Definition: sql_class.h:1495
void clear_next_event_pos()
Definition: sql_class.cc:2681
void set_server_id(uint32 sid)
Definition: sql_class.h:1778
bool m_secondary_engine_forced
Flag that tells whether secondary storage engine is forced for execution.
Definition: sql_class.h:4755
bool set_db(const LEX_CSTRING &new_db)
Set the current database; use deep copy of C-string.
Definition: sql_class.cc:955
void exit_cond(const PSI_stage_info *stage, const char *src_function, const char *src_file, int src_line) override
End a wait on a condition.
Definition: sql_class.h:3105
bool is_engine_ha_data_detached() const
Definition: sql_class.cc:3086
bool is_attachable_ro_transaction_active() const
Definition: sql_class.h:3485
Sql_condition * raise_condition(uint sql_errno, const char *sqlstate, Sql_condition::enum_severity_level level, const char *msg, bool fatal_error=false)
Raise a generic SQL condition.
Definition: sql_class.cc:1079
PSI_transaction_locker * m_transaction_psi
Current transaction instrumentation.
Definition: sql_class.h:2532
void set_query_id(query_id_t new_query_id)
Assign a new value to thd->query_id.
Definition: sql_class.h:4321
Session_tracker session_tracker
Definition: sql_class.h:4504
const LEX_CSTRING & query() const
Definition: sql_class.h:4210
bool enable_slow_log
Definition: sql_class.h:2843
Internal_error_handler * pop_internal_handler()
Remove the error handler last pushed.
Definition: sql_class.cc:1004
bool audit_plugins_present
Definition: sql_class.h:4870
Event_tracking_data get_event_tracking_data()
Definition: sql_class.h:4849
enum enum_mark_columns mark_used_columns
MARK_COLUMNS_NONE: Means mark_used_columns is not set and no indicator to handler of fields used is s...
Definition: sql_class.h:981
int is_killed() const final
Has the owner thread been killed?
Definition: sql_class.h:3122
struct timeval user_time
Definition: sql_class.h:1640
struct THD_timer_info * timer_cache
After resetting(cancelling) timer, current timer object is cached with timer_cache timer to reuse.
Definition: sql_class.h:1906
bool is_fatal_sub_stmt_error
true if we are in a sub-statement and the current error can not be safely recovered until we left the...
Definition: sql_class.h:2823
bool optimizer_switch_flag(ulonglong flag) const
Tells whether the given optimizer_switch flag is on.
Definition: sql_class.h:1872
Diagnostics_area * m_query_rewrite_plugin_da_ptr
Definition: sql_class.h:4458
void vsyntax_error_at(const POS &location, const char *format, va_list args)
Definition: sql_class.cc:2894
longlong get_row_count_func() const
Definition: sql_class.h:2440
ulong rand_saved_seed2
Definition: sql_class.h:2559
enum THD::Commit_error commit_error
ulonglong previous_found_rows
Stores the result of the FOUND_ROWS() function.
Definition: sql_class.h:2374
int binlog_flush_pending_rows_event(bool stmt_end)
Definition: sql_class.h:1788
void inc_status_sort_rows(ha_rows count)
Definition: sql_class.cc:2561
enum durability_properties durability_property
Definition: sql_class.h:2753
bool waiting_for_disk_space
Definition: sql_class.h:4693
SSL_handle get_ssl() const
Definition: sql_class.h:1386
bool m_audited
Definition: sql_class.h:2931
void clear_current_stmt_binlog_format_row()
Definition: sql_class.h:3537
void set_user_connect(USER_CONN *uc)
Definition: sql_class.cc:2716
enum enum_server_command get_command() const
Definition: sql_class.h:4188
bool is_regular() const =delete
double m_current_query_cost
Current query cost.
Definition: sql_class.h:1190
bool might_have_commit_order_waiters() const final
Indicates that owner thread might have some commit order (non-MDL) waits for it which are still taken...
Definition: sql_class.h:3123
Discrete_intervals_list auto_inc_intervals_in_cur_stmt_for_binlog
Definition: sql_class.h:2300
bool tx_read_only
Definition: sql_class.h:2649
void syntax_error_at(const POS &location)
Definition: sql_class.h:4512
Prealloced_array< Ha_data, PREALLOC_NUM_HA > ha_data
Definition: sql_class.h:1692
const CHARSET_INFO * db_charset
Definition: sql_class.h:2510
int is_current_stmt_binlog_format_row() const
Determine the binlog format of the current statement.
Definition: sql_class.h:1802
const Gtid_set * get_gtid_next_list_const() const
Return the value of @gtid_next_list: either a Gtid_set or NULL.
Definition: sql_class.h:3570
bool parsing_json_duality_view
Definition: sql_class.h:2849
void set_next_event_pos(const char *_filename, ulonglong _pos)
Definition: sql_class.cc:2665
bool is_mem_cnt_error()
Definition: sql_class.h:4829
void set_plugin(const st_plugin_int *plugin)
Sets the plugin id to the value provided as parameter.
Definition: sql_class.h:4638
const Protocol_classic * get_protocol_classic() const
Asserts that the protocol is of type text or binary and then returns the m_protocol casted to Protoco...
Definition: sql_class.h:1405
String packet
Definition: sql_class.h:1980
void set_tmp_table_seq_id(uint arg)
Definition: sql_class.h:4641
bool stmt_depends_on_first_successful_insert_id_in_prev_stmt
Definition: sql_class.h:2285
void push_internal_handler(Internal_error_handler *handler)
Add an internal error handler to the thread execution context.
Definition: sql_class.cc:983
void copy_status_var(System_status_var *dst_var)
Copy status variables into a structure pointed by the specified pointer and keep track of the pointer...
Definition: sql_class.h:1234
bool is_operating_gtid_table_implicitly
Definition: sql_class.h:2388
void syntax_error()
Definition: sql_class.h:4507
bool handle_condition(uint sql_errno, const char *sqlstate, Sql_condition::enum_severity_level *level, const char *msg)
Handle a sql condition.
Definition: sql_class.cc:991
Event_reference_caching_cache * events_cache_
Definition: sql_class.h:4868
void set_current_stmt_binlog_format_row()
Definition: sql_class.h:3532
Prepared_statement_map stmt_map
All prepared statements of this connection.
Definition: sql_class.h:1328
uint server_status
Definition: sql_class.h:2583
friend void push_warning(THD *thd, Sql_condition::enum_severity_level severity, uint code, const char *message_text)
Push the warning to error list if there is still room in the list.
Definition: sql_error.cc:659
void set_secondary_engine_statement_context(std::unique_ptr< Secondary_engine_statement_context > context)
Definition: sql_class.cc:941
bool bool_value
Definition: sql_class.h:2861
bool is_killable
Definition: sql_class.h:1571
void set_query_for_display(const char *query_arg, size_t query_length_arg)
Set query to be displayed in performance schema (threads table etc.).
Definition: sql_class.h:4235
bool is_system_user()
Returns if the user of the session has the SYSTEM_USER privilege or not.
Definition: sql_class.h:4946
bool is_current_stmt_binlog_log_replica_updates_disabled() const
Determine if binlogging is currently disabled for this session.
Definition: sql_class.cc:3097
void debug_assert_query_locked() const
For safe and protected access to the query string, the following rules should be followed: 1: Only th...
Definition: sql_class.cc:2599
void force_one_auto_inc_interval(ulonglong next_id)
Definition: sql_class.h:2365
uint64_t sql_mode_t
Definition: sql_lexer_thd.h:38
sp_rcontext * sp_runtime_ctx
Current SP-runtime context.
Definition: sql_class.h:2852
void inc_examined_row_count(ha_rows count)
Definition: sql_class.cc:2479
bool is_strict_mode() const
Definition: sql_class.h:3176
bool skip_gtid_rollback
Definition: sql_class.h:3970
Parser_state * m_parser_state
Internal parser state.
Definition: sql_lexer_thd.h:66
void update_charset()
Definition: sql_class.cc:1979
void inc_status_select_full_join()
Definition: sql_class.cc:2505
List< char > * get_binlog_accessed_db_names() const
Definition: sql_class.h:2016
void pop_protocol()
Pops the top protocol of the Protocol stack and sets the previous one as the current protocol.
Definition: sql_class.cc:3322
void enable_mem_cnt()
Definition: sql_class.h:4822
bool m_inside_system_variable_global_update
Flag to indicate this thread is executing sys_var::update for a OPT_GLOBAL variable.
Definition: sql_class.h:4792
bool is_current_stmt_binlog_row_enabled_with_write_set_extraction() const
Determine if binloging is enabled in row format and write set extraction is enabled for this session.
Definition: sql_class.cc:3106
void set_binlog_local_stmt_filter()
Definition: sql_class.h:1891
bool is_cmd_skip_readonly() const
Definition: sql_class.h:1993
thr_lock_type update_lock_default
Type of lock to be used for all DML statements, except INSERT, in cases when lock is not specified ex...
Definition: sql_class.h:1668
enum enum_thread_type system_thread
Definition: sql_class.h:2584
void clear_copy_status_var()
Clear copy of the status variables.
Definition: sql_class.h:1225
void raise_note_printf(uint code,...)
Raise an completion condition (note), with a formatted message.
Definition: sql_class.cc:1053
bool is_mem_cnt_error_issued
Definition: sql_class.h:4828
void reset_skip_transaction_read_only_check()
Definition: sql_class.h:2003
const char * current_key_name
Definition: sql_class.h:4826
ha_rows num_truncated_fields
Definition: sql_class.h:2446
partition_info * work_part_info
Definition: sql_class.h:2903
bool has_incremented_gtid_automatic_count
Flag indicating whether this session incremented the number of sessions with GTID_NEXT set to AUTOMAT...
Definition: sql_class.h:4875
void * fetch_external(unsigned int slot)
Definition: sql_class.cc:3370
bool is_attachable_transaction_active() const
Definition: sql_class.h:3492
enum_thd_life_cycle_stages
Represents life cycle stages of THD instance.
Definition: sql_class.h:2975
@ ACTIVE_AND_CLEAN
Definition: sql_class.h:2977
@ SCHEDULED_FOR_DISPOSAL
Definition: sql_class.h:2978
@ RESOURCES_RELEASED
Definition: sql_class.h:2980
@ DISPOSED
Definition: sql_class.h:2981
@ ACTIVE
Definition: sql_class.h:2976
@ CLEANED_UP
Definition: sql_class.h:2979
System_variables variables
Definition: sql_lexer_thd.h:64
void set_log_reset()
Set when binlog reset operation is started.
Definition: sql_class.h:3871
struct rand_struct rand
Definition: sql_class.h:1171
bool is_slave_error
True if a slave error.
Definition: sql_class.h:2833
List< char > * binlog_accessed_db_names
Definition: sql_class.h:1957
void set_original_commit_timestamp_for_slave_thread()
Copies variables.original_commit_timestamp to ((Slave_worker *)rli_slave)->original_commit_timestamp,...
Definition: sql_class.cc:2689
bool is_stmt_prepare_or_first_stmt_execute() const =delete
binlog_filter_state
Definition: sql_class.h:1876
@ BINLOG_FILTER_CLEAR
Definition: sql_class.h:1878
@ BINLOG_FILTER_UNKNOWN
Definition: sql_class.h:1877
@ BINLOG_FILTER_SET
Definition: sql_class.h:1879
bool is_init_file_system_thread() const
Definition: sql_class.h:2603
void set_secondary_engine_forced(bool forced)
Indicate whether secondary storage engine is forced for this execution.
Definition: sql_class.h:4736
ha_rows m_examined_row_count
Number of rows read and/or evaluated for a statement.
Definition: sql_class.h:2465
bool query_start_usec_used
Definition: sql_class.h:2824
time_t query_start_in_secs() const
Definition: sql_class.h:3188
THD * next_to_commit
Used by MYSQL_BIN_LOG to maintain the commit queue for binary log group commit.
Definition: sql_class.h:2672
void set_transaction(Transaction_ctx *transaction_ctx)
Changes the Transaction_ctx instance within THD-object.
Definition: sql_class.cc:934
enum_thd_life_cycle_stages m_thd_life_cycle_stage
Definition: sql_class.h:2983
mysql_mutex_t LOCK_group_replication_connection_mutex
Definition: sql_class.h:4819
void raise_warning_printf(uint code,...)
Raise a completion condition (warning), with a formatted message.
Definition: sql_class.cc:1033
bool is_classic_protocol() const
Definition: sql_class.cc:3272
Prealloced_array< Binlog_user_var_event *, 2 > user_var_events
Definition: sql_class.h:2665
PSI_stage_key get_current_stage_key() const
Definition: sql_class.h:1547
bool send_result_metadata(const mem_root_deque< Item * > &list, uint flags)
Send name and type of result to client.
Definition: sql_class.cc:2934
bool is_stmt_prepare_or_first_sp_execute() const =delete
mysql_mutex_t LOCK_thd_protocol
Protects THD::m_protocol when it gets removed in x plugin.
Definition: sql_class.h:1279
bool parsing_system_view
Definition: sql_class.h:2847
Diagnostics_area * m_stmt_da
Definition: sql_class.h:4460
bool is_binlog_applier() const
The function checks whether the thread is processing queries from binlog, as automatically generated ...
Definition: sql_class.h:1103
bool skip_readonly_check
Definition: sql_class.h:1913
const String & rewritten_query() const
Get the rewritten query (with passwords obfuscated etc.) from the THD.
Definition: sql_class.h:4300
void cleanup(void)
Definition: sql_class.cc:1310
cached_properties
Definition: sql_class.h:1079
void set_is_killable(bool is_killable_arg)
Assign a new value to is_killable Protected with the LOCK_thd_data mutex.
Definition: sql_class.h:4342
void inc_status_created_tmp_disk_tables()
Definition: sql_class.cc:2484
const Transaction_ctx * get_transaction() const
Definition: sql_class.h:2164
bool is_connection_admin()
Returns if the user of the session has the CONNECTION_ADMIN privilege or not.
Definition: sql_class.h:4965
void store_cached_properties(cached_properties prop_mask=cached_properties::ALL)
Definition: sql_class.cc:911
mysql::gtid::Tsid owned_tsid
For convenience, this contains the TSID component of the GTID stored in owned_gtid.
Definition: sql_class.h:3831
struct timeval start_time
Definition: sql_class.h:1639
binlog_filter_state m_binlog_filter_state
Indicate if the current statement should be discarded instead of written to the binlog.
Definition: sql_class.h:1927
const CHARSET_INFO * charset() const
Definition: sql_class.h:3412
void init(void)
Definition: sql_class.cc:1144
void copy_table_access_properties(THD *thd)
Copy session properties that affect table access from the parent session to the current session.
Definition: sql_class.cc:927
bool is_secondary_storage_engine_eligible() const
Checks if queries in this session can use a secondary storage engine for execution.
Definition: sql_class.cc:3202
void set_status_no_good_index_used()
Definition: sql_class.cc:2585
std::unique_ptr< LEX > main_lex
The lex to hold the parsed tree of conventional (non-prepared) queries.
Definition: sql_class.h:999
const char * where
Definition: sql_class.h:1554
LEX_CSTRING get_invoker_host() const
Definition: sql_class.h:4437
ha_rows get_sent_row_count() const
Definition: sql_class.h:2486
bool charset_is_character_set_filesystem
Definition: sql_class.h:2842
void reset_copy_status_var()
Copy status variables into a structure pointed by the specified pointer passed into copy_status_var m...
Definition: sql_class.h:1243
bool safe_to_display() const
Definition: sql_class.h:4258
void reset_first_successful_insert_id()
Definition: sql_class.h:2352
void set_time()
Definition: sql_class.cc:3329
bool is_fsp_truncate_mode() const
Definition: sql_class.h:3195
Access_bitmask want_privilege
Used by Item::check_column_privileges() to tell which privileges to check for.
Definition: sql_class.h:990
uint32 file_id
Definition: sql_class.h:1636
Internal_error_handler * m_internal_handler
The current internal error handler for this thread, or NULL.
Definition: sql_class.h:4444
void push_diagnostics_area(Diagnostics_area *da, bool copy_conditions=true)
Push the given Diagnostics Area on top of the stack, making it the new first Diagnostics Area.
Definition: sql_class.h:3381
void disable_low_level_commit_ordering()
Enables ordering in ha_commit_low.
Definition: sql_class.cc:3116
Plugin_array audit_class_plugins
Array of active audit plugins which have been used by this THD.
Definition: sql_class.h:2910
const NET * get_net() const
Definition: sql_class.h:1982
bool transaction_rollback_request
Set by a storage engine to request the entire transaction (that possibly spans multiple engines) to r...
Definition: sql_class.h:2811
void set_active_vio(Vio *vio)
Definition: sql_class.h:3019
void release_external_store()
Definition: sql_class.cc:3754
uint16 peer_port
Definition: sql_class.h:1638
Secondary_engine_optimization secondary_engine_optimization() const
Can secondary storage engines be used for query execution in this session?
Definition: sql_class.h:4722
bool binlog_need_explicit_defaults_ts
The member is served for marking a query that CREATEs or ALTERs a table declared with a TIMESTAMP col...
Definition: sql_class.h:2681
void set_skip_transaction_read_only_check()
Definition: sql_class.h:1990
uint in_sub_stmt
Definition: sql_class.h:1677
void inc_lock_usec(ulonglong usec)
Definition: sql_class.cc:3342
void disable_mem_cnt()
Definition: sql_class.h:4823
void rollback_item_tree_changes()
Restore locations set by calls to nocheck_register_item_tree_change().
Definition: sql_class.cc:2094
bool se_persists_gtid() const
Definition: sql_class.h:3895
char * m_trans_fixed_log_file
Definition: sql_class.h:1974
bool is_low_level_commit_ordering_enabled() const
Obtains flag indicating whether additional ordering in the ha_commit_low function is enabled.
Definition: sql_class.cc:3121
bool unioned_events_trans
Definition: sql_class.h:2885
char * strmake(const char *str, size_t size) const
Definition: sql_lexer_thd.h:52
struct THD::@183 binlog_evt_union
Secondary_engine_statement_context * secondary_engine_statement_context()
Definition: sql_class.h:1121
bool copy_db_to(char const **p_db, size_t *p_db_length) const
Definition: sql_class.h:4035
void increment_con_per_hour_counter()
Definition: sql_class.cc:2735
std::atomic< bool > m_cached_is_connection_alive
Keep cached values of "connection alive" and "rw status".
Definition: sql_class.h:1319
uint get_tmp_table_seq_id()
Definition: sql_class.h:4640
const Diagnostics_area * get_stacked_da() const
Returns the second Diagnostics Area for the current statement.
Definition: sql_class.h:3342
void mark_transaction_to_rollback(bool all)
Mark transaction to rollback and mark error as fatal to a sub-statement.
Definition: sql_class.cc:2655
Attachable_trx * m_attachable_trx
Definition: sql_class.h:2159
void raise_warning(uint code)
Raise a completion condition (warning).
Definition: sql_class.cc:1028
enum_check_fields check_for_truncated_fields
Definition: sql_class.h:2662
uint get_binlog_table_maps() const
Definition: sql_class.h:2010
PSI_idle_locker * m_idle_psi
Idle instrumentation.
Definition: sql_class.h:2539
Diagnostics_area * get_parser_da()
Returns thread-local Diagnostics Area for parsing.
Definition: sql_class.h:3355
void set_time(const struct timeval *t)
Definition: sql_class.h:3191
collation_unordered_map< std::string, unique_ptr_with_deleter< user_var_entry > > user_vars
Hash for user variables.
Definition: sql_class.h:1170
bool sql_parser()
Call parser to transform statement into a parse tree.
Definition: sql_class.cc:3162
bool rand_used
Definition: sql_class.h:2825
NET net
Definition: sql_class.h:1979
ulonglong m_current_query_partial_plans
Current query partial plans.
Definition: sql_class.h:1196
sp_cache * sp_func_cache
Definition: sql_class.h:2854
Cost_model_server m_cost_model_hypergraph
Definition: sql_class.h:4489
int tx_priority
Definition: sql_class.h:2655
std::unique_ptr< Transaction_ctx > m_transaction
Definition: sql_class.h:2029
table_map table_map_for_update
Definition: sql_class.h:2227
void cleanup_after_parse_error()
Restore session state in case of parse error.
Definition: sql_class.cc:3248
handlerton * m_eligible_secondary_engine_handlerton
Definition: sql_class.h:1075
mysql_mutex_t LOCK_thd_sysvar
Protects THD::variables while being updated.
Definition: sql_class.h:1270
ulong ulong_value
Definition: sql_class.h:2863
void update_previous_found_rows()
Definition: sql_class.h:3213
void raise_note(uint code)
Raise a completion condition (note), with a fixed message.
Definition: sql_class.cc:1045
void awake(THD::killed_state state_to_set)
Awake a thread.
Definition: sql_class.cc:1589
void change_item_tree(Item **place, Item *new_value)
Record a transient change to a pointer to an Item within another Item.
Definition: sql_class.h:3418
void mark_plugin_fake_ddl(bool flag)
Definition: sql_class.h:4645
mysql_mutex_t LOCK_thd_data
Protects THD data accessed from other threads.
Definition: sql_class.h:1258
bool convert_string(LEX_STRING *to, const CHARSET_INFO *to_cs, const char *from, size_t from_length, const CHARSET_INFO *from_cs, bool report_error=false)
void cleanup_after_query()
Definition: sql_class.cc:1849
void restore_globals()
Definition: sql_class.cc:1819
void inc_status_sort_range()
Definition: sql_class.cc:2553
query_id_t first_query_id
Definition: sql_class.h:2891
Ha_data * get_ha_data(int slot)
Retrieve Ha_data for a given slot.
Definition: sql_class.h:1698
Vio * active_vio
Definition: sql_class.h:2179
uint tmp_table_seq_id
Sequential number of internal tmp table created in the statement.
Definition: sql_class.h:4670
MEM_ROOT * user_var_events_alloc
Definition: sql_class.h:2666
THD(bool enable_plugins=true)
Definition: sql_class.cc:675
uint32 unmasked_server_id
Definition: sql_class.h:1634
const char * m_proc_info
Definition: sql_class.h:1514
void push_protocol(Protocol *protocol)
Inserts the new protocol at the top of the protocol stack, and make it the current protocol for this ...
Definition: sql_class.cc:3314
void end_attachable_transaction()
End an active attachable transaction.
Definition: sql_class.cc:2310
bool is_secondary_engine_forced() const
Definition: sql_class.h:4740
const char * proc_info() const
Definition: sql_class.h:1532
bool is_attachable_rw_transaction_active() const
Definition: sql_class.h:3499
void clear_log_reset()
Cleared after flushing SE logs during binlog reset.
Definition: sql_class.h:3874
const st_plugin_int * get_plugin() const
Returns the plugin, the thd belongs to.
Definition: sql_class.h:4633
enum enum_server_command m_command
Type of current query: COM_STMT_PREPARE, COM_QUERY, etc.
Definition: sql_class.h:1625
void reset_db(const LEX_CSTRING &new_db)
Set the current database; use shallow copy of C-string.
Definition: sql_class.h:4023
Se_GTID_flagset m_se_gtid_flags
Flags for SE GTID persistence.
Definition: sql_class.h:3852
Gtid_set * get_gtid_next_list()
Return the value of @gtid_next_list: either a Gtid_set or NULL.
Definition: sql_class.h:3563
mysql_mutex_t LOCK_current_cond
Mutex protecting access to current_mutex and current_cond.
Definition: sql_class.h:1575
void set_secondary_engine_optimization(Secondary_engine_optimization state)
Enables or disables use of secondary storage engines in this session.
Definition: sql_class.h:4712
Transaction_ctx * get_transaction()
Definition: sql_class.h:2162
bool is_initialize_system_thread() const
Definition: sql_class.h:2598
ulong rand_saved_seed1
Definition: sql_class.h:2559
sp_cache * sp_proc_cache
Definition: sql_class.h:2853
Item_change_list change_list
This is used to track transient changes to items during optimization of a prepared statement/stored p...
Definition: sql_class.h:2207
bool in_active_multi_stmt_transaction() const
true if the session is in a multi-statement transaction mode (
Definition: sql_class.h:3278
void refresh_reference_caches()
Definition: sql_class.h:4857
bool check_clone_vio()
Check if clone network Vio is active.
Definition: sql_class.h:3054
std::unique_ptr< PROFILING > profiling
Definition: sql_class.h:2512
void reset_current_stmt_binlog_format_row()
Definition: sql_class.h:3542
bool m_disable_password_validation
Definition: sql_class.h:1377
bool in_multi_stmt_transaction_mode() const
Returns true if session is in a multi-statement transaction mode.
Definition: sql_class.h:3240
void begin_attachable_ro_transaction()
Start a read-only attachable transaction.
Definition: sql_class.cc:2306
uint get_protocol_rw_status()
Return the cached protocol rw status.
Definition: sql_class.cc:3301
bool do_union
Definition: sql_class.h:2874
const LEX_CSTRING & db() const
Definition: sql_class.h:3989
const Internal_error_handler * get_internal_handler() const
Definition: sql_class.h:4087
ulonglong read_first_successful_insert_id_in_prev_stmt(void)
Definition: sql_class.h:2343
uint32 binlog_unsafe_warning_flags
Bit field for the state of binlog warnings.
Definition: sql_class.h:1947
void raise_error(uint code)
Raise an exception condition.
Definition: sql_class.cc:1011
std::atomic< killed_state > killed
Definition: sql_class.h:2768
ulonglong start_utime
Query start time, expressed in microseconds.
Definition: sql_class.h:1644
Security_context * m_security_ctx
Definition: sql_class.h:1349
bool is_stmt_prepare() const =delete
void restore_ha_data(const Prealloced_array< Ha_data, PREALLOC_NUM_HA > &backup)
Restore ha_data from the provided backup copy.
Definition: sql_class.h:1717
bool unioned_events
Definition: sql_class.h:2879
bool m_is_plugin_fake_ddl
Creating or dropping plugin native table through a plugin service.
Definition: sql_class.h:4663
void set_sent_row_count(ha_rows count)
Definition: sql_class.cc:2469
uint query_name_consts
number of name_const() substitutions, see sp_head.cc:subst_spvars()
Definition: sql_class.h:2857
NET_SERVER m_net_server_extension
Additional network instrumentation for the server only.
Definition: sql_class.h:1161
void inc_status_count_hit_tmp_table_size()
Definition: sql_class.cc:2500
ulonglong conn_mem_alloc_number
Definition: sql_class.h:4827
String m_rewritten_query
In some cases, we may want to modify the query (i.e.
Definition: sql_class.h:1066
bool m_server_idle
True if the server code is IDLE for this connection.
Definition: sql_class.h:2545
Relay_log_info * rli_fake
Definition: sql_class.h:1090
mysql_mutex_t LOCK_thd_security_ctx
Protects THD::m_security_ctx from inspection (e.g.
Definition: sql_class.h:1285
void backup_ha_data(Prealloced_array< Ha_data, PREALLOC_NUM_HA > *backup)
Copy ha_data into the provided argument.
Definition: sql_class.h:1703
uint32 server_id
Definition: sql_class.h:1635
bool is_fatal_error() const
Definition: sql_class.h:3319
Transactional_ddl_context m_transactional_ddl
Definition: sql_class.h:4777
bool duplicate_slave_id
This is only used by master dump threads.
Definition: sql_class.h:4617
bool charset_is_system_charset
is set if a statement accesses a temporary table created through CREATE TEMPORARY TABLE.
Definition: sql_class.h:2841
void reset_rewritten_query()
Reset thd->m_rewritten_query.
Definition: sql_class.h:4310
void release_resources()
Release most resources, prior to THD destruction.
Definition: sql_class.cc:1433
Security_context * security_context() const
Definition: sql_class.h:1351
bool check_event_subscribers(Event_tracking_class event, unsigned long subevent, bool check_audited)
Check if there are event subscribers for the event.
Definition: sql_class.cc:3387
size_t get_temptable_count() const
Return currently owned temptable count.
Definition: sql_class.h:4886
void restore_backup_open_tables_state(Open_tables_backup *backup)
Definition: sql_class.cc:2292
void pop_lock_usec(ulonglong top)
Definition: sql_class.h:1660
void enter_locked_tables_mode(enum_locked_tables_mode mode_arg)
Definition: sql_class.h:4348
bool time_zone_used
Definition: sql_class.h:2825
ulonglong ulonglong_value
Definition: sql_class.h:2864
void enter_stage(const PSI_stage_info *stage, PSI_stage_info *old_stage, const char *calling_func, const char *calling_file, const unsigned int calling_line) SUPPRESS_TSAN
Definition: sql_class.cc:587
uint binlog_table_maps
Definition: sql_class.h:1953
void inc_status_select_range_check()
Definition: sql_class.cc:2529
int send_explain_fields(Query_result *result)
Definition: sql_class.cc:1991
void clear_error()
Clear the current error, if any.
Definition: sql_class.h:3298
bool is_bootstrap_system_thread() const
Definition: sql_class.h:2609
void binlog_invoker()
Definition: sql_class.h:4427
bool is_one_phase_commit()
Definition: sql_class.cc:3192
void set_gtid_persisted_by_se()
Set by SE when it guarantees GTID persistence.
Definition: sql_class.h:3880
void inc_status_sort_merge_passes()
Definition: sql_class.cc:2545
void mark_as_srv_session()
Definition: sql_class.h:4627
MEM_ROOT main_mem_root
This memory root is used for two purposes:
Definition: sql_class.h:4454
struct System_status_var status_var
Definition: sql_class.h:1173
bool m_enable_plugins
Definition: sql_class.h:2923
struct System_status_var * copy_status_var_ptr
Definition: sql_class.h:1174
void clear_owned_gtids()
Definition: sql_class.h:3934
killed_state
Definition: sql_class.h:2761
@ KILL_QUERY
Definition: sql_class.h:2764
@ KILL_CONNECTION
Definition: sql_class.h:2763
@ KILLED_NO_VALUE
Definition: sql_class.h:2766
@ KILL_TIMEOUT
Definition: sql_class.h:2765
@ NOT_KILLED
Definition: sql_class.h:2762
void set_eligible_secondary_engine_handlerton(handlerton *hton)
Definition: sql_class.cc:946
void cleanup_after_statement_execution()
cleanup all secondary engine relevant members after statement execution.
Definition: sql_class.cc:950
std::vector< char > m_connection_attributes
Session's connection attributes for the connected client.
Definition: sql_class.h:1184
Locked_tables_list locked_tables_list
Definition: sql_class.h:2901
void get_definer(LEX_USER *definer)
Definition: sql_class.cc:2638
union THD::@182 sys_var_tmp
const char * m_trans_log_file
The binary log position of the transaction.
Definition: sql_class.h:1973
bool is_commit_in_middle_of_statement
Definition: sql_class.h:3981
Diagnostics_area * get_stmt_da()
Returns first Diagnostics Area for the current statement.
Definition: sql_class.h:3336
mysql_cond_t COND_group_replication_connection_cond_var
Definition: sql_class.h:4820
std::atomic< bool > m_is_connection_admin
Flag that indicates if the user of current session has CONNECTION_ADMIN privilege.
Definition: sql_class.h:4767
void inc_status_select_full_range_join()
Definition: sql_class.cc:2513
Diagnostics_area m_parser_da
cf.
Definition: sql_class.h:4456
void notify_shared_lock(MDL_context_owner *ctx_in_use, bool needs_thr_lock_abort) override
A callback to the server internals that is used to address special cases of the locking protocol.
Definition: sql_class.cc:1761
const USER_CONN * get_user_connect() const
Definition: sql_class.h:2472
void shutdown_clone_vio()
Shutdown clone vio, if active.
Definition: sql_class.cc:2052
void pin_gtid()
Defer freeing owned GTID and TSID till unpinned.
Definition: sql_class.h:3855
PSI_idle_locker_state m_idle_state
Idle instrumentation state.
Definition: sql_class.h:2542
bool is_plugin_fake_ddl() const
Definition: sql_class.h:4644
bool arg_of_last_insert_id_function
Definition: sql_class.h:2230
void set_skip_readonly_check()
Definition: sql_class.h:1984
Se_GTID_flag
SE GTID persistence flag types.
Definition: sql_class.h:3834
@ SE_GTID_PERSIST_EXPLICIT
Explicit request for SE to persist GTID for current transaction.
Definition: sql_class.h:3844
@ SE_GTID_RESET_LOG
If RESET log in progress.
Definition: sql_class.h:3842
@ SE_GTID_CLEANUP
Cleanup GTID during unpin.
Definition: sql_class.h:3838
@ SE_GTID_PERSIST
SE would persist GTID for current transaction.
Definition: sql_class.h:3840
@ SE_GTID_MAX
Max element holding the biset size.
Definition: sql_class.h:3846
@ SE_GTID_PIN
Pin owned GTID.
Definition: sql_class.h:3836
bool se_persists_gtid_explicit() const
Definition: sql_class.h:3905
bool for_debug_only_is_set_persist_options
Definition: sql_class.h:1273
void rpl_reattach_engine_ha_data()
When the thread is a binlog or slave applier it reattaches the engine ha_data associated with it and ...
Definition: sql_class.cc:3076
bool release_resources_done() const
Definition: sql_class.cc:1407
bool is_operating_substatement_implicitly
Definition: sql_class.h:2405
void update_slow_query_status()
Evaluate the current time, and if it exceeds the long-query-time setting, mark the query as slow.
Definition: sql_class.cc:3357
uint tmp_table
Definition: sql_class.h:2582
Commit_error
Definition: sql_class.h:2740
@ CE_NONE
Definition: sql_class.h:2741
@ CE_COMMIT_ERROR
Definition: sql_class.h:2745
@ CE_ERROR_COUNT
Definition: sql_class.h:2746
@ CE_SYNC_ERROR
Definition: sql_class.h:2744
@ CE_FLUSH_ERROR
Definition: sql_class.h:2742
@ CE_FLUSH_GNO_EXHAUSTED_ERROR
Definition: sql_class.h:2743
Security_context m_main_security_ctx
Definition: sql_class.h:1348
malloc_unordered_map< std::string, User_level_lock * > ull_hash
Definition: sql_class.h:1566
static const char *const DEFAULT_WHERE
Definition: sql_class.h:1158
void reset_skip_readonly_check()
Definition: sql_class.h:1998
Global_read_lock global_read_lock
Definition: sql_class.h:2177
void inc_sent_row_count(ha_rows count)
Definition: sql_class.cc:2474
void increment_temptable_count()
Increment the owned temptable counter.
Definition: sql_class.h:4882
bool thread_specific_used
is set if some thread specific value(s) used in a statement.
Definition: sql_class.h:2836
void set_open_tables(TABLE *open_tables_arg)
Assign a new value to open_tables.
Definition: sql_class.h:4332
bool is_cmd_skip_transaction_read_only() const
Definition: sql_class.h:1995
bool owned_gtid_is_empty()
Definition: sql_class.h:3954
resourcegroups::Resource_group_ctx m_resource_group_ctx
Resource group context indicating the current resource group and the name of the resource group to sw...
Definition: sql_class.h:1042
enum_reset_lex
Definition: sql_class.h:2096
@ DO_NOT_RESET_LEX
Definition: sql_class.h:2096
@ RESET_LEX
Definition: sql_class.h:2096
uchar password
Definition: sql_class.h:2793
const Cost_model_server * cost_model() const
Retrieve the optimizer cost model for this connection.
Definition: sql_class.cc:3848
void set_proc_info(const char *proc_info)
Definition: sql_class.h:1546
handlerton * eligible_secondary_engine_handlerton() const
Definition: sql_class.h:1127
void start_disposal()
Set THD in ACTIVE life stage to disposal stage.
Definition: sql_class.cc:1420
Diagnostics_area * get_query_rewrite_plugin_da()
Returns thread-local Diagnostics Area to be used by query rewrite plugins.
Definition: sql_class.h:3366
bool in_lock_tables
Definition: sql_class.h:2826
sql_digest_state m_digest_state
Top level statement digest.
Definition: sql_class.h:2522
ulonglong found_rows() const
Definition: sql_class.h:3205
Definition: table.h:2931
Definition: sql_class.h:252
void restore_mode()
Restore original memory counter mode.
Definition: sql_class.h:284
void no_error_mode()
Set NO ERROR memory counter mode.
Definition: sql_class.h:288
ulonglong glob_mem_counter
Definition: sql_class.h:259
void set_orig_mode(uint mode_arg)
Function sets original memory counter mode.
Definition: sql_class.h:302
void set_curr_mode(uint mode_arg)
Function sets current memory counter mode.
Definition: sql_class.h:296
void flush()
Function flushes memory counters before deleting the memory counter object.
Definition: sql_class.cc:334
void free_cnt(size_t size)
Decrease memory counter at 'free' operation.
Definition: sql_class.cc:259
bool is_error() const
Check if memory counter error is issued.
Definition: sql_class.h:308
ulonglong mem_counter
Definition: sql_class.h:257
void set_thd_error_status() const
Set THD error status using memory counter diagnostics area.
Definition: sql_class.cc:399
THD * m_thd
Definition: sql_class.h:255
int reset()
Function resets current memory counter mode and adjusts global memory counter according to thread mem...
Definition: sql_class.cc:274
Diagnostics_area m_da
Definition: sql_class.h:256
bool is_error_mode() const
Check if memory counter is in error mode.
Definition: sql_class.h:318
~Thd_mem_cnt()
Definition: sql_class.h:269
ulonglong max_conn_mem
Definition: sql_class.h:258
bool m_enabled
Definition: sql_class.h:254
void alloc_cnt(size_t size)
Increase memory counter at 'alloc' operation.
Definition: sql_class.cc:170
void set_thd(THD *thd)
Definition: sql_class.h:273
uint orig_mode
Definition: sql_class.h:262
int generate_error(int err_no, ulonglong mem_limit, ulonglong mem_size)
Generate OOM error and set therad to KILL_CONNECTION state.
Definition: sql_class.cc:355
void disable()
Definition: sql_class.cc:157
uint curr_mode
Definition: sql_class.h:261
bool is_error_log_mode() const
Check if memory counter is in error log mode.
Definition: sql_class.h:324
bool is_connection_stage
Definition: sql_class.h:264
void enable()
Definition: sql_class.h:274
Thd_mem_cnt()
Definition: sql_class.h:268
This class represents abstract time zone and provides basic interface for MYSQL_TIME <-> my_time_t co...
Definition: tztime.h:49
Definition: transaction_info.h:55
This class keeps the context of transactional DDL statements.
Definition: sql_class.h:887
void post_ddl()
End the transactional context created by calling post ddl hook for engine on which table is being cre...
Definition: sql_class.cc:3818
dd::String_type m_tablename
Definition: sql_class.h:916
void init(dd::String_type db, dd::String_type tablename, const handlerton *hton)
Initialize the transactional ddl context when executing CREATE TABLE ... SELECT command with engine w...
Definition: sql_class.cc:3768
~Transactional_ddl_context()
Definition: sql_class.h:893
THD * m_thd
Definition: sql_class.h:909
Transactional_ddl_context(THD *thd)
Definition: sql_class.h:889
dd::String_type m_db
Definition: sql_class.h:915
bool inited()
Definition: sql_class.h:901
const handlerton * m_hton
Definition: sql_class.h:912
void rollback()
Remove the table share used while creating the table, if the transaction is being rolledback.
Definition: sql_class.cc:3786
@ XA_NOTR
Definition: xa.h:298
std::unordered_map, but with my_malloc and collation-aware comparison.
Definition: map_helpers.h:219
RAII class for immunizing the THD from kill operations.
Definition: dd_kill_immunizer.h:46
Definition: dictionary_client.h:149
The handler class is the interface for dynamically loadable storage engines.
Definition: handler.h:4666
std::unordered_map, but with my_malloc, so that you can track the memory used using PSI memory keys.
Definition: map_helpers.h:157
A (partial) implementation of std::deque allocating its blocks on a MEM_ROOT.
Definition: mem_root_deque.h:111
Represents Transaction Source Identifier which is composed of source UUID and transaction tag.
Definition: tsid.h:44
void clear()
Clears data - uuid and tag.
Definition: tsid.cpp:127
Definition: partition_info.h:209
Definition: sp_cache.cc:42
Definition: sp_rcontext.h:77
To be used for pool-of-threads (implemented differently on various OSs)
Definition: sql_class.h:209
void * data
Definition: sql_class.h:211
~thd_scheduler()=default
thd_scheduler()
Definition: sql_class.h:213
Definition: item_func.h:3092
#define mysql_mutex_lock(M)
Definition: mysql_mutex.h:50
#define mysql_mutex_unlock(M)
Definition: mysql_mutex.h:57
#define PSI_THREAD_CALL(M)
Definition: psi_thread.h:36
static char buf[MAX_BUF]
Definition: conf_to_src.cc:74
#define U
Definition: ctype-tis620.cc:73
thread_local THD * current_thd
Definition: current_thd.cc:26
durability_properties
Definition: dur_prop.h:31
static bool report_error(THD *thd, int error_code, Sql_condition::enum_severity_level level, Args... args)
Definition: error_handler.cc:290
Rows_log_event * binlog_get_pending_rows_event(bool is_transactional) const
This function retrieves a pending row event from a cache which is specified through the parameter is_...
Definition: binlog.cc:8603
bool is_ddl_gtid_compatible()
Definition: binlog.cc:9748
bool is_binlog_cache_empty(bool is_transactional) const
Return true if the statement/transaction cache is currently empty, false otherwise.
Definition: binlog.cc:8330
int binlog_write_row(TABLE *table, bool is_transactional, const uchar *new_data, const unsigned char *extra_row_info)
Definition: binlog.cc:10204
int decide_logging_format(Table_ref *tables)
Decide on logging format to use for the statement and issue errors or warnings as needed.
Definition: binlog.cc:9054
void check_and_emit_warning_for_non_composable_engines(Table_ref *table_ref)
Iterates over the table and call check_and_registered_engine and emits error for non-composable engin...
Definition: binlog.cc:8892
bool binlog_configure_trx_cache_size(ulong new_size)
Configure size of binlog transaction cache.
Definition: binlog.cc:8394
int binlog_update_row(TABLE *table, bool is_transactional, const uchar *old_data, const uchar *new_data, const uchar *extra_row_info)
Definition: binlog.cc:10229
Rows_log_event * binlog_prepare_pending_rows_event(TABLE *table, uint32 serv_id, size_t needed, bool is_transactional, const unsigned char *extra_row_info, uint32 source_part_id=INT_MAX)
Definition: binlog.cc:9908
int binlog_delete_row(TABLE *table, bool is_transactional, const uchar *old_data, const unsigned char *extra_row_info)
Definition: binlog.cc:10302
bool is_dml_gtid_compatible(bool some_transactional_table, bool some_non_transactional_table, bool non_transactional_tables_are_tmp)
is_dml_gtid_compatible() and is_ddl_gtid_compatible() check if the statement that is about to be proc...
Definition: binlog.cc:9830
int binlog_query(enum_binlog_query_type qtype, const char *query, size_t query_len, bool is_trans, bool direct, bool suppress_use, int errcode)
Log the current query.
Definition: binlog.cc:10616
void add_to_binlog_accessed_dbs(const char *db)
Definition: binlog.cc:8631
void issue_unsafe_warnings()
Auxiliary method used by binlog_query() to raise warnings.
Definition: binlog.cc:10558
int binlog_write_table_map(TABLE *table, bool is_transactional, bool binlog_rows_query)
This function writes a table map to the binary log.
Definition: binlog.cc:8558
int binlog_setup_trx_data()
Definition: binlog.cc:8355
const uint32_t UNDEFINED_SERVER_VERSION
Definition: binlog_event.h:160
void unlock_global_read_lock(THD *thd)
Unlock global read lock.
Definition: lock.cc:1089
bool lock_global_read_lock(THD *thd)
Take global read lock, wait if there is protection against lock.
Definition: lock.cc:1049
bool make_global_read_lock_block_commit(THD *thd)
Make global read lock also block commits.
Definition: lock.cc:1118
void set_explicit_lock_duration(THD *thd)
Set explicit duration for metadata locks which are used to implement GRL.
Definition: lock.cc:1146
void my_error(int nr, myf MyFlags,...)
Fill in and print a previously registered error message.
Definition: my_error.cc:216
char * strmake_root(MEM_ROOT *root, const char *str, size_t len)
Definition: my_alloc.cc:286
char * strdup_root(MEM_ROOT *root, const char *str)
Definition: my_alloc.cc:278
void * memdup_root(MEM_ROOT *root, const void *str, size_t len)
Definition: my_alloc.cc:295
MYSQL_PLUGIN_IMPORT CHARSET_INFO * default_charset_info
Definition: charset.cc:181
size_t dirname_length(const char *name)
Get the string length of the directory part of name, including the last FN_LIBCHAR.
Definition: mf_dirname.cc:62
void reset_for_next_command()
Definition: sql_parse.cc:5186
struct PSI_idle_locker PSI_idle_locker
Definition: psi_idle_bits.h:41
unsigned int PSI_stage_key
Instrumented stage key.
Definition: psi_stage_bits.h:43
struct PSI_statement_locker PSI_statement_locker
Definition: psi_statement_bits.h:98
struct PSI_thread PSI_thread
Definition: psi_thread_bits.h:82
struct PSI_transaction_locker PSI_transaction_locker
Definition: psi_transaction_bits.h:41
static constexpr unsigned PSI_INSTRUMENT_ME
Definition: psi_bits.h:43
#define mysql_mutex_assert_not_owner(M)
Wrapper, to use safe_mutex_assert_not_owner with instrumented mutexes.
Definition: mysql_mutex.h:126
#define mysql_mutex_assert_owner(M)
Wrapper, to use safe_mutex_assert_owner with instrumented mutexes.
Definition: mysql_mutex.h:112
#define MYSQL_SET_STATEMENT_TEXT(LOCKER, P1, P2)
Definition: mysql_statement.h:107
#define MYSQL_SET_STATEMENT_QUERY_ID(LOCKER, P1)
Definition: mysql_statement.h:116
static int flags[50]
Definition: hp_test1.cc:40
static int flag
Definition: hp_test1.cc:40
Instrumentation helpers for mysys threads.
#define T
Definition: jit_executor_value.cc:373
struct MYSQL_LEX_CSTRING LEX_CSTRING
Definition: lex_string.h:42
enum_locked_tables_mode
Type of locked tables mode.
Definition: locked_tables_list.h:47
@ LTM_LOCK_TABLES
Definition: locked_tables_list.h:49
@ LTM_PRELOCKED_UNDER_LOCK_TABLES
Definition: locked_tables_list.h:51
@ LTM_NONE
Definition: locked_tables_list.h:48
A better implementation of the UNIX ctype(3) library.
MYSQL_STRINGS_EXPORT CHARSET_INFO my_charset_latin1
Definition: ctype-latin1.cc:365
MYSQL_PLUGIN_IMPORT CHARSET_INFO * system_charset_info
Definition: mysqld.cc:1566
This file follows Google coding style, except for the name MEM_ROOT (which is kept for historical rea...
This file includes constants used by all storage engines.
my_off_t ha_rows
Definition: my_base.h:1217
enum_server_command
A list of all MySQL protocol commands.
Definition: my_command.h:48
Header for compiler-dependent features.
#define SUPPRESS_TSAN
Definition: my_compiler.h:130
#define DBUG_EXECUTE_IF(keyword, a1)
Definition: my_dbug.h:171
#define DBUG_PRINT(keyword, arglist)
Definition: my_dbug.h:181
#define DBUG_TRACE
Definition: my_dbug.h:146
Some integer typedefs for easier portability.
int myf
Definition: my_inttypes.h:94
unsigned long long int ulonglong
Definition: my_inttypes.h:56
ulonglong my_off_t
Definition: my_inttypes.h:72
unsigned char uchar
Definition: my_inttypes.h:52
long long int longlong
Definition: my_inttypes.h:55
#define MYF(v)
Definition: my_inttypes.h:97
uint16_t uint16
Definition: my_inttypes.h:65
uint32_t uint32
Definition: my_inttypes.h:67
Common #defines and includes for file and socket I/O.
#define FN_REFLEN
Definition: my_io.h:87
Defines various enable/disable and HAVE_ macros related to the performance schema instrumentation sys...
enum_sql_command
Definition: my_sqlcommand.h:46
@ SQLCOM_END
Definition: my_sqlcommand.h:213
Common header for many mysys elements.
uint64_t table_map
Definition: my_table_map.h:30
Types to make different thread packages compatible.
pthread_t my_thread_t
Definition: my_thread_bits.h:48
uint32 my_thread_id
Definition: my_thread_local.h:34
static int count
Definition: myisam_ftdump.cc:45
static bool backup
Definition: myisampack.cc:198
unsigned int STDCALL mysql_errno(MYSQL *mysql)
Definition: client.cc:9194
@ SERVER_STATUS_IN_TRANS
Is raised when a multi-statement transaction has been started, either explicitly, by means of BEGIN o...
Definition: mysql_com.h:817
#define SCRAMBLE_LENGTH
Length of random string sent by server on handshake; this is also length of obfuscated password,...
Definition: mysql_com.h:128
Definitions private to the server, used in the networking layer to notify specific events.
Instrumentation helpers for conditions.
ABI for instrumented mutexes.
Instrumentation helpers for statements.
char * user
Definition: mysqladmin.cc:67
const char * host
Definition: mysqladmin.cc:66
void error(const char *format,...)
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1084
std::string format(const routing_guidelines::Session_info &session_info, bool extended_session_info)
Definition: dest_metadata_cache.cc:170
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
Definition: buf0block_hint.cc:30
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:43
Char_string_template< String_type_allocator > String_type
Definition: string_type.h:51
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 empty(const Histogram &histogram)
Return true if 'histogram' was built on an empty table.
Definition: histogram.h:693
Provides atomic access in shared-exclusive modes.
Definition: shared_spin_lock.h:79
size_t size(const char *const c)
Definition: base64.h:46
bool is_active(space_id_t space_id, bool get_latch=true)
Definition: trx0purge.cc:1143
std::set< Key, Compare, ut::allocator< Key > > set
Specialization of set which uses ut_allocator.
Definition: ut0new.h:2884
std::list< T, ut::allocator< T > > list
Specialization of list which uses ut_allocator.
Definition: ut0new.h:2880
This contains the declaration of class Opt_trace_context, which is needed to declare THD.
Performance schema instrumentation (declarations).
Instrumentation helpers for mutexes.
Performance schema instrumentation interface.
Performance schema instrumentation interface.
PSI_memory_key key_memory_THD_handler_tables_hash
Definition: psi_memory_key.cc:94
PSI_memory_key key_memory_user_var_entry
Definition: psi_memory_key.cc:149
PSI_memory_key key_memory_User_level_lock
Definition: psi_memory_key.cc:98
Performance schema instrumentation interface.
Performance schema instrumentation interface.
Performance schema instrumentation interface.
Performance schema instrumentation interface.
#define OPTION_NOT_AUTOCOMMIT
Definition: query_options.h:74
#define OPTION_BEGIN
Definition: query_options.h:75
repeated Source source
Definition: replication_asynchronous_connection_failover.proto:42
required uint64 version
Definition: replication_group_member_actions.proto:41
required string event
Definition: replication_group_member_actions.proto:32
enum_check_fields
Definition: field.h:165
enum_tx_isolation
Definition: handler.h:3256
ha_notification_type
Definition: handler.h:961
char empty_c_string[1]
Definition: sql_class.cc:132
PSI_thread * thd_get_psi(THD *thd)
Get reference to Performance Schema object for THD object.
Definition: sql_thd_api.cc:110
void my_message_sql(uint error, const char *str, myf MyFlags)
All global error messages are sent here where the first one is stored for the client.
Definition: mysqld.cc:3964
void my_eof(THD *thd)
A short cut for thd->get_stmt_da()->set_eof_status().
Definition: sql_class.cc:3834
void thd_enter_stage(void *opaque_thd, const PSI_stage_info *new_stage, PSI_stage_info *old_stage, const char *src_function, const char *src_file, int src_line)
Definition: sql_thd_internal_api.cc:212
bool is_xa_tran_detached_on_prepare(const THD *thd)
Returns true if xa transactions are detached as part of executing XA PREPARE.
Definition: sql_class.h:4981
constexpr size_t PREALLOC_NUM_HA
Definition: sql_class.h:197
void thd_exit_cond(void *opaque_thd, const PSI_stage_info *stage, const char *src_function, const char *src_file, int src_line)
Set thread leaving a condition.
Definition: sql_thd_internal_api.cc:203
std::stack< Event_tracking_data > Event_tracking_data_stack
Definition: sql_class.h:923
bool add_item_to_list(THD *thd, Item *item)
Definition: sql_class.cc:3137
enum_mem_cnt_mode
Definition: sql_class.h:229
@ MEM_CNT_DEFAULT
Memory counter object doesn't update global memory counter and doesn't throw OOM error.
Definition: sql_class.h:234
@ MEM_CNT_GENERATE_ERROR
if MEM_CNT_GENERATE_ERROR is set, memory counter object generates OOM error if any.
Definition: sql_class.h:244
@ MEM_CNT_UPDATE_GLOBAL_COUNTER
if MEM_CNT_UPDATE_GLOBAL_COUNTER is set, memory counter object updates global memory counter.
Definition: sql_class.h:239
@ MEM_CNT_GENERATE_LOG_ERROR
if MEM_CNT_GENERATE_LOG_ERROR is set, memory counter object generates OOM error to error log if any.
Definition: sql_class.h:249
thread_local TDM expected_from_debug_flag
Definition: sql_class.h:203
Secondary_engine_optimization
Enum that represents which phase of secondary engine optimization the current statement is in.
Definition: sql_class.h:709
@ SECONDARY
The current statement should use tables from a secondary storage engine if possible.
@ PRIMARY_ONLY
The current statement should only use tables from primary storage engines.
@ PRIMARY_TENTATIVELY
The current statement should only use tables from the primary storage engine.
bool is_engine_substitution_allowed(const THD *thd)
Check if engine substitution is allowed in the current thread context.
Definition: sql_class.h:4936
void my_ok(THD *thd, ulonglong affected_rows=0, ulonglong id=0, const char *message=nullptr)
A short cut for thd->get_stmt_da()->set_ok_status().
Definition: sql_class.cc:3828
void thd_enter_cond(void *opaque_thd, mysql_cond_t *cond, mysql_mutex_t *mutex, const PSI_stage_info *stage, PSI_stage_info *old_stage, const char *src_function, const char *src_file, int src_line)
Set thread entering a condition.
Definition: sql_thd_internal_api.cc:190
char const * show_system_thread(enum_thread_type thread)
Definition: sql_class.h:760
#define RETURN_NAME_AS_STRING(NAME)
void thd_set_waiting_for_disk_space(void *opaque_thd, const bool waiting)
Definition: sql_thd_internal_api.cc:223
TDM
Definition: sql_class.h:202
@ ZERO
@ NOT_AVAILABLE
unsigned int thd_get_current_thd_terminology_use_previous()
Return @session.terminology_use_previous for the current THD.
Definition: sql_thd_api.cc:738
std::pair< Event_tracking_class, Event_tracking_information * > Event_tracking_data
Definition: sql_class.h:922
void thd_set_psi(THD *thd, PSI_thread *psi)
Set reference to Performance Schema object for THD object.
Definition: sql_thd_api.cc:131
bool is_rpl_source_older(const THD *thd, uint version)
Return if source replication node is older than the given version.
Definition: sql_class.h:4993
bool secondary_engine_lock_tables_mode(const THD &cthd)
Return lock_tables_mode for secondary engine.
Definition: sql_class.h:4912
struct rpl_event_coordinates LOG_POS_COORD
the struct aggregates two parameters that identify an event uniquely in scope of communication of a p...
I_List< Item_change_record > Item_change_list
Definition: sql_class.h:549
File containing constants that can be used throughout the server.
enum_mark_columns
Definition: sql_const.h:232
Event_tracking_class
Event tracking classes If a new event tracking class is introduced, this class should be kept in sync...
Definition: sql_event_tracking_to_audit_event_mapping.h:41
static MEM_ROOT mem
Definition: sql_servers.cc:100
Our own string classes, used pervasively throughout the executor.
case opt name
Definition: sslopt-case.h:29
Definition: binlog.h:89
Definition: m_ctype.h:421
TODO: Move this structure to mysql/binlog/event/control_events.h when we start using C++11.
Definition: rpl_gtid.h:1101
bool is_empty() const
Return true if sidno is zero (and assert that gno is zero too in this case).
Definition: rpl_gtid.h:1126
void clear()
Set both components to 0.
Definition: rpl_gtid.h:1110
void dbug_print(const Tsid_map *tsid_map, const char *text="", bool need_lock=false) const
Print this Gtid to the trace file if debug is enabled; no-op otherwise.
Definition: rpl_gtid.h:1210
rpl_sidno sidno
SIDNO of this Gtid.
Definition: rpl_gtid.h:1105
Storage engine specific thread local data.
Definition: sql_class.h:791
void * ha_ptr_backup
A memorizer to engine specific "native" transaction object to provide storage engine detach-re-attach...
Definition: sql_class.h:807
void * ha_ptr
Storage engine specific thread local data.
Definition: sql_class.h:796
Ha_data()
Definition: sql_class.h:826
plugin_ref lock
NULL: engine is not bound to this thread non-NULL: engine is bound to this thread,...
Definition: sql_class.h:824
Ha_trx_info ha_info[2]
0: Life time: one statement within a transaction.
Definition: sql_class.h:818
Definition: table.h:2798
The LEX object currently serves three different purposes:
Definition: sql_lex.h:3994
Definition: binlog_index.h:86
Metadata lock object key.
Definition: mdl.h:366
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
void * Alloc(size_t length)
Allocate memory.
Definition: my_alloc.h:145
Definition: mysql_lex_string.h:40
const char * str
Definition: mysql_lex_string.h:41
size_t length
Definition: mysql_lex_string.h:42
Definition: mysql_lex_string.h:35
Definition: lock.h:39
Bison "location" class.
Definition: parse_location.h:43
Definition: mysql_com_server.h:59
Definition: mysql_com.h:915
State data storage for start_idle_wait_v1_t.
Definition: psi_idle_bits.h:52
Stage instrument information.
Definition: psi_stage_bits.h:74
Interface for an instrumented stage progress.
Definition: psi_stage_bits.h:63
State data storage for get_thread_statement_locker_v5_t.
Definition: psi_statement_bits.h:166
State data storage for get_thread_transaction_locker_v1_t, get_thread_transaction_locker_v1_t.
Definition: psi_transaction_bits.h:53
Definition: com_data.h:46
Definition: transaction_info.h:46
Per thread status variables.
Definition: system_variables.h:531
ulonglong last_query_partial_plans
Definition: system_variables.h:608
double last_query_cost
Definition: system_variables.h:607
Definition: table.h:1433
Definition: sql_lexer_thd.h:56
sql_mode_t sql_mode
Definition: sql_lexer_thd.h:59
const CHARSET_INFO * character_set_client
Definition: sql_lexer_thd.h:60
An utility struct for Attachable_trx.
Definition: sql_class.h:2032
bool m_in_lock_tables
THD::in_lock_tables value.
Definition: sql_class.h:2071
void backup(THD *thd)
Definition: sql_class.cc:406
ulonglong m_thd_option_bits
THD options.
Definition: sql_class.h:2062
~Transaction_state()
Definition: sql_class.cc:3145
void restore(THD *thd)
Definition: sql_class.cc:423
PSI_transaction_locker * m_transaction_psi
Current transaction instrumentation.
Definition: sql_class.h:2065
Prealloced_array< Ha_data, PREALLOC_NUM_HA > m_ha_data
Ha_data array.
Definition: sql_class.h:2053
uint m_server_status
Server status flags.
Definition: sql_class.h:2068
bool m_time_zone_used
Current time zone (i.e.
Definition: sql_class.h:2082
bool m_transaction_rollback_request
Transaction rollback request flag.
Definition: sql_class.h:2092
Transaction_ctx * m_trx
Transaction_ctx instance.
Definition: sql_class.h:2056
Open_tables_backup m_open_tables_state
Open-tables state.
Definition: sql_class.h:2044
bool m_tx_read_only
Transaction read-only state.
Definition: sql_class.h:2059
sql_mode_t m_sql_mode
SQL_MODE.
Definition: sql_class.h:2047
Transaction_state()
Definition: sql_class.cc:3141
enum_sql_command m_sql_command
SQL-command.
Definition: sql_class.h:2039
Query_tables_list * m_query_tables_list
Definition: sql_class.h:2041
enum_tx_isolation m_tx_isolation
Transaction isolation level.
Definition: sql_class.h:2050
Definition: sql_timer.cc:54
Definition: thr_lock.h:119
For locks with EXPLICIT duration, MDL returns a new ticket every time a lock is granted.
Definition: item_func.cc:5374
Definition: violite.h:320
void * ssl_arg
Definition: violite.h:416
handlerton is a singleton structure - one instance per storage engine - to provide access to storage ...
Definition: handler.h:2784
Replacement of system's struct timeval to ensure we can carry 64 bit values even on a platform which ...
Definition: my_time_t.h:45
An instrumented cond structure.
Definition: mysql_cond_bits.h:50
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:50
Definition: mysql_com.h:1110
Definition: resource_group_basic_types.h:54
Definition: result.h:30
the struct aggregates two parameters that identify an event uniquely in scope of communication of a p...
Definition: sql_class.h:338
my_off_t pos
Definition: sql_class.h:340
char * file_name
Definition: sql_class.h:339
State data storage for digest_start, digest_add_token.
Definition: sql_digest_stream.h:36
Definition: sql_audit.h:56
Definition: sql_plugin_ref.h:45
Definition: mysqlslap.cc:221
Definition: sql_connect.h:70
struct xid_t is binary compatible with the XID structure as in the X/Open CAE Specification,...
Definition: xa.h:83
constexpr sql_mode_t MODE_NO_ENGINE_SUBSTITUTION
Definition: system_variables.h:154
constexpr sql_mode_t MODE_TIME_TRUNCATE_FRACTIONAL
Definition: system_variables.h:161
constexpr sql_mode_t MODE_STRICT_TRANS_TABLES
Definition: system_variables.h:135
enum_binlog_format
Definition: system_variables.h:46
@ BINLOG_FORMAT_MIXED
statement if safe, otherwise row - autodetected
Definition: system_variables.h:47
@ BINLOG_FORMAT_ROW
row-based
Definition: system_variables.h:49
@ BINLOG_FORMAT_STMT
statement-based
Definition: system_variables.h:48
constexpr sql_mode_t MODE_STRICT_ALL_TABLES
Definition: system_variables.h:137
thr_lock_type
Definition: thr_lock.h:51
enum_thread_type
Definition: thread_type.h:34
@ NON_SYSTEM_THREAD
Definition: thread_type.h:35
@ SYSTEM_THREAD_BACKGROUND
Definition: thread_type.h:44
@ SYSTEM_THREAD_INIT_FILE
Definition: thread_type.h:48
@ SYSTEM_THREAD_SLAVE_IO
Definition: thread_type.h:36
@ SYSTEM_THREAD_EVENT_SCHEDULER
Definition: thread_type.h:39
@ SYSTEM_THREAD_COMPRESS_GTID_TABLE
Definition: thread_type.h:43
@ SYSTEM_THREAD_SLAVE_WORKER
Definition: thread_type.h:42
@ SYSTEM_THREAD_DD_RESTART
Definition: thread_type.h:46
@ SYSTEM_THREAD_SERVER_UPGRADE
Definition: thread_type.h:49
@ SYSTEM_THREAD_SERVER_INITIALIZE
Definition: thread_type.h:47
@ SYSTEM_THREAD_SLAVE_SQL
Definition: thread_type.h:37
@ SYSTEM_THREAD_DD_INITIALIZE
Definition: thread_type.h:45
@ SYSTEM_THREAD_INFO_REPOSITORY
Definition: thread_type.h:41
@ SYSTEM_THREAD_EVENT_WORKER
Definition: thread_type.h:40
@ SYSTEM_THREAD_NDBCLUSTER_BINLOG
Definition: thread_type.h:38
Include file for Sun RPC to compile out of the box.
Definition: dtoa.cc:595
Vio Lite.
enum_vio_type
Definition: violite.h:79
#define SSL_handle
Definition: violite.h:454