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