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