MySQL 9.1.0
Source Code Documentation
|
API for the Optimizer trace (WL#5257) More...
#include <limits.h>
#include <string.h>
#include <sys/types.h>
#include "my_compiler.h"
#include "my_inttypes.h"
#include "my_sqlcommand.h"
#include "sql/opt_trace_context.h"
Go to the source code of this file.
Classes | |
struct | Opt_trace_info |
User-visible information about a trace. More... | |
class | Opt_trace_iterator |
Iterator over the list of remembered traces. More... | |
class | Opt_trace_struct |
Object and array are both "structured data" and have lots in common, so the Opt_trace_struct is a base class for them. More... | |
class | Opt_trace_object |
A JSON object (unordered set of key/value pairs). More... | |
class | Opt_trace_array |
A JSON array (ordered set of values). More... | |
class | Opt_trace_disable_I_S |
Instantiate an instance of this class for specific cases where optimizer trace, in a certain section of Optimizer code, should write only to DBUG and not I_S. More... | |
class | Opt_trace_start |
Helpers connecting the optimizer trace to THD or Information Schema. | |
#define | OPT_TRACE_TRANSFORM(trace, object_level0, object_level1, select_number, from, to) |
Helper for defining query-transformation-related trace objects in one code line. More... | |
void | opt_trace_print_expanded_query (const THD *thd, Query_block *query_block, Opt_trace_object *trace_object) |
Prints SELECT query to optimizer trace. More... | |
void | opt_trace_disable_if_no_security_context_access (THD *thd) |
If the security context is not that of the connected user, inform the trace system that a privilege is missing. More... | |
void | opt_trace_disable_if_no_view_access (THD *thd, Table_ref *view, Table_ref *underlying_tables) |
If tracing is on, checks additional privileges for a view, to make sure that the user has the right to do SHOW CREATE VIEW. More... | |
void | opt_trace_disable_if_no_stored_proc_func_access (THD *thd, sp_head *sp) |
If tracing is on, checks additional privileges on a stored routine, to make sure that the user has the right to do SHOW CREATE PROCEDURE/FUNCTION. More... | |
int | fill_optimizer_trace_info (THD *thd, Table_ref *tables, Item *) |
Fills information_schema.OPTIMIZER_TRACE with rows (one per trace) More... | |
API for the Optimizer trace (WL#5257)
#define OPT_TRACE_TRANSFORM | ( | trace, | |
object_level0, | |||
object_level1, | |||
select_number, | |||
from, | |||
to | |||
) |
Helper for defining query-transformation-related trace objects in one code line.
This produces { "transformation": { "select#": <select_number>, "from": <from>, "to": <to> The objects are left open, so that one can add more to them (often a "chosen" property after making some computation). Objects get closed when going out of scope as usual.
trace | optimizer trace |
object_level0 | name of the outer Opt_trace_object C++ object |
object_level1 | name of the inner Opt_trace_object C++ object |
select_number | number of the being-transformed Query_block |
from | description of the before-transformation state |
to | description of the after-transformation state |
Fills information_schema.OPTIMIZER_TRACE with rows (one per trace)
0 | ok |
1 | error |
void opt_trace_disable_if_no_security_context_access | ( | THD * | thd | ) |
If the security context is not that of the connected user, inform the trace system that a privilege is missing.
With one exception: see below.
thd | the THD |
This serves to eliminate the following issue. Any information readable by a SELECT may theoretically end up in the trace. And a SELECT may read information from other places than tables:
Instead, our chosen simpler solution is that if we see a security context change where SUID user is not the connected user, we disable tracing. With only one safe exception: if the connected user has all global privileges (because then she/he can find any information anyway). By "all global privileges" we mean everything but WITH GRANT OPTION (that latter one isn't related to information gathering).
Read access to I_S.OPTIMIZER_TRACE by another user than the connected user is restricted:
If tracing is on, checks additional privileges on a stored routine, to make sure that the user has the right to do SHOW CREATE PROCEDURE/FUNCTION.
For that, we use the same checks as in those SHOW commands. If a privilege is missing, notifies the trace system.
This function is not redundant with opt_trace_disable_if_no_security_context_access(). Indeed, for a SQL SECURITY INVOKER routine, there is no context change, but we must still verify that the invoker can do SHOW CREATE.
For triggers, see note in sp_head::execute_trigger().
thd | The THD |
sp | routine to check |
void opt_trace_disable_if_no_view_access | ( | THD * | thd, |
Table_ref * | view, | ||
Table_ref * | underlying_tables | ||
) |
If tracing is on, checks additional privileges for a view, to make sure that the user has the right to do SHOW CREATE VIEW.
For that:
thd | THD context |
view | view to check |
underlying_tables | underlying tables/views of 'view' |
void opt_trace_print_expanded_query | ( | const THD * | thd, |
Query_block * | query_block, | ||
Opt_trace_object * | trace_object | ||
) |
Prints SELECT query to optimizer trace.
It is not the original query (as in Opt_trace_context::set_query()
) but a printout of the parse tree (Item-s).
thd | the THD |
query_block | query's parse tree |
trace_object | Opt_trace_object to which the query will be added |
It's hard to prove that Query_block::print() doesn't modify any of its Item-s in a dangerous way. Item_int::print(), for example, modifies its internal str_value. To make the danger rare, we print the expanded query as rarely as possible: only if I_S output is needed. If only –debug is on, we don't print it. See also the corresponding call to "set_items_ref_array" at end of JOIN::exec().