MySQL 9.1.0
Source Code Documentation
sql_executor.h
Go to the documentation of this file.
1#ifndef SQL_EXECUTOR_INCLUDED
2#define SQL_EXECUTOR_INCLUDED
3
4/* Copyright (c) 2000, 2024, Oracle and/or its affiliates.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License, version 2.0,
8 as published by the Free Software Foundation.
9
10 This program is designed to work with certain software (including
11 but not limited to OpenSSL) that is licensed under separate terms,
12 as designated in a particular file or component or in included license
13 documentation. The authors of MySQL hereby grant you an additional
14 permission to link the program and your derivative works with the
15 separately licensed software that they have either included with
16 the program or referenced in the documentation.
17
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License, version 2.0, for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
26
27/**
28 @file sql/sql_executor.h
29 Classes for query execution.
30*/
31
32#include <sys/types.h>
33#include <string>
34#include <vector>
35
36#include "my_alloc.h"
37#include "my_inttypes.h"
38#include "my_table_map.h"
39#include "sql/sql_lex.h"
40#include "sql/sql_opt_exec_shared.h" // QEP_shared_owner
41#include "sql/table.h"
42#include "sql/temp_table_param.h" // Temp_table_param
43
44class Cached_item;
45class Field;
46class Field_longlong;
47class Filesort;
48class Item;
49class Item_sum;
50class JOIN;
51class JOIN_TAB;
52class KEY;
54class QEP_TAB;
55class RowIterator;
56class THD;
57template <class T>
58class mem_root_deque;
59
60struct AccessPath;
61struct POSITION;
62template <class T>
63class List;
64template <typename Element_type>
65class Mem_root_array;
66
67/*
68 Array of pointers to tables whose rowids compose the temporary table
69 record.
70*/
74 ushort null_byte;
76};
77
78/*
79 Temporary table used by semi-join DuplicateElimination strategy
80
81 This consists of the temptable itself and data needed to put records
82 into it. The table's DDL is as follows:
83
84 CREATE TABLE tmptable (col VARCHAR(n) BINARY, PRIMARY KEY(col));
85
86 where the primary key can be replaced with unique constraint if n exceeds
87 the limit (as it is always done for query execution-time temptables).
88
89 The record value is a concatenation of rowids of tables from the join we're
90 executing. If a join table is on the inner side of the outer join, we
91 assume that its rowid can be NULL and provide means to store this rowid in
92 the tuple.
93*/
94
96 public:
100
101 /*
102 is_confluent==true means this is a special case where the temptable record
103 has zero length (and presence of a unique key means that the temptable can
104 have either 0 or 1 records).
105 In this case we don't create the physical temptable but instead record
106 its state in SJ_TMP_TABLE::have_confluent_record.
107 */
109
110 /*
111 When is_confluent==true: the contents of the table (whether it has the
112 record or not).
113 */
115
116 /* table record parameters */
120
121 /* The temporary table itself (NULL means not created yet) */
123
124 /* Pointer to next table (next->start_idx > this->end_idx) */
126 /* Calc hash instead of too long key */
128};
129
130/**
131 Executor structure for the materialized semi-join info, which contains
132 - Description of expressions selected from subquery
133 - The sj-materialization temporary table
134*/
136 public:
139 : sj_nest(sj_nest),
144 table_param(),
145 table(nullptr) {}
147 Table_ref *const sj_nest; ///< Semi-join nest for this materialization
148 const bool is_scan; ///< true if executing a scan, false if lookup
149 const uint table_count; ///< Number of tables in the sj-nest
150 const uint mat_table_index; ///< Index in join_tab for materialized table
151 const uint inner_table_index; ///< Index in join_tab for first inner table
152 Temp_table_param table_param; ///< The temptable and its related info
153 TABLE *table; ///< Reference to temporary table
154};
155
157
158[[nodiscard]] bool copy_fields(Temp_table_param *param, const THD *thd,
159 bool reverse_copy = false);
160
161enum Copy_func_type : int {
162 /**
163 In non-windowing step, copies functions
164 */
166 /**
167 In windowing step, copies framing window function, including
168 all grouping aggregates, e.g. SUM, AVG and FIRST_VALUE, LAST_VALUE.
169 */
171 /**
172 In windowing step, copies non framing window function, e.g.
173 ROW_NUMBER, RANK, DENSE_RANK, except those that are two_pass cf.
174 copy_two_pass_window_functions which are treated separately.
175 */
177 /**
178 In windowing step, copies window functions that need frame cardinality,
179 that is we need to read all rows of a partition before we can compute the
180 wf's value for the the first row in the partition.
181 */
183 /**
184 In windowing step, copies framing window functions that read only one row
185 per frame.
186 */
188 /**
189 In first windowing step, copies non-window functions which do not rely on
190 window functions, i.e. those that have Item::has_wf() == false.
191 */
193 /**
194 In final windowing step, copies all non-wf functions. Must be called after
195 all wfs have been evaluated, as non-wf functions may reference wf,
196 e.g. 1+RANK.
197 */
199 /**
200 Copies all window functions.
201 */
203 /**
204 Copies Item_field only (typically because other functions might depend
205 on those fields).
206 */
208};
209
210bool copy_funcs(Temp_table_param *, const THD *thd,
212
213/**
214 Copy the lookup key into the table ref's key buffer.
215
216 @param thd pointer to the THD object
217 @param table the table to read
218 @param ref information about the index lookup key
219
220 @retval false ref key copied successfully
221 @retval true error detected during copying of key
222*/
224
225/** Help function when we get some an error from the table handler. */
227
229
230int do_sj_dups_weedout(THD *thd, SJ_TMP_TABLE *sjtbl);
232size_t compute_ria_idx(const mem_root_deque<Item *> &fields, size_t i,
233 size_t added_non_hidden_fields, size_t border);
234
235// Create list for using with temporary table
237 Ref_item_array ref_item_array,
238 mem_root_deque<Item *> *res_fields,
239 size_t added_non_hidden_fields,
240 bool windowing = false);
241// Create list for using with temporary table
243 THD *thd, Query_block *select,
244 Ref_item_array ref_item_array,
245 mem_root_deque<Item *> *res_fields,
246 size_t added_non_hidden_fields);
247bool prepare_sum_aggregators(Item_sum **func_ptr, bool need_distinct);
248bool setup_sum_funcs(THD *thd, Item_sum **func_ptr);
249bool make_group_fields(JOIN *main_join, JOIN *curr_join);
252ulonglong calc_field_hash(const Field *field, ulonglong *hash);
255
256class QEP_TAB : public QEP_shared_owner {
257 public:
266 rematerialize(false),
272 m_keyread_optim(false),
273 m_reversed_access(false),
275
276 /// Initializes the object from a JOIN_TAB
277 void init(JOIN_TAB *jt);
278 // Cleans up.
279 void cleanup();
280
281 // Getters and setters
282
285 bool keyread_optim() const { return m_keyread_optim; }
288 }
289 bool reversed_access() const { return m_reversed_access; }
290 void set_reversed_access(bool arg) { m_reversed_access = arg; }
291
292 void set_table(TABLE *t) {
293 m_qs->set_table(t);
294 if (t) t->reginfo.qep_tab = this;
295 }
296
297 /// @returns semijoin strategy for this table.
298 uint get_sj_strategy() const;
299
300 /// Return true if join_tab should perform a FirstMatch action
301 bool do_firstmatch() const { return firstmatch_return != NO_PLAN_IDX; }
302
303 /// Return true if join_tab should perform a LooseScan action
304 bool do_loosescan() const { return loosescan_key_len; }
305
306 /// Return true if join_tab starts a Duplicate Weedout action
307 bool starts_weedout() const { return flush_weedout_table; }
308
309 /// Return true if join_tab finishes a Duplicate Weedout action
310 bool finishes_weedout() const { return check_weed_out_table; }
311
312 /**
313 A helper function that allocates appropriate join cache object and
314 sets next_query_block function of previous tab.
315 */
316 void init_join_cache(JOIN_TAB *join_tab);
317
318 /**
319 @returns query block id for an inner table of materialized semi-join, and
320 0 for all other tables.
321 @note implementation is not efficient (loops over all tables) - use this
322 function only in EXPLAIN.
323 */
324 uint sjm_query_block_id() const;
325
326 /// @returns whether this is doing QS_DYNAMIC_RANGE
327 bool dynamic_range() const {
328 if (!position()) return false; // tmp table
329 return using_dynamic_range;
330 }
331
332 bool use_order() const; ///< Use ordering provided by chosen index?
333
334 /**
335 Construct an access path for reading from this table in the query,
336 using the access method that has been determined previously
337 (e.g., table scan, ref access, optional sort afterwards, etc.).
338 */
340 void push_index_cond(const JOIN_TAB *join_tab, uint keyno,
341 Opt_trace_object *trace_obj);
342
343 /// @return the index used for a table in a QEP
344 uint effective_index() const;
345
346 bool pfs_batch_update(const JOIN *join) const;
347
348 public:
349 /// Pointer to table reference
351
352 /* Variables for semi-join duplicate elimination */
355
356 /*
357 If set, means we should stop join enumeration after we've got the first
358 match and return to the specified join tab. May be PRE_FIRST_PLAN_IDX
359 which means stopping join execution after the first match.
360 */
362
363 /*
364 Length of key tuple (depends on #keyparts used) to use for loose scan.
365 If zero, means that loosescan is not used.
366 */
368
369 /*
370 If doing a LooseScan, this QEP is the first (i.e. "driving")
371 QEP_TAB, and match_tab points to the last QEP_TAB handled by the strategy.
372 match_tab->found_match should be checked to see if the current value group
373 had a match.
374 */
376
377 /// Dependent table functions have to be materialized on each new scan
379
385 };
388
389 /** true <=> remove duplicates on this table. */
391
392 // If we have a query of the type SELECT DISTINCT t1.* FROM t1 JOIN t2
393 // ON ..., (ie., we join in one or more tables that we don't actually
394 // read any columns from), we can stop scanning t2 as soon as we see the
395 // first row. This pattern seems to be a workaround for lack of semijoins
396 // in older versions of MySQL.
398
399 /** HAVING condition for checking prior saving a record into tmp table*/
401
402 // Operation between the previous QEP_TAB and this one.
404 // Regular nested loop.
406
407 // Aggregate (GROUP BY).
409
410 // Various temporary table operations, used at the end of the join.
415
416 // Block-nested loop (rewritten to hash join).
418
419 // Batch key access.
420 OT_BKA
422
423 /* Tmp table info */
425
426 /* Sorting related info */
428
429 /**
430 If we pushed a global ORDER BY down onto this first table, that ORDER BY
431 list will be preserved here.
432 */
434
435 /**
436 Slice number of the ref items array to switch to before reading rows from
437 this table.
438 */
440
441 /// Condition as it was set by the optimizer, used for EXPLAIN.
442 /// m_condition may be overwritten at a later stage.
444
445 /**
446 True if only index is going to be read for this table. This is the
447 optimizer's decision.
448 */
450
451 /**
452 True if reversed scan is used. This is the optimizer's decision.
453 */
455
456 /**
457 Maps of all lateral derived tables which should be refreshed when
458 execution reads a new row from this table.
459 @note that if a LDT depends on t1 and t2, and t2 is after t1 in the plan,
460 then only t2::lateral_derived_tables_depend_on_me gets the map of the
461 LDT, for efficiency (less useless calls to QEP_TAB::refresh_lateral())
462 and clarity in EXPLAIN.
463 */
465
467
468 QEP_TAB(const QEP_TAB &); // not defined
469 QEP_TAB &operator=(const QEP_TAB &); // not defined
470};
471
472bool set_record_buffer(TABLE *table, double expected_rows_to_fetch);
474void update_tmptable_sum_func(Item_sum **func_ptr, TABLE *tmp_table);
475bool has_rollup_result(Item *item);
476bool is_rollup_group_wrapper(const Item *item);
478
479/*
480 If a condition cannot be applied right away, for instance because it is a
481 WHERE condition and we're on the right side of an outer join, we have to
482 return it up so that it can be applied on a higher recursion level.
483 This structure represents such a condition.
484 */
487 int table_index_to_attach_to; // -1 means “on the last possible outer join”.
488};
489
490/**
491 Cache invalidator iterators we need to apply, but cannot yet due to outer
492 joins. As soon as “table_index_to_invalidate” is visible in our current join
493 nest (which means there could no longer be NULL-complemented rows we could
494 forget), we can and must output this invalidator and remove it from the array.
495 */
497 /**
498 The table whose every (post-join) row invalidates one or more derived
499 lateral tables.
500 */
503};
504
511
512/**
513 Create an AND conjunction of all given items. If there are no items, returns
514 nullptr. If there's only one item, returns that item.
515 */
517
520 const std::vector<Item *> &conditions, THD *thd);
521
522void SplitConditions(Item *condition, QEP_TAB *current_table,
523 std::vector<Item *> *predicates_below_join,
524 std::vector<PendingCondition> *predicates_above_join,
525 std::vector<PendingCondition> *join_conditions,
526 plan_idx semi_join_table_idx, qep_tab_map left_tables);
527
528/**
529 For a MATERIALIZE access path, move any non-basic iterators (e.g. sorts and
530 filters) from table_path to above the path, for easier EXPLAIN and generally
531 simpler structure. Note the assert in CreateIteratorFromAccessPath() that we
532 succeeded. (ALTERNATIVE counts as a basic iterator in this regard.)
533
534 We do this by finding the second-bottommost access path, and inserting our
535 materialize node as its child. The bottommost one becomes the actual table
536 access path.
537
538 If a ZERO_ROWS access path is materialized, we simply replace the MATERIALIZE
539 path with the ZERO_ROWS path, since there is nothing to materialize.
540 @param thd The current thread.
541 @param path the MATERIALIZE path.
542 @param query_block The query block in which 'path' belongs.
543 @returns The new root of the set of AccessPaths formed by 'path' and its
544 descendants.
545 */
547 const Query_block &query_block);
548
550 THD *thd, Table_ref *table_ref, TABLE *table, bool rematerialize,
551 Mem_root_array<const AccessPath *> *invalidators, bool need_rowid,
552 AccessPath *table_path);
553
554void ConvertItemsToCopy(const mem_root_deque<Item *> &items, Field **fields,
555 Temp_table_param *param);
556std::string RefToString(const Index_lookup &ref, const KEY &key,
557 bool include_nulls);
558
560
561/**
562 Split AND conditions into their constituent parts, recursively.
563 Conditions that are not AND conditions are appended unchanged onto
564 condition_parts. E.g. if you have ((a AND b) AND c), condition_parts
565 will contain [a, b, c], plus whatever it contained before the call.
566 */
567bool ExtractConditions(Item *condition,
568 Mem_root_array<Item *> *condition_parts);
569
571 AccessPath *range_scan,
572 Table_ref *table_ref, POSITION *position,
573 bool count_examined_rows);
574
575/**
576 Creates an iterator for the given table, then calls Init() on the resulting
577 iterator. Unlike create_table_iterator(), this can create iterators for sort
578 buffer results (which are set in the TABLE object during query execution).
579 Returns nullptr on failure.
580 */
582 THD *thd, TABLE *table, AccessPath *range_scan, Table_ref *table_ref,
583 POSITION *position, bool ignore_not_found_rows, bool count_examined_rows);
584
585/**
586 A short form for when there's no range scan, recursive CTEs or cost
587 information; just a unique_result or a simple table scan. Normally, you should
588 prefer just instantiating an iterator yourself -- this is for legacy use only.
589 */
591 THD *thd, TABLE *table, bool ignore_not_found_rows,
592 bool count_examined_rows) {
593 return init_table_iterator(thd, table, nullptr, nullptr, nullptr,
594 ignore_not_found_rows, count_examined_rows);
595}
596
597AccessPath *ConnectJoins(plan_idx upper_first_idx, plan_idx first_idx,
598 plan_idx last_idx, QEP_TAB *qep_tabs, THD *thd,
599 CallingContext calling_context,
600 std::vector<PendingCondition> *pending_conditions,
601 std::vector<PendingInvalidator> *pending_invalidators,
602 std::vector<PendingCondition> *pending_join_conditions,
603 qep_tab_map *unhandled_duplicates,
604 table_map *conditions_depend_on_outer_tables);
605
606void set_count_examined_rows(AccessPath *path, bool count_examined_rows);
607
608#endif /* SQL_EXECUTOR_INCLUDED */
Kerberos Client Authentication nullptr
Definition: auth_kerberos_client_plugin.cc:251
This is used for segregating rows in groups (e.g.
Definition: item.h:6484
Definition: field.h:2404
Definition: field.h:577
Sorting related info.
Definition: filesort.h:52
Class Item_sum is the base class used for special expressions that SQL calls 'set functions'.
Definition: item_sum.h:399
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:930
Query optimization plan node.
Definition: sql_select.h:602
Definition: sql_optimizer.h:133
Definition: key.h:113
Definition: sql_list.h:494
A typesafe replacement for DYNAMIC_ARRAY.
Definition: mem_root_array.h:426
A JSON object (unordered set of key/value pairs).
Definition: opt_trace.h:802
Definition: sql_executor.h:256
uint loosescan_key_len
Definition: sql_executor.h:367
bool dynamic_range() const
Definition: sql_executor.h:327
Setup_func materialize_table
Definition: sql_executor.h:386
void set_reversed_access(bool arg)
Definition: sql_executor.h:290
Item * m_condition_optim
Condition as it was set by the optimizer, used for EXPLAIN.
Definition: sql_executor.h:443
bool rematerialize
Dependent table functions have to be materialized on each new scan.
Definition: sql_executor.h:378
bool keyread_optim() const
Definition: sql_executor.h:285
Filesort * filesort
Definition: sql_executor.h:427
bool reversed_access() const
Definition: sql_executor.h:289
void set_table(TABLE *t)
Definition: sql_executor.h:292
uint ref_item_slice
Slice number of the ref items array to switch to before reading rows from this table.
Definition: sql_executor.h:439
bool m_reversed_access
True if reversed scan is used.
Definition: sql_executor.h:454
qep_tab_map lateral_derived_tables_depend_on_me
Maps of all lateral derived tables which should be refreshed when execution reads a new row from this...
Definition: sql_executor.h:464
bool needs_duplicate_removal
true <=> remove duplicates on this table.
Definition: sql_executor.h:390
plan_idx firstmatch_return
Definition: sql_executor.h:361
enum QEP_TAB::enum_op_type op_type
bool do_firstmatch() const
Return true if join_tab should perform a FirstMatch action.
Definition: sql_executor.h:301
ORDER * filesort_pushed_order
If we pushed a global ORDER BY down onto this first table, that ORDER BY list will be preserved here.
Definition: sql_executor.h:433
Setup_func
Definition: sql_executor.h:380
@ NO_SETUP
Definition: sql_executor.h:381
@ MATERIALIZE_TABLE_FUNCTION
Definition: sql_executor.h:382
@ MATERIALIZE_SEMIJOIN
Definition: sql_executor.h:384
@ MATERIALIZE_DERIVED
Definition: sql_executor.h:383
QEP_TAB()
Definition: sql_executor.h:258
Item * condition_optim() const
Definition: sql_executor.h:283
QEP_TAB & operator=(const QEP_TAB &)
bool not_used_in_distinct
Definition: sql_executor.h:397
bool starts_weedout() const
Return true if join_tab starts a Duplicate Weedout action.
Definition: sql_executor.h:307
bool m_keyread_optim
True if only index is going to be read for this table.
Definition: sql_executor.h:449
bool using_dynamic_range
Definition: sql_executor.h:387
bool finishes_weedout() const
Return true if join_tab finishes a Duplicate Weedout action.
Definition: sql_executor.h:310
bool do_loosescan() const
Return true if join_tab should perform a LooseScan action.
Definition: sql_executor.h:304
Item * having
HAVING condition for checking prior saving a record into tmp table.
Definition: sql_executor.h:400
SJ_TMP_TABLE * flush_weedout_table
Definition: sql_executor.h:353
Temp_table_param * tmp_table_param
Definition: sql_executor.h:424
void set_condition_optim()
Definition: sql_executor.h:284
plan_idx match_tab
Definition: sql_executor.h:375
Table_ref * table_ref
Pointer to table reference.
Definition: sql_executor.h:350
SJ_TMP_TABLE * check_weed_out_table
Definition: sql_executor.h:354
enum_op_type
Definition: sql_executor.h:403
@ OT_MATERIALIZE
Definition: sql_executor.h:411
@ OT_BKA
Definition: sql_executor.h:420
@ OT_AGGREGATE_INTO_TMP_TABLE
Definition: sql_executor.h:413
@ OT_AGGREGATE
Definition: sql_executor.h:408
@ OT_BNL
Definition: sql_executor.h:417
@ OT_AGGREGATE_THEN_MATERIALIZE
Definition: sql_executor.h:412
@ OT_WINDOWING_FUNCTION
Definition: sql_executor.h:414
@ OT_NONE
Definition: sql_executor.h:405
Mem_root_array< const AccessPath * > * invalidators
Definition: sql_executor.h:466
QEP_TAB(const QEP_TAB &)
void set_keyread_optim()
Definition: sql_executor.h:286
Owner of a QEP_shared; parent of JOIN_TAB and QEP_TAB.
Definition: sql_opt_exec_shared.h:478
JOIN * join() const
Definition: sql_opt_exec_shared.h:491
TABLE * table() const
Definition: sql_opt_exec_shared.h:504
QEP_shared * m_qs
Definition: sql_opt_exec_shared.h:574
Item * condition() const
Definition: sql_opt_exec_shared.h:526
POSITION * position() const
Definition: sql_opt_exec_shared.h:505
void set_table(TABLE *t)
Definition: sql_opt_exec_shared.h:277
This class represents a query block, aka a query specification, which is a query consisting of a SELE...
Definition: sql_lex.h:1159
A context for reading through a single table using a chosen access method: index read,...
Definition: row_iterator.h:82
Definition: sql_executor.h:95
uint rowid_len
Definition: sql_executor.h:119
TABLE * tmp_table
Definition: sql_executor.h:122
SJ_TMP_TABLE_TAB * tabs
Definition: sql_executor.h:98
SJ_TMP_TABLE * next
Definition: sql_executor.h:125
uint null_bits
Definition: sql_executor.h:117
SJ_TMP_TABLE_TAB * tabs_end
Definition: sql_executor.h:99
bool have_confluent_row
Definition: sql_executor.h:114
SJ_TMP_TABLE()
Definition: sql_executor.h:97
uint null_bytes
Definition: sql_executor.h:118
bool is_confluent
Definition: sql_executor.h:108
Field_longlong * hash_field
Definition: sql_executor.h:127
Executor structure for the materialized semi-join info, which contains.
Definition: sql_executor.h:135
const bool is_scan
true if executing a scan, false if lookup
Definition: sql_executor.h:148
TABLE * table
Reference to temporary table.
Definition: sql_executor.h:153
Table_ref *const sj_nest
Semi-join nest for this materialization.
Definition: sql_executor.h:147
const uint inner_table_index
Index in join_tab for first inner table.
Definition: sql_executor.h:151
const uint mat_table_index
Index in join_tab for materialized table.
Definition: sql_executor.h:150
Temp_table_param table_param
The temptable and its related info.
Definition: sql_executor.h:152
~Semijoin_mat_exec()=default
const uint table_count
Number of tables in the sj-nest.
Definition: sql_executor.h:149
Semijoin_mat_exec(Table_ref *sj_nest, bool is_scan, uint table_count, uint mat_table_index, uint inner_table_index)
Definition: sql_executor.h:137
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Definition: table.h:2900
Object containing parameters used when creating and using temporary tables.
Definition: temp_table_param.h:97
A (partial) implementation of std::deque allocating its blocks on a MEM_ROOT.
Definition: mem_root_deque.h:111
Item * unwrap_rollup_group(Item *item)
Definition: sql_executor.cc:401
void init_tmptable_sum_functions(Item_sum **func_ptr)
Definition: sql_executor.cc:461
bool pfs_batch_update(const JOIN *join) const
Definition: sql_executor.cc:4826
ulonglong calc_row_hash(TABLE *table)
Generate hash for unique_constraint for all visible fields of a table.
Definition: sql_executor.cc:4196
bool setup_sum_funcs(THD *thd, Item_sum **func_ptr)
Call setup() for all sum functions.
Definition: sql_executor.cc:452
bool copy_funcs(Temp_table_param *, const THD *thd, Copy_func_type type=CFT_ALL)
Copy result of functions to record in tmp_table.
Definition: sql_executor.cc:493
bool has_rollup_result(Item *item)
Checks if an item has a ROLLUP NULL which needs to be written to temp table.
Definition: sql_executor.cc:371
int join_read_const_table(JOIN_TAB *tab, POSITION *pos)
Reads content of constant table.
Definition: sql_executor.cc:3669
bool construct_lookup(THD *thd, TABLE *table, Index_lookup *ref)
Copy the lookup key into the table ref's key buffer.
Definition: sql_executor.cc:4251
int do_sj_dups_weedout(THD *thd, SJ_TMP_TABLE *sjtbl)
SemiJoinDuplicateElimination: Weed out duplicate row combinations.
Definition: sql_executor.cc:3572
int report_handler_error(TABLE *table, int error)
Help function when we get some an error from the table handler.
Definition: sql_executor.cc:3642
void setup_tmptable_write_func(QEP_TAB *tab, Opt_trace_object *trace)
Setup write_func of QEP_tmp_table object.
Definition: sql_executor.cc:582
int update_item_cache_if_changed(List< Cached_item > &list)
Definition: sql_executor.cc:4333
AccessPath * access_path()
Construct an access path for reading from this table in the query, using the access method that has b...
Definition: sql_executor.cc:3886
int read_const(TABLE *table, Index_lookup *ref)
Definition: sql_executor.cc:3800
bool use_order() const
Use ordering provided by chosen index?
Definition: sql_executor.cc:3860
AccessPath * GetAccessPathForDerivedTable(THD *thd, Table_ref *table_ref, TABLE *table, bool rematerialize, Mem_root_array< const AccessPath * > *invalidators, bool need_rowid, AccessPath *table_path)
Definition: sql_executor.cc:1758
bool is_rollup_group_wrapper(const Item *item)
Definition: sql_executor.cc:395
bool change_to_use_tmp_fields_except_sums(mem_root_deque< Item * > *fields, THD *thd, Query_block *select, Ref_item_array ref_item_array, mem_root_deque< Item * > *res_fields, size_t added_non_hidden_fields)
Change all sum_func refs to fields to point at fields in tmp table.
Definition: sql_executor.cc:4598
bool make_group_fields(JOIN *main_join, JOIN *curr_join)
allocate group fields or take prepared (cached).
Definition: sql_executor.cc:4291
size_t compute_ria_idx(const mem_root_deque< Item * > &fields, size_t i, size_t added_non_hidden_fields, size_t border)
Compute the position mapping from fields to ref_item_array, cf.
Definition: sql_executor.cc:4348
bool change_to_use_tmp_fields(mem_root_deque< Item * > *fields, THD *thd, Ref_item_array ref_item_array, mem_root_deque< Item * > *res_fields, size_t added_non_hidden_fields, bool windowing=false)
Change all funcs and sum_funcs to fields in tmp table, and create new list of all items.
Definition: sql_executor.cc:4450
bool check_unique_fields(TABLE *table)
Check whether a row is already present in the tmp table.
Definition: sql_executor.cc:4223
void update_tmptable_sum_func(Item_sum **func_ptr, TABLE *tmp_table)
Update record 0 in tmp_table from record 1.
Definition: sql_executor.cc:469
bool table_rec_cmp(TABLE *table)
Compare GROUP BY in from tmp table's record[0] and record[1].
Definition: sql_executor.cc:4112
std::string RefToString(const Index_lookup &ref, const KEY &key, bool include_nulls)
Definition: sql_executor.cc:167
Item * CreateConjunction(List< Item > *items)
Create an AND conjunction of all given items.
Definition: sql_executor.cc:815
bool set_record_buffer(TABLE *table, double expected_rows_to_fetch)
Allocate a data buffer that the storage engine can use for fetching batches of records.
Definition: sql_executor.cc:718
AccessPath * MoveCompositeIteratorsFromTablePath(THD *thd, AccessPath *path, const Query_block &query_block)
For a MATERIALIZE access path, move any non-basic iterators (e.g.
Definition: sql_executor.cc:1617
bool copy_fields(Temp_table_param *param, const THD *thd, bool reverse_copy=false)
Make a copy of all simple SELECT'ed fields.
Definition: sql_executor.cc:4380
void ConvertItemsToCopy(const mem_root_deque< Item * > &items, Field **fields, Temp_table_param *param)
For historical reasons, derived table materialization and temporary table materialization didn't spec...
Definition: sql_executor.cc:1007
bool ExtractConditions(Item *condition, Mem_root_array< Item * > *condition_parts)
Split AND conditions into their constituent parts, recursively.
Definition: sql_executor.cc:787
ulonglong calc_field_hash(const Field *field, ulonglong *hash)
Generate hash for a field.
Definition: sql_executor.cc:4130
bool prepare_sum_aggregators(Item_sum **func_ptr, bool need_distinct)
Definition: sql_executor.cc:426
void init(JOIN_TAB *jt)
Initializes the object from a JOIN_TAB.
Definition: sql_optimizer.cc:1342
void init_join_cache(JOIN_TAB *join_tab)
A helper function that allocates appropriate join cache object and sets next_query_block function of ...
Definition: sql_select.cc:3342
void push_index_cond(const JOIN_TAB *join_tab, uint keyno, Opt_trace_object *trace_obj)
Try to extract and push the index condition down to table handler.
Definition: sql_select.cc:3012
void cleanup()
Definition: sql_select.cc:3594
uint sjm_query_block_id() const
Definition: sql_select.cc:3650
uint effective_index() const
Return the index used for a table in a QEP.
Definition: sql_optimizer.cc:1369
uint get_sj_strategy() const
Definition: sql_optimizer.cc:1349
This file follows Google coding style, except for the name MEM_ROOT (which is kept for historical rea...
std::unique_ptr< T, Destroy_only< T > > unique_ptr_destroy_only
std::unique_ptr, but only destroying.
Definition: my_alloc.h:480
Some integer typedefs for easier portability.
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
void error(const char *format,...)
static char * path
Definition: mysqldump.cc:149
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
PT & ref(PT *tp)
Definition: tablespace_impl.cc:359
std::list< T, ut::allocator< T > > list
Specialization of list which uses ut_allocator.
Definition: ut0new.h:2880
required string key
Definition: replication_asynchronous_connection_failover.proto:60
required string type
Definition: replication_group_member_actions.proto:34
AccessPath * ConnectJoins(plan_idx upper_first_idx, plan_idx first_idx, plan_idx last_idx, QEP_TAB *qep_tabs, THD *thd, CallingContext calling_context, std::vector< PendingCondition > *pending_conditions, std::vector< PendingInvalidator > *pending_invalidators, std::vector< PendingCondition > *pending_join_conditions, qep_tab_map *unhandled_duplicates, table_map *conditions_depend_on_outer_tables)
bool MaterializeIsDoingDeduplication(TABLE *table)
(end of group Query_Executor)
Definition: sql_executor.cc:4844
AccessPath * create_table_access_path(THD *thd, TABLE *table, AccessPath *range_scan, Table_ref *table_ref, POSITION *position, bool count_examined_rows)
create_table_access_path is used to scan by using a number of different methods.
Definition: sql_executor.cc:4913
unique_ptr_destroy_only< RowIterator > PossiblyAttachFilterIterator(unique_ptr_destroy_only< RowIterator > iterator, const std::vector< Item * > &conditions, THD *thd)
void SplitConditions(Item *condition, QEP_TAB *current_table, std::vector< Item * > *predicates_below_join, std::vector< PendingCondition > *predicates_above_join, std::vector< PendingCondition > *join_conditions, plan_idx semi_join_table_idx, qep_tab_map left_tables)
CallingContext
Definition: sql_executor.h:505
@ DIRECTLY_UNDER_OUTER_JOIN
Definition: sql_executor.h:508
@ TOP_LEVEL
Definition: sql_executor.h:506
@ DIRECTLY_UNDER_WEEDOUT
Definition: sql_executor.h:509
@ DIRECTLY_UNDER_SEMIJOIN
Definition: sql_executor.h:507
unique_ptr_destroy_only< RowIterator > init_table_iterator(THD *thd, TABLE *table, AccessPath *range_scan, Table_ref *table_ref, POSITION *position, bool ignore_not_found_rows, bool count_examined_rows)
Creates an iterator for the given table, then calls Init() on the resulting iterator.
Definition: sql_executor.cc:4933
Copy_func_type
Definition: sql_executor.h:161
@ CFT_HAS_NO_WF
In first windowing step, copies non-window functions which do not rely on window functions,...
Definition: sql_executor.h:192
@ CFT_WF_NON_FRAMING
In windowing step, copies non framing window function, e.g.
Definition: sql_executor.h:176
@ CFT_WF_NEEDS_PARTITION_CARDINALITY
In windowing step, copies window functions that need frame cardinality, that is we need to read all r...
Definition: sql_executor.h:182
@ CFT_WF_FRAMING
In windowing step, copies framing window function, including all grouping aggregates,...
Definition: sql_executor.h:170
@ CFT_ALL
In non-windowing step, copies functions.
Definition: sql_executor.h:165
@ CFT_FIELDS
Copies Item_field only (typically because other functions might depend on those fields).
Definition: sql_executor.h:207
@ CFT_HAS_WF
In final windowing step, copies all non-wf functions.
Definition: sql_executor.h:198
@ CFT_WF_USES_ONLY_ONE_ROW
In windowing step, copies framing window functions that read only one row per frame.
Definition: sql_executor.h:187
@ CFT_WF
Copies all window functions.
Definition: sql_executor.h:202
void set_count_examined_rows(AccessPath *path, bool count_examined_rows)
For the given access path, set "count_examined_rows" to the value specified.
Definition: sql_executor.cc:4870
Common types of the Optimizer, used by optimization and execution.
int plan_idx
This represents the index of a JOIN_TAB/QEP_TAB in an array.
Definition: sql_opt_exec_shared.h:54
#define NO_PLAN_IDX
undefined index
Definition: sql_opt_exec_shared.h:55
@ REF_SLICE_SAVED_BASE
The slice with pointers to columns of table(s), ie., the actual Items.
Definition: sql_opt_exec_shared.h:638
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:227
Structure used for index-based lookups.
Definition: sql_opt_exec_shared.h:67
Definition: table.h:289
A position of table within a join order.
Definition: sql_select.h:355
Definition: sql_executor.h:485
Item * cond
Definition: sql_executor.h:486
int table_index_to_attach_to
Definition: sql_executor.h:487
Cache invalidator iterators we need to apply, but cannot yet due to outer joins.
Definition: sql_executor.h:496
QEP_TAB * qep_tab
The table whose every (post-join) row invalidates one or more derived lateral tables.
Definition: sql_executor.h:501
plan_idx table_index_to_invalidate
Definition: sql_executor.h:502
Definition: sql_executor.h:71
QEP_TAB * qep_tab
Definition: sql_executor.h:72
ushort null_byte
Definition: sql_executor.h:74
uchar null_bit
Definition: sql_executor.h:75
uint rowid_offset
Definition: sql_executor.h:73
Definition: table.h:1421
class QEP_TAB * qep_tab
Definition: table.h:1924
bool key_read
If set, the optimizer has found that row retrieval should access index tree only.
Definition: table.h:1849
struct TABLE::@189 reginfo