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