MySQL 8.0.29
Source Code Documentation
sql_opt_exec_shared.h
Go to the documentation of this file.
1/* Copyright (c) 2014, 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/**
24 @file sql/sql_opt_exec_shared.h
25 Common types of the Optimizer, used by optimization and execution.
26*/
27
28#ifndef SQL_OPT_EXEC_SHARED_INCLUDED
29#define SQL_OPT_EXEC_SHARED_INCLUDED
30
31#include <assert.h>
32#include "my_base.h"
33
34#include "sql/item.h"
35
36class JOIN;
37class Item_func_match;
38class store_key;
39struct POSITION;
40
41/**
42 This represents the index of a JOIN_TAB/QEP_TAB in an array. "plan_idx":
43 "Plan Table Index". It is signed, because:
44 - firstmatch_return may be PRE_FIRST_PLAN_IDX (it can happen that the first
45 table of the plan uses FirstMatch: SELECT ... WHERE literal IN (SELECT
46 ...)).
47 - it must hold the invalid value NO_PLAN_IDX (which means "no
48 JOIN_TAB/QEP_TAB", equivalent of NULL pointer); this invalid value must
49 itself be different from PRE_FIRST_PLAN_IDX, to distinguish "FirstMatch to
50 before-first-table" (firstmatch_return==PRE_FIRST_PLAN_IDX) from "No
51 FirstMatch" (firstmatch_return==NO_PLAN_IDX).
52*/
53using plan_idx = int;
54#define NO_PLAN_IDX (-2) ///< undefined index
55#define PRE_FIRST_PLAN_IDX \
56 (-1) ///< right before the first (first's index is 0)
57
58struct TABLE_REF {
59 bool key_err;
60 uint key_parts; ///< num of ...
61 uint key_length; ///< length of key_buff
62 int key; ///< key no
63 uchar *key_buff; ///< value to look for with key
64 uchar *key_buff2; ///< key_buff+key_length
65 /**
66 Used to store the value from each keypart field. These values are
67 used for ref access. If key_copy[key_part] == NULL it means that
68 the value is constant and does not need to be reevaluated
69 */
71 Item **items; ///< val()'s for each keypart
72 /*
73 Array of pointers to trigger variables. Some/all of the pointers may be
74 NULL. The ref access can be used iff
75
76 for each used key part i, (!cond_guards[i] || *cond_guards[i])
77
78 This array is used by subquery code. The subquery code may inject
79 triggered conditions, i.e. conditions that can be 'switched off'. A ref
80 access created from such condition is not valid when at least one of the
81 underlying conditions is switched off (see subquery code for more details).
82 If a table in a subquery has this it means that the table access
83 will switch from ref access to table scan when the outer query
84 produces a NULL value to be checked for in the subquery. This will
85 be used by NOT IN subqueries and IN subqueries which need to distinguish
86 NULL and FALSE, where ignore_unknown() is false.
87 */
89 /**
90 @code (null_rejecting & (1<<i)) @endcode means the condition is '=' and no
91 matching rows will be produced if items[i] IS NULL (see
92 add_not_null_conds())
93 */
95 table_map depend_map; ///< Table depends on these tables.
96 /*
97 NULL byte position in the key_buf (if set, the key is taken to be NULL);
98 normally points to the first byte in the buffer. Used for REF_OR_NULL
99 lookups.
100 */
102 /*
103 The number of times the record associated with this key was used
104 in the join.
105 */
107
108 /*
109 true <=> disable the "cache" as doing lookup with the same key value may
110 produce different results (because of Index Condition Pushdown)
111 */
113
114 /*
115 If non-nullptr, all the fields are hashed together through functions
116 in store_key (with the result being put into this field), as opposed to
117 being matched against individual fields in the associated KEY's key parts.
118 */
120
122 : key_err(true),
123 key_parts(0),
124 key_length(0),
125 key(-1),
129 items(nullptr),
132 depend_map(0),
134 use_count(0),
135 disable_cache(false) {}
136
137 /**
138 @returns whether the reference contains NULL values which could never give
139 a match.
140 */
141 bool impossible_null_ref() const {
142 if (null_rejecting == 0) return false;
143 for (uint i = 0; i < key_parts; i++) {
144 if ((null_rejecting & 1 << i) && items[i]->is_null()) {
145 return true;
146 }
147 }
148 return false;
149 }
150
151 /**
152 Check if there are triggered/guarded conditions that might be
153 'switched off' by the subquery code when executing 'Full scan on
154 NULL key' subqueries.
155
156 @return true if there are guarded conditions, false otherwise
157 */
158
159 bool has_guarded_conds() const {
160 assert(key_parts == 0 || cond_guards != nullptr);
161
162 for (uint i = 0; i < key_parts; i++) {
163 if (cond_guards[i]) return true;
164 }
165 return false;
166 }
167};
168
169struct CACHE_FIELD;
170class QEP_operation;
171class Filesort;
173
174/*
175 The structs which holds the join connections and join states
176*/
178 /* Initial state. Access type has not yet been decided for the table */
180 /* Table has exactly one row */
182 /*
183 Table has at most one matching row. Values read
184 from this row can be treated as constants. Example:
185 "WHERE table.pk = 3"
186 */
188 /*
189 '=' operator is used on unique index. At most one
190 row is read for each combination of rows from
191 preceding tables
192 */
194 /*
195 '=' operator is used on non-unique index
196 */
198 /*
199 Full table scan.
200 */
202 /*
203 Range scan.
204 */
206 /*
207 Like table scan, but scans index leaves instead of
208 the table
209 */
211 /* Fulltext index is used */
213 /*
214 Like ref, but with extra search for NULL values.
215 E.g. used for "WHERE col = ... OR col IS NULL"
216 */
218 /*
219 Do multiple range scans over one table and combine
220 the results into one. The merge can be used to
221 produce unions and intersections
222 */
225
226/// Holds members common to JOIN_TAB and QEP_TAB.
228 public:
230 : m_join(nullptr),
240 m_ref(),
241 m_index(0),
244 m_keys(),
245 m_records(0),
250
251 /*
252 Simple getters and setters. They are public. However, this object is
253 protected in QEP_shared_owner, so only that class and its children
254 (JOIN_TAB, QEP_TAB) can access the getters and setters.
255 */
256
257 JOIN *join() const { return m_join; }
258 void set_join(JOIN *j) { m_join = j; }
259 plan_idx idx() const {
260 assert(m_idx >= 0); // Index must be valid
261 return m_idx;
262 }
264 assert(m_idx == NO_PLAN_IDX); // Index should not change in lifetime
265 m_idx = i;
266 }
267 TABLE *table() const { return m_table; }
268 void set_table(TABLE *t) { m_table = t; }
269 POSITION *position() const { return m_position; }
283 TABLE_REF &ref() { return m_ref; }
284 uint index() const { return m_index; }
285 void set_index(uint i) { m_index = i; }
286 enum join_type type() const { return m_type; }
287 void set_type(enum join_type t) { m_type = t; }
288 Item *condition() const { return m_condition; }
292 }
295 }
296 Key_map &keys() { return m_keys; }
297 ha_rows records() const { return m_records; }
299 AccessPath *range_scan() const { return m_range_scan; }
303 Item_func_match *ft_func() const { return m_ft_func; }
305
306 // More elaborate functions:
307
308 /**
309 Set available tables for a table in a join plan.
310
311 @param prefix_tables_arg Set of tables available for this plan
312 @param prev_tables_arg Set of tables available for previous table, used to
313 calculate set of tables added for this table.
314 */
315 void set_prefix_tables(table_map prefix_tables_arg,
316 table_map prev_tables_arg) {
317 prefix_tables_map = prefix_tables_arg;
318 added_tables_map = prefix_tables_arg & ~prev_tables_arg;
319 }
320
321 /**
322 Add an available set of tables for a table in a join plan.
323
324 @param tables Set of tables added for this table in plan.
325 */
327 prefix_tables_map |= tables;
328 added_tables_map |= tables;
329 }
330
332
334 return m_first_inner != NO_PLAN_IDX;
335 }
338 }
340 return m_first_inner == m_idx && m_last_inner == m_idx;
341 }
342
345 }
346
348
349 private:
351
352 /**
353 Index of structure in array:
354 - NO_PLAN_IDX if before get_best_combination()
355 - index of pointer to this JOIN_TAB, in JOIN::best_ref array
356 - index of this QEP_TAB, in JOIN::qep array.
357 */
359
360 /// Corresponding table. Might be an internal temporary one.
362
363 /// Points into best_positions array. Includes cost info.
365
366 /*
367 semijoin-related members.
368 */
369
370 /**
371 Struct needed for materialization of semi-join. Set for a materialized
372 temporary table, and NULL for all other join_tabs (except when
373 materialization is in progress, @see join_materialize_semijoin()).
374 */
376
377 /**
378 Boundaries of semijoin inner tables around this table. Valid only once
379 final QEP has been chosen. Depending on the strategy, they may define an
380 interval (all tables inside are inner of a semijoin) or
381 not. last_sj_inner is not set for Duplicates Weedout.
382 */
384
385 /*
386 outer-join-related members.
387 */
388 plan_idx m_first_inner; ///< first inner table for including outer join
389 plan_idx m_last_inner; ///< last table table for embedding outer join
390 plan_idx m_first_upper; ///< first inner table for embedding outer join
391
392 /**
393 Used to do index-based look up based on a key value.
394 Used when we read constant tables, in misc optimization (like
395 remove_const()), and in execution.
396 */
398
399 /// ID of index used for index scan or semijoin LooseScan
401
402 /// Type of chosen access method (scan, etc).
404
405 /**
406 Table condition, ie condition to be evaluated for a row from this table.
407 Notice that the condition may refer to rows from previous tables in the
408 join prefix, as well as outer tables.
409 */
411
412 /**
413 Whether the condition in m_condition is evaluated in front of a sort,
414 so that it does not need to be evaluated again (unless it is outer to
415 an inner join; see the relevant comments in SortingIterator::Init().
416
417 Note that m_condition remains non-nullptr in this case, for purposes
418 of the (non-tree) EXPLAIN and for filesort to build up its read maps.
419 */
421
422 /**
423 All keys with can be used.
424 Used by add_key_field() (optimization time) and execution of dynamic
425 range (DynamicRangeIterator), and EXPLAIN.
426 */
428
429 /**
430 Either number of rows in the table or 1 for const table.
431 Used in optimization, and also in execution for FOUND_ROWS().
432 */
434
435 /**
436 Non-NULL if quick-select used.
437 Filled in optimization, converted to a RowIterator before execution
438 (used to find rows), and in EXPLAIN.
439 */
441
442 /*
443 Maps below are shared because of dynamic range: in execution, it needs to
444 know the prefix tables, to find the possible QUICK methods.
445 */
446
447 /**
448 The set of all tables available in the join prefix for this table,
449 including the table handled by this JOIN_TAB.
450 */
452 /**
453 The set of tables added for this table, compared to the previous table
454 in the join prefix.
455 */
457
458 /** FT function */
460
461 /**
462 Set if index dive can be skipped for this query.
463 See comments for check_skip_records_in_range_qualification.
464 */
466};
467
468/// Owner of a QEP_shared; parent of JOIN_TAB and QEP_TAB.
470 public:
472
473 /// Instructs to share the QEP_shared with another owner
474 void share_qs(QEP_shared_owner *other) { other->set_qs(m_qs); }
476 assert(!m_qs);
477 m_qs = q;
478 }
479
480 // Getters/setters forwarding to QEP_shared:
481
482 JOIN *join() const { return m_qs ? m_qs->join() : nullptr; }
483 void set_join(JOIN *j) { return m_qs->set_join(j); }
484
485 // NOTE: This index (and the associated map) is not the same as
486 // table_ref's index, which is the index in the original FROM list
487 // (before optimization).
488 plan_idx idx() const { return m_qs->idx(); }
489 void set_idx(plan_idx i) { return m_qs->set_idx(i); }
491 assert(m_qs->idx() < static_cast<plan_idx>(CHAR_BIT * sizeof(qep_tab_map)));
492 return qep_tab_map{1} << m_qs->idx();
493 }
494
495 TABLE *table() const { return m_qs->table(); }
496 POSITION *position() const { return m_qs->position(); }
500 return m_qs->set_sj_mat_exec(s);
501 }
504 plan_idx first_inner() const { return m_qs->first_inner(); }
505 plan_idx last_inner() const { return m_qs->last_inner(); }
506 plan_idx first_upper() const { return m_qs->first_upper(); }
512 TABLE_REF &ref() const { return m_qs->ref(); }
513 uint index() const { return m_qs->index(); }
514 void set_index(uint i) { return m_qs->set_index(i); }
515 enum join_type type() const { return m_qs->type(); }
516 void set_type(enum join_type t) { return m_qs->set_type(t); }
517 Item *condition() const { return m_qs->condition(); }
518 void set_condition(Item *to) { return m_qs->set_condition(to); }
521 }
524 }
525 Key_map &keys() const { return m_qs->keys(); }
526 ha_rows records() const { return m_qs->records(); }
527 void set_records(ha_rows r) { return m_qs->set_records(r); }
528 AccessPath *range_scan() const { return m_qs->range_scan(); }
532 Item_func_match *ft_func() const { return m_qs->ft_func(); }
535 return m_qs->set_prefix_tables(prefix_tables, prev_tables);
536 }
538 return m_qs->add_prefix_tables(tables);
539 }
542 }
545 }
548 }
551 }
552
553 bool has_guarded_conds() const { return ref().has_guarded_conds(); }
554 bool and_with_condition(Item *tmp_cond);
555
558 }
559
561
562 void qs_cleanup();
563
564 protected:
565 QEP_shared *m_qs; // qs stands for Qep_Shared
566};
567
568/**
569 Symbolic slice numbers into JOIN's arrays ref_items, tmp_fields and
570 tmp_all_fields
571
572 See also the comments on JOIN::ref_items.
573*/
574enum {
575 /**
576 The slice which is used during evaluation of expressions; Item_ref::ref
577 points there. This is the only slice that is not allocated on the heap;
578 it always points to query_block->base_ref_items.
579
580 If we have a simple query (no temporary tables or GROUP BY needed),
581 this slice always contains the base slice, i.e., the actual Items used
582 in the original query.
583
584 However, if we have temporary tables, there are cases where we need to
585 swap out those Items, because they refer to Fields that are no longer in
586 use. As a simple case, consider
587
588 SELECT REVERSE(t1), COUNT(*) FROM t1 GROUP BY REVERSE(t1);
589
590 Assuming no index on t1, this will require creating a temporary table
591 consisting only of REVERSE(t1), and then sorting it before grouping.
592 During execution of the query creating the temporary table, we will
593 have an Item_func_reverse pointing to a Field for t1, and the result of
594 this will be stored in the temporary table "tmp". However, when reading
595 from "tmp", it would be wrong to use that Item_func_reverse, as the Field
596 no longer exists. Thus, we create a slice (in REF_SLICE_TMP1) with new Item
597 pointers, where Item_func_reverse is replaced by an Item_field that reads
598 from the right field in the temporary table. Similar logic applies for
599 windowing functions etc.; see below.
600
601 In such cases, the pointers in this slice are _overwritten_ (using memcpy)
602 by e.g. REF_SLICE_TMP1 for as long as we read from the temporary table.
603 Switch_ref_item_slice provides an encapsulation of the overwriting,
604 and the optimizer stores a copy of the original Item pointers in the
605 REF_SLICE_SAVED_BASE slice so that it is possible to copy them back
606 when we are done.
607
608 @todo It would probably be better to store the active slice index in
609 current_thd and do the indirection in Item_ref_* instead of copying the
610 slices around.
611 */
613 /**
614 The slice with pointers to columns of 1st group-order-distinct tmp
615 table
616 */
618 /**
619 The slice with pointers to columns of 2nd group-order-distinct tmp
620 table
621 */
623 /**
624 The slice with pointers to columns of table(s), ie., the actual Items.
625 Only used for queries involving temporary tables or the likes; for simple
626 queries, they always live in REF_SLICE_ACTIVE, so we don't need a copy
627 here. See REF_SLICE_ACTIVE for more discussion.
628 */
630 /**
631 The slice with pointers to columns of 1st tmp table of windowing
632 */
635
636#endif // SQL_OPT_EXEC_SHARED_INCLUDED
Definition: sql_bitmap.h:137
Sorting related info.
Definition: filesort.h:51
Definition: item_func.h:3447
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:802
Definition: sql_optimizer.h:125
Owner of a QEP_shared; parent of JOIN_TAB and QEP_TAB.
Definition: sql_opt_exec_shared.h:469
void set_first_inner(plan_idx i)
Definition: sql_opt_exec_shared.h:507
void set_position(POSITION *p)
Definition: sql_opt_exec_shared.h:497
void set_prefix_tables(table_map prefix_tables, table_map prev_tables)
Definition: sql_opt_exec_shared.h:534
JOIN * join() const
Definition: sql_opt_exec_shared.h:482
void set_type(enum join_type t)
Definition: sql_opt_exec_shared.h:516
TABLE * table() const
Definition: sql_opt_exec_shared.h:495
Key_map & keys() const
Definition: sql_opt_exec_shared.h:525
QEP_shared * m_qs
Definition: sql_opt_exec_shared.h:565
bool is_single_inner_for_outer_join() const
Definition: sql_opt_exec_shared.h:549
plan_idx first_upper() const
Definition: sql_opt_exec_shared.h:506
void set_condition(Item *to)
Definition: sql_opt_exec_shared.h:518
qep_tab_map idx_map() const
Definition: sql_opt_exec_shared.h:490
plan_idx first_sj_inner() const
Definition: sql_opt_exec_shared.h:502
bool is_first_inner_for_outer_join() const
Definition: sql_opt_exec_shared.h:546
AccessPath * range_scan() const
Definition: sql_opt_exec_shared.h:528
TABLE_REF & ref() const
Definition: sql_opt_exec_shared.h:512
bool is_single_inner_of_semi_join() const
Definition: sql_opt_exec_shared.h:540
void set_skip_records_in_range(bool skip_records_in_range)
Definition: sql_opt_exec_shared.h:556
void set_first_sj_inner(plan_idx i)
Definition: sql_opt_exec_shared.h:509
Semijoin_mat_exec * sj_mat_exec() const
Definition: sql_opt_exec_shared.h:498
uint index() const
Definition: sql_opt_exec_shared.h:513
void set_qs(QEP_shared *q)
Definition: sql_opt_exec_shared.h:475
plan_idx first_inner() const
Definition: sql_opt_exec_shared.h:504
bool is_inner_table_of_outer_join() const
Definition: sql_opt_exec_shared.h:543
void set_last_inner(plan_idx i)
Definition: sql_opt_exec_shared.h:508
void set_range_scan(AccessPath *q)
Definition: sql_opt_exec_shared.h:529
void set_ft_func(Item_func_match *f)
Definition: sql_opt_exec_shared.h:533
void set_first_upper(plan_idx i)
Definition: sql_opt_exec_shared.h:511
void set_records(ha_rows r)
Definition: sql_opt_exec_shared.h:527
ha_rows records() const
Definition: sql_opt_exec_shared.h:526
table_map prefix_tables() const
Definition: sql_opt_exec_shared.h:530
bool has_guarded_conds() const
Definition: sql_opt_exec_shared.h:553
QEP_shared_owner()
Definition: sql_opt_exec_shared.h:471
void set_join(JOIN *j)
Definition: sql_opt_exec_shared.h:483
bool skip_records_in_range() const
Definition: sql_opt_exec_shared.h:560
bool condition_is_pushed_to_sort() const
Definition: sql_opt_exec_shared.h:519
void mark_condition_as_pushed_to_sort()
Definition: sql_opt_exec_shared.h:522
Item * condition() const
Definition: sql_opt_exec_shared.h:517
enum join_type type() const
Definition: sql_opt_exec_shared.h:515
void share_qs(QEP_shared_owner *other)
Instructs to share the QEP_shared with another owner.
Definition: sql_opt_exec_shared.h:474
plan_idx last_inner() const
Definition: sql_opt_exec_shared.h:505
plan_idx idx() const
Definition: sql_opt_exec_shared.h:488
void add_prefix_tables(table_map tables)
Definition: sql_opt_exec_shared.h:537
void set_idx(plan_idx i)
Definition: sql_opt_exec_shared.h:489
POSITION * position() const
Definition: sql_opt_exec_shared.h:496
void set_index(uint i)
Definition: sql_opt_exec_shared.h:514
void set_sj_mat_exec(Semijoin_mat_exec *s)
Definition: sql_opt_exec_shared.h:499
Item_func_match * ft_func() const
Definition: sql_opt_exec_shared.h:532
table_map added_tables() const
Definition: sql_opt_exec_shared.h:531
plan_idx last_sj_inner() const
Definition: sql_opt_exec_shared.h:503
void set_last_sj_inner(plan_idx i)
Definition: sql_opt_exec_shared.h:510
Holds members common to JOIN_TAB and QEP_TAB.
Definition: sql_opt_exec_shared.h:227
bool m_skip_records_in_range
Set if index dive can be skipped for this query.
Definition: sql_opt_exec_shared.h:465
table_map added_tables() const
Definition: sql_opt_exec_shared.h:302
void set_join(JOIN *j)
Definition: sql_opt_exec_shared.h:258
plan_idx m_first_sj_inner
Boundaries of semijoin inner tables around this table.
Definition: sql_opt_exec_shared.h:383
QEP_shared()
Definition: sql_opt_exec_shared.h:229
JOIN * m_join
Definition: sql_opt_exec_shared.h:350
bool is_first_inner_for_outer_join() const
Definition: sql_opt_exec_shared.h:331
Item_func_match * m_ft_func
FT function.
Definition: sql_opt_exec_shared.h:459
bool is_single_inner_of_outer_join() const
Definition: sql_opt_exec_shared.h:339
Semijoin_mat_exec * sj_mat_exec() const
Definition: sql_opt_exec_shared.h:271
plan_idx m_idx
Index of structure in array:
Definition: sql_opt_exec_shared.h:358
void set_last_sj_inner(plan_idx i)
Definition: sql_opt_exec_shared.h:279
void set_first_sj_inner(plan_idx i)
Definition: sql_opt_exec_shared.h:278
AccessPath * m_range_scan
Non-NULL if quick-select used.
Definition: sql_opt_exec_shared.h:440
plan_idx m_last_inner
last table table for embedding outer join
Definition: sql_opt_exec_shared.h:389
plan_idx first_inner()
Definition: sql_opt_exec_shared.h:275
TABLE_REF m_ref
Used to do index-based look up based on a key value.
Definition: sql_opt_exec_shared.h:397
bool is_single_inner_of_semi_join() const
Definition: sql_opt_exec_shared.h:336
void set_position(POSITION *p)
Definition: sql_opt_exec_shared.h:270
POSITION * position() const
Definition: sql_opt_exec_shared.h:269
void add_prefix_tables(table_map tables)
Add an available set of tables for a table in a join plan.
Definition: sql_opt_exec_shared.h:326
bool is_inner_table_of_outer_join() const
Definition: sql_opt_exec_shared.h:333
bool condition_is_pushed_to_sort() const
Definition: sql_opt_exec_shared.h:290
plan_idx first_sj_inner()
Definition: sql_opt_exec_shared.h:273
void set_range_scan(AccessPath *q)
Definition: sql_opt_exec_shared.h:300
void set_ft_func(Item_func_match *f)
Definition: sql_opt_exec_shared.h:304
Semijoin_mat_exec * m_sj_mat_exec
Struct needed for materialization of semi-join.
Definition: sql_opt_exec_shared.h:375
AccessPath * range_scan() const
Definition: sql_opt_exec_shared.h:299
plan_idx m_first_upper
first inner table for embedding outer join
Definition: sql_opt_exec_shared.h:390
table_map prefix_tables_map
The set of all tables available in the join prefix for this table, including the table handled by thi...
Definition: sql_opt_exec_shared.h:451
bool m_condition_is_pushed_to_sort
Whether the condition in m_condition is evaluated in front of a sort, so that it does not need to be ...
Definition: sql_opt_exec_shared.h:420
plan_idx m_last_sj_inner
Definition: sql_opt_exec_shared.h:383
TABLE * table() const
Definition: sql_opt_exec_shared.h:267
Item * m_condition
Table condition, ie condition to be evaluated for a row from this table.
Definition: sql_opt_exec_shared.h:410
void set_first_inner(plan_idx i)
Definition: sql_opt_exec_shared.h:276
void set_index(uint i)
Definition: sql_opt_exec_shared.h:285
Key_map m_keys
All keys with can be used.
Definition: sql_opt_exec_shared.h:427
uint index() const
Definition: sql_opt_exec_shared.h:284
ha_rows records() const
Definition: sql_opt_exec_shared.h:297
TABLE * m_table
Corresponding table. Might be an internal temporary one.
Definition: sql_opt_exec_shared.h:361
void set_type(enum join_type t)
Definition: sql_opt_exec_shared.h:287
uint m_index
ID of index used for index scan or semijoin LooseScan.
Definition: sql_opt_exec_shared.h:400
void mark_condition_as_pushed_to_sort()
Definition: sql_opt_exec_shared.h:293
ha_rows m_records
Either number of rows in the table or 1 for const table.
Definition: sql_opt_exec_shared.h:433
POSITION * m_position
Points into best_positions array. Includes cost info.
Definition: sql_opt_exec_shared.h:364
enum join_type type() const
Definition: sql_opt_exec_shared.h:286
void set_condition(Item *c)
Definition: sql_opt_exec_shared.h:289
plan_idx m_first_inner
first inner table for including outer join
Definition: sql_opt_exec_shared.h:388
void set_prefix_tables(table_map prefix_tables_arg, table_map prev_tables_arg)
Set available tables for a table in a join plan.
Definition: sql_opt_exec_shared.h:315
table_map added_tables_map
The set of tables added for this table, compared to the previous table in the join prefix.
Definition: sql_opt_exec_shared.h:456
table_map prefix_tables() const
Definition: sql_opt_exec_shared.h:301
Key_map & keys()
Definition: sql_opt_exec_shared.h:296
enum join_type m_type
Type of chosen access method (scan, etc).
Definition: sql_opt_exec_shared.h:403
Item * condition() const
Definition: sql_opt_exec_shared.h:288
plan_idx idx() const
Definition: sql_opt_exec_shared.h:259
void set_records(ha_rows r)
Definition: sql_opt_exec_shared.h:298
plan_idx last_inner()
Definition: sql_opt_exec_shared.h:281
void set_first_upper(plan_idx i)
Definition: sql_opt_exec_shared.h:280
plan_idx last_sj_inner()
Definition: sql_opt_exec_shared.h:274
void set_idx(plan_idx i)
Definition: sql_opt_exec_shared.h:263
Item_func_match * ft_func() const
Definition: sql_opt_exec_shared.h:303
bool skip_records_in_range() const
Definition: sql_opt_exec_shared.h:347
JOIN * join() const
Definition: sql_opt_exec_shared.h:257
void set_table(TABLE *t)
Definition: sql_opt_exec_shared.h:268
plan_idx first_upper()
Definition: sql_opt_exec_shared.h:282
void set_sj_mat_exec(Semijoin_mat_exec *s)
Definition: sql_opt_exec_shared.h:272
void set_skip_records_in_range(bool skip_records_in_range)
Definition: sql_opt_exec_shared.h:343
void set_last_inner(plan_idx i)
Definition: sql_opt_exec_shared.h:277
TABLE_REF & ref()
Definition: sql_opt_exec_shared.h:283
Executor structure for the materialized semi-join info, which contains.
Definition: sql_executor.h:143
class to copying an field/item to a key struct
Definition: sql_select.h:809
const char * p
Definition: ctype-mb.cc:1236
Fido Client Authentication nullptr
Definition: fido_client_plugin.cc:221
bool and_with_condition(Item *tmp_cond)
Extend join_tab->cond by AND'ing add_cond to it.
Definition: sql_select.cc:3412
void qs_cleanup()
Definition: sql_select.cc:3373
This file includes constants used by all storage engines.
ulong key_part_map
Definition: my_base.h:1006
my_off_t ha_rows
Definition: my_base.h:1139
unsigned long long int ulonglong
Definition: my_inttypes.h:55
unsigned char uchar
Definition: my_inttypes.h:51
uint64_t table_map
Definition: my_table_map.h:29
uint64_t qep_tab_map
Definition: my_table_map.h:31
const mysql_service_registry_t * r
Definition: pfs_example_plugin_employee.cc:85
join_type
Definition: sql_opt_exec_shared.h:177
@ JT_RANGE
Definition: sql_opt_exec_shared.h:205
@ JT_EQ_REF
Definition: sql_opt_exec_shared.h:193
@ JT_INDEX_SCAN
Definition: sql_opt_exec_shared.h:210
@ JT_FT
Definition: sql_opt_exec_shared.h:212
@ JT_SYSTEM
Definition: sql_opt_exec_shared.h:181
@ JT_REF_OR_NULL
Definition: sql_opt_exec_shared.h:217
@ JT_REF
Definition: sql_opt_exec_shared.h:197
@ JT_CONST
Definition: sql_opt_exec_shared.h:187
@ JT_INDEX_MERGE
Definition: sql_opt_exec_shared.h:223
@ JT_UNKNOWN
Definition: sql_opt_exec_shared.h:179
@ JT_ALL
Definition: sql_opt_exec_shared.h:201
int plan_idx
This represents the index of a JOIN_TAB/QEP_TAB in an array.
Definition: sql_opt_exec_shared.h:53
@ REF_SLICE_WIN_1
The slice with pointers to columns of 1st tmp table of windowing.
Definition: sql_opt_exec_shared.h:633
@ REF_SLICE_ACTIVE
The slice which is used during evaluation of expressions; Item_ref::ref points there.
Definition: sql_opt_exec_shared.h:612
@ REF_SLICE_TMP2
The slice with pointers to columns of 2nd group-order-distinct tmp table.
Definition: sql_opt_exec_shared.h:622
@ REF_SLICE_SAVED_BASE
The slice with pointers to columns of table(s), ie., the actual Items.
Definition: sql_opt_exec_shared.h:629
@ REF_SLICE_TMP1
The slice with pointers to columns of 1st group-order-distinct tmp table.
Definition: sql_opt_exec_shared.h:617
#define NO_PLAN_IDX
undefined index
Definition: sql_opt_exec_shared.h:54
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:188
A position of table within a join order.
Definition: sql_select.h:351
Definition: sql_opt_exec_shared.h:58
uchar * null_ref_key
Definition: sql_opt_exec_shared.h:101
bool has_guarded_conds() const
Check if there are triggered/guarded conditions that might be 'switched off' by the subquery code whe...
Definition: sql_opt_exec_shared.h:159
uint key_parts
num of ...
Definition: sql_opt_exec_shared.h:60
int key
key no
Definition: sql_opt_exec_shared.h:62
TABLE_REF()
Definition: sql_opt_exec_shared.h:121
store_key ** key_copy
Used to store the value from each keypart field.
Definition: sql_opt_exec_shared.h:70
uint key_length
length of key_buff
Definition: sql_opt_exec_shared.h:61
bool impossible_null_ref() const
Definition: sql_opt_exec_shared.h:141
ulonglong * keypart_hash
Definition: sql_opt_exec_shared.h:119
uchar * key_buff2
key_buff+key_length
Definition: sql_opt_exec_shared.h:64
bool ** cond_guards
Definition: sql_opt_exec_shared.h:88
bool key_err
Definition: sql_opt_exec_shared.h:59
bool disable_cache
Definition: sql_opt_exec_shared.h:112
table_map depend_map
Table depends on these tables.
Definition: sql_opt_exec_shared.h:95
uchar * key_buff
value to look for with key
Definition: sql_opt_exec_shared.h:63
ha_rows use_count
Definition: sql_opt_exec_shared.h:106
key_part_map null_rejecting
Definition: sql_opt_exec_shared.h:94
Item ** items
val()'s for each keypart
Definition: sql_opt_exec_shared.h:71
Definition: table.h:1394
unsigned int uint
Definition: uca-dump.cc:29
synode_no q[FIFO_SIZE]
Definition: xcom_base.cc:4053