MySQL  8.0.27
Source Code Documentation
opt_explain.h
Go to the documentation of this file.
1 /* Copyright (c) 2011, 2021, 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 also distributed 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 included with MySQL.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License, version 2.0, for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22 
23 #ifndef OPT_EXPLAIN_INCLUDED
24 #define OPT_EXPLAIN_INCLUDED
25 
26 /**
27  @file sql/opt_explain.h
28  EXPLAIN @<command@>.
29 
30 Single table UPDATE/DELETE commands are explained by the
31 explain_single_table_modification() function.
32 
33 A query expression (complete SELECT query possibly including
34 subqueries and unions), INSERT...SELECT and multitable UPDATE/DELETE
35 commands are explained like this:
36 
37 (1) explain_query_expression()
38 
39 Is the entry point. Forwards the job to explain_query_expression().
40 
41 (2) explain_query_expression()
42 
43 Is for a Query_expression, prepares, optimizes, explains one JOIN for
44 each "top-level" Query_blocks of the unit (like: all SELECTs of a
45 UNION; but not subqueries), and one JOIN for the fake Query_block of
46 UNION); each JOIN explain (JOIN::exec()) calls explain_query_specification()
47 
48 (3) explain_query_specification()
49 
50 Is for a single Query_block (fake or not). It needs a prepared and
51 optimized JOIN, for which it builds the EXPLAIN rows. But it also
52 launches the EXPLAIN process for "inner units" (==subqueries of this
53 Query_block), by calling explain_query_expression() for each of them.
54 */
55 
56 #include "my_base.h"
57 #include "my_sqlcommand.h"
58 #include "my_thread_local.h"
59 #include "sql/opt_explain_format.h"
61 #include "sql/query_result.h" // Query_result_send
62 #include "sql/row_iterator.h"
63 #include "sql/sql_cmd.h" // Sql_cmd
65 #include "sys/types.h"
66 
67 class Item;
68 class JOIN;
69 class QEP_TAB;
70 class Query_block;
71 class Query_expression;
72 class THD;
73 struct AccessPath;
74 struct TABLE;
75 template <class T>
76 class List;
77 class QUICK_SELECT_I;
78 
79 extern const char *join_type_str[];
80 
81 /** Table modification plan for JOIN-less statements (update/delete) */
83  public:
84  THD *const thd; ///< Owning thread
85  const enum_mod_type
86  mod_type; ///< Modification type - MT_INSERT/MT_UPDATE/etc
87  TABLE *table; ///< Table to modify
88 
89  enum join_type type = JT_UNKNOWN;
90  QUICK_SELECT_I *quick{nullptr};
91  Item *condition{nullptr};
92  uint key; ///< Key to use
93  ha_rows limit; ///< Limit
94  bool need_tmp_table; ///< Whether tmp table needs to be used
95  bool need_sort; ///< Whether to use filesort
96  bool used_key_is_modified; ///< Whether the key used to scan is modified
97  const char *message; ///< Arbitrary message
98  bool zero_result; ///< true <=> plan will not be executed
99  ha_rows examined_rows; ///< # of rows expected to be examined in the table
100 
101  Modification_plan(THD *thd_arg, enum_mod_type mt, TABLE *table_arg,
102  enum join_type type_arg, QUICK_SELECT_I *quick_arg,
103  Item *condition_arg, uint key_arg, ha_rows limit_arg,
104  bool need_tmp_table_arg, bool need_sort_arg,
105  bool used_key_is_modified_arg, ha_rows rows);
106 
107  Modification_plan(THD *thd_arg, enum_mod_type mt, TABLE *table_arg,
108  const char *message_arg, bool zero_result_arg,
109  ha_rows rows);
110 
112 
113  private:
114  void register_in_thd();
115 };
116 
117 /**
118  EXPLAIN functionality for Query_result_insert, Query_result_update and
119  Query_result_delete.
120 
121  This class objects substitute Query_result_insert, Query_result_update and
122  Query_result_delete data interceptor objects to implement EXPLAIN for INSERT,
123  REPLACE and multi-table UPDATE and DELETE queries.
124  Query_result_explain class object initializes tables like Query_result_insert,
125  Query_result_update or Query_result_delete data interceptor do, but it
126  suppresses table data modification by the underlying interceptor object.
127  Thus, we can use Query_result_explain object in the context of EXPLAIN INSERT/
128  REPLACE/UPDATE/DELETE query like we use Query_result_send in the context of
129  EXPLAIN SELECT command:
130  1) in presence of lex->describe flag, pass Query_result_explain object to
131  execution function,
132  2) it calls prepare(), optimize() and start_execution() functions
133  to mark modified tables etc.
134 */
135 
137  protected:
138  /**
139  Pointer to underlying Query_result_insert, Query_result_update or
140  Query_result_delete object.
141  */
143 
144  public:
146  Query_result *interceptor_arg)
147  : Query_result_send(), interceptor(interceptor_arg) {
148  unit = unit_arg;
149  }
150 
151  protected:
152  bool prepare(THD *thd, const mem_root_deque<Item *> &list,
153  Query_expression *u) override {
154  return Query_result_send::prepare(thd, list, u) ||
155  interceptor->prepare(thd, list, u);
156  }
157 
158  bool start_execution(THD *thd) override {
161  }
162 
163  bool optimize() override {
165  }
166 
167  void cleanup(THD *thd) override {
169  interceptor->cleanup(thd);
170  }
171 };
172 
173 bool explain_no_table(THD *explain_thd, const THD *query_thd,
174  Query_block *query_block, const char *message,
176 bool explain_single_table_modification(THD *explain_thd, const THD *query_thd,
177  const Modification_plan *plan,
178  Query_block *select);
179 bool explain_query(THD *explain_thd, const THD *query_thd,
180  Query_expression *unit);
181 bool explain_query_specification(THD *explain_thd, const THD *query_thd,
182  Query_block *query_block,
184 
185 class Sql_cmd_explain_other_thread final : public Sql_cmd {
186  public:
188  : m_thread_id(thread_id) {}
189 
191  return SQLCOM_EXPLAIN_OTHER;
192  }
193 
194  bool execute(THD *thd) override;
195 
196  private:
197  /// connection_id in EXPLAIN FOR CONNECTION <connection_id>
199 };
200 
201 #endif /* OPT_EXPLAIN_INCLUDED */
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:802
Definition: sql_optimizer.h:125
Definition: sql_list.h:431
Table modification plan for JOIN-less statements (update/delete)
Definition: opt_explain.h:82
TABLE * table
Table to modify.
Definition: opt_explain.h:87
ha_rows limit
Limit.
Definition: opt_explain.h:93
QUICK_SELECT_I * quick
Definition: opt_explain.h:90
THD *const thd
Owning thread.
Definition: opt_explain.h:84
const enum_mod_type mod_type
Modification type - MT_INSERT/MT_UPDATE/etc.
Definition: opt_explain.h:86
uint key
Key to use.
Definition: opt_explain.h:92
bool need_sort
Whether to use filesort.
Definition: opt_explain.h:95
Item * condition
Definition: opt_explain.h:91
bool zero_result
true <=> plan will not be executed
Definition: opt_explain.h:98
void register_in_thd()
Definition: opt_explain.cc:2451
enum join_type type
Definition: opt_explain.h:89
Modification_plan(THD *thd_arg, enum_mod_type mt, TABLE *table_arg, enum join_type type_arg, QUICK_SELECT_I *quick_arg, Item *condition_arg, uint key_arg, ha_rows limit_arg, bool need_tmp_table_arg, bool need_sort_arg, bool used_key_is_modified_arg, ha_rows rows)
Modification_plan's constructor, to represent that we will use an access method on the table.
Definition: opt_explain.cc:2485
bool used_key_is_modified
Whether the key used to scan is modified.
Definition: opt_explain.h:96
ha_rows examined_rows
Definition: opt_explain.h:99
~Modification_plan()
Definition: opt_explain.cc:2544
bool need_tmp_table
Whether tmp table needs to be used.
Definition: opt_explain.h:94
const char * message
Arbitrary message.
Definition: opt_explain.h:97
Definition: sql_executor.h:256
Definition: range_optimizer.h:221
This class represents a query block, aka a query specification, which is a query consisting of a SELE...
Definition: sql_lex.h:1123
This class represents a query expression (one query block or several query blocks combined with UNION...
Definition: sql_lex.h:629
EXPLAIN functionality for Query_result_insert, Query_result_update and Query_result_delete.
Definition: opt_explain.h:136
bool prepare(THD *thd, const mem_root_deque< Item * > &list, Query_expression *u) override
Perform preparation specific to the query expression or DML statement.
Definition: opt_explain.h:152
bool start_execution(THD *thd) override
Prepare for execution of the query expression or DML statement.
Definition: opt_explain.h:158
void cleanup(THD *thd) override
Cleanup after this execution.
Definition: opt_explain.h:167
Query_result_explain(Query_expression *unit_arg, Query_result *interceptor_arg)
Definition: opt_explain.h:145
Query_result * interceptor
Pointer to underlying Query_result_insert, Query_result_update or Query_result_delete object.
Definition: opt_explain.h:142
bool optimize() override
Optimize the result processing of a query expression, applicable to data change operation (not simple...
Definition: opt_explain.h:163
Definition: query_result.h:211
void cleanup(THD *) override
Cleanup after this execution.
Definition: query_result.h:227
Definition: query_result.h:55
virtual bool prepare(THD *, const mem_root_deque< Item * > &, Query_expression *u)
Perform preparation specific to the query expression or DML statement.
Definition: query_result.h:96
virtual bool optimize()
Optimize the result processing of a query expression, applicable to data change operation (not simple...
Definition: query_result.h:108
virtual void cleanup(THD *)
Cleanup after this execution.
Definition: query_result.h:162
Query_expression * unit
Definition: query_result.h:57
virtual bool start_execution(THD *)
Prepare for execution of the query expression or DML statement.
Definition: query_result.h:119
Definition: opt_explain.h:185
my_thread_id m_thread_id
connection_id in EXPLAIN FOR CONNECTION <connection_id>
Definition: opt_explain.h:198
bool execute(THD *thd) override
Entry point for EXPLAIN CONNECTION: locates the connection by its ID, takes proper locks,...
Definition: opt_explain.cc:2344
Sql_cmd_explain_other_thread(my_thread_id thread_id)
Definition: opt_explain.h:187
enum_sql_command sql_command_code() const override
Return the command code for this statement.
Definition: opt_explain.h:190
Representation of an SQL command.
Definition: sql_cmd.h:64
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_class.h:821
This file includes constants used by all storage engines.
my_off_t ha_rows
Definition: my_base.h:1138
enum_sql_command
Definition: my_sqlcommand.h:45
@ SQLCOM_EXPLAIN_OTHER
Definition: my_sqlcommand.h:181
static my_thread_id thread_id
Definition: my_thr_init.cc:62
uint32 my_thread_id
Definition: my_thread_local.h:33
const char * join_type_str[]
Definition: opt_explain.cc:113
bool explain_no_table(THD *explain_thd, const THD *query_thd, Query_block *query_block, const char *message, enum_parsing_context ctx)
Send a message as an "extra" column value.
Definition: opt_explain.cc:1775
bool explain_query_specification(THD *explain_thd, const THD *query_thd, Query_block *query_block, enum_parsing_context ctx)
Explain query_block's join.
Definition: opt_explain.cc:1924
bool explain_query(THD *explain_thd, const THD *query_thd, Query_expression *unit)
EXPLAIN handling for SELECT, INSERT/REPLACE SELECT, and multi-table UPDATE/DELETE queries.
Definition: opt_explain.cc:2161
bool explain_single_table_modification(THD *explain_thd, const THD *query_thd, const Modification_plan *plan, Query_block *select)
EXPLAIN handling for single-table UPDATE and DELETE queries.
Definition: opt_explain.cc:1830
EXPLAIN FORMAT=<format> <command>.
enum_mod_type
Definition: opt_explain_format.h:134
enum_parsing_context
Names for different query parse tree parts.
Definition: parse_tree_node_base.h:55
Representation of an SQL command.
Common types of the Optimizer, used by optimization and execution.
join_type
Definition: sql_opt_exec_shared.h:178
@ JT_UNKNOWN
Definition: sql_opt_exec_shared.h:180
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:176
Definition: table.h:1394
unsigned int uint
Definition: uca-dump.cc:29