23#ifndef SQL_JOIN_OPTIMIZER_ACCESS_PATH_H
24#define SQL_JOIN_OPTIMIZER_ACCESS_PATH_H
519 return u.ref_or_null;
523 return u.ref_or_null;
535 return u.pushed_join_ref;
539 return u.pushed_join_ref;
543 return u.full_text_search;
547 return u.full_text_search;
551 return u.const_table;
555 return u.const_table;
567 return u.follow_tail;
571 return u.follow_tail;
575 return u.index_range_scan;
579 return u.index_range_scan;
583 return u.index_merge;
587 return u.index_merge;
591 return u.rowid_intersection;
595 return u.rowid_intersection;
599 return u.rowid_union;
603 return u.rowid_union;
607 return u.index_skip_scan;
611 return u.index_skip_scan;
615 return u.group_index_skip_scan;
619 return u.group_index_skip_scan;
623 return u.dynamic_index_range_scan;
627 return u.dynamic_index_range_scan;
631 return u.materialized_table_function;
635 return u.materialized_table_function;
639 return u.unqualified_count;
643 return u.unqualified_count;
647 return u.table_value_constructor;
651 return u.table_value_constructor;
655 return u.fake_single_row;
659 return u.fake_single_row;
671 return u.zero_rows_aggregated;
675 return u.zero_rows_aggregated;
695 return u.nested_loop_join;
699 return u.nested_loop_join;
703 return u.nested_loop_semijoin_with_duplicate_removal;
707 return u.nested_loop_semijoin_with_duplicate_removal;
735 return u.temptable_aggregate;
739 return u.temptable_aggregate;
743 return u.limit_offset;
747 return u.limit_offset;
759 return u.materialize;
763 return u.materialize;
767 return u.materialize_information_schema_table;
771 return u.materialize_information_schema_table;
799 return u.remove_duplicates;
803 return u.remove_duplicates;
807 return u.remove_duplicates_on_index;
811 return u.remove_duplicates_on_index;
815 return u.alternative;
819 return u.alternative;
823 return u.cache_invalidator;
827 return u.cache_invalidator;
831 return u.delete_rows;
835 return u.delete_rows;
839 return u.update_rows;
843 return u.update_rows;
1216static_assert(std::is_trivially_destructible<AccessPath>::value,
1217 "AccessPath must be trivially destructible, as it is allocated "
1218 "on the MEM_ROOT and not wrapped in unique_ptr_destroy_only"
1219 "(because multiple candidates during planning could point to "
1220 "the same access paths, and refcounting would be expensive)");
1222 "We are creating a lot of access paths in the join "
1223 "optimizer, so be sure not to bloat it without noticing. "
1224 "(96 bytes for the base, 48 bytes for the variant.)");
1239 bool count_examined_rows) {
1242 path->count_examined_rows = count_examined_rows;
1243 path->table_scan().table = table;
1249 bool count_examined_rows) {
1252 path->count_examined_rows = count_examined_rows;
1253 path->index_scan().table = table;
1254 path->index_scan().idx = idx;
1255 path->index_scan().use_order = use_order;
1262 bool count_examined_rows) {
1265 path->count_examined_rows = count_examined_rows;
1266 path->ref().table = table;
1268 path->ref().use_order = use_order;
1275 bool count_examined_rows) {
1278 path->count_examined_rows = count_examined_rows;
1279 path->ref_or_null().table = table;
1280 path->ref_or_null().ref =
ref;
1281 path->ref_or_null().use_order = use_order;
1286 bool count_examined_rows) {
1289 path->count_examined_rows = count_examined_rows;
1290 path->eq_ref().table = table;
1298 bool count_examined_rows) {
1301 path->count_examined_rows = count_examined_rows;
1302 path->pushed_join_ref().table = table;
1303 path->pushed_join_ref().ref =
ref;
1304 path->pushed_join_ref().use_order = use_order;
1305 path->pushed_join_ref().is_unique = is_unique;
1312 bool use_order,
bool use_limit,
1313 bool count_examined_rows) {
1316 path->count_examined_rows = count_examined_rows;
1317 path->full_text_search().table = table;
1318 path->full_text_search().ref =
ref;
1319 path->full_text_search().use_order = use_order;
1320 path->full_text_search().use_limit = use_limit;
1321 path->full_text_search().ft_func = ft_func;
1327 bool count_examined_rows) {
1330 path->count_examined_rows = count_examined_rows;
1331 path->set_num_output_rows(1.0);
1333 path->init_cost = 0.0;
1334 path->init_once_cost = 0.0;
1335 path->const_table().table = table;
1336 path->const_table().ref =
ref;
1344 path->mrr().table = table;
1346 path->mrr().mrr_flags = mrr_flags;
1349 path->mrr().bka_path =
nullptr;
1355 bool count_examined_rows) {
1358 path->count_examined_rows = count_examined_rows;
1359 path->follow_tail().table = table;
1367 path->count_examined_rows = count_examined_rows;
1368 path->dynamic_index_range_scan().table = table;
1369 path->dynamic_index_range_scan().qep_tab = qep_tab;
1378 path->materialized_table_function().table = table;
1379 path->materialized_table_function().table_function = table_function;
1380 path->materialized_table_function().table_path = table_path;
1395 path->count_examined_rows =
true;
1401 KEY *
key,
size_t key_len) {
1404 path->nested_loop_semijoin_with_duplicate_removal().outer = outer;
1405 path->nested_loop_semijoin_with_duplicate_removal().inner = inner;
1406 path->nested_loop_semijoin_with_duplicate_removal().table = table;
1407 path->nested_loop_semijoin_with_duplicate_removal().key =
key;
1408 path->nested_loop_semijoin_with_duplicate_removal().key_len = key_len;
1416 path->filter().child = child;
1417 path->filter().condition = condition;
1418 path->filter().materialize_subqueries =
false;
1425 ORDER *order,
bool count_examined_rows);
1431 path->aggregate().child = child;
1432 path->aggregate().rollup = rollup;
1441 path->temptable_aggregate().subquery_path = subquery_path;
1442 path->temptable_aggregate().temp_table_param = temp_table_param;
1443 path->temptable_aggregate().table = table;
1444 path->temptable_aggregate().table_path = table_path;
1445 path->temptable_aggregate().ref_slice = ref_slice;
1451 bool count_all_rows,
1452 bool reject_multiple_rows,
1453 ha_rows *send_records_override) {
1457 path->immediate_update_delete_table = child->immediate_update_delete_table;
1458 path->limit_offset().child = child;
1459 path->limit_offset().limit = limit;
1460 path->limit_offset().offset = offset;
1461 path->limit_offset().count_all_rows = count_all_rows;
1462 path->limit_offset().reject_multiple_rows = reject_multiple_rows;
1463 path->limit_offset().send_records_override = send_records_override;
1464 path->ordering_state = child->ordering_state;
1470 bool count_examined_rows) {
1473 path->count_examined_rows = count_examined_rows;
1474 path->set_num_output_rows(1.0);
1476 path->init_cost = 0.0;
1477 path->init_once_cost = 0.0;
1482 const char *cause) {
1485 path->zero_rows().child = child;
1486 path->zero_rows().cause = cause;
1487 path->set_num_output_rows(0.0);
1489 path->init_cost = 0.0;
1490 path->init_once_cost = 0.0;
1491 path->num_output_rows_before_filter = 0.0;
1492 path->cost_before_filter = 0.0;
1501 const char *cause) {
1504 path->zero_rows_aggregated().cause = cause;
1505 path->set_num_output_rows(1.0);
1507 path->init_cost = 0.0;
1514 TABLE *table,
int ref_slice) {
1517 path->stream().child = child;
1519 path->stream().temp_table_param = temp_table_param;
1520 path->stream().table = table;
1521 path->stream().ref_slice = ref_slice;
1523 path->stream().provide_rowid =
false;
1531 assert(
path !=
nullptr);
1548 int ref_slice,
bool rematerialize,
ha_rows limit_rows,
1549 bool reject_multiple_rows) {
1553 if (rematerialize) {
1560 param->
table = table;
1582 path->materialize().table_path = table_path;
1583 path->materialize().param = param;
1584 path->materialize().subquery_cost = -1.0;
1585 if (rematerialize) {
1598 path->materialize_information_schema_table().table_path = table_path;
1599 path->materialize_information_schema_table().table_list = table_list;
1600 path->materialize_information_schema_table().condition = condition;
1610 path->append().children = children;
1612 path->init_cost = 0.0;
1613 path->init_once_cost = 0.0;
1614 double num_output_rows = 0.0;
1616 path->cost += child.path->cost;
1617 path->init_cost += child.path->init_cost;
1618 path->init_once_cost += child.path->init_once_cost;
1619 num_output_rows += child.path->num_output_rows();
1621 path->set_num_output_rows(num_output_rows);
1628 int ref_slice,
bool needs_buffering) {
1631 path->window().child = child;
1632 path->window().window = window;
1633 path->window().temp_table =
nullptr;
1634 path->window().temp_table_param = temp_table_param;
1635 path->window().ref_slice = ref_slice;
1636 path->window().needs_buffering = needs_buffering;
1644 path->weedout().child = child;
1645 path->weedout().weedout_table = weedout_table;
1646 path->weedout().tables_to_get_rowid_for =
1653 int group_items_size) {
1656 path->remove_duplicates().child = child;
1657 path->remove_duplicates().group_items = group_items;
1658 path->remove_duplicates().group_items_size = group_items_size;
1664 unsigned loosescan_key_len) {
1667 path->remove_duplicates_on_index().child = child;
1668 path->remove_duplicates_on_index().table = table;
1669 path->remove_duplicates_on_index().key =
key;
1670 path->remove_duplicates_on_index().loosescan_key_len = loosescan_key_len;
1679 path->alternative().table_scan_path = table_scan_path;
1680 path->alternative().child = child;
1681 path->alternative().used_ref = used_ref;
1689 path->cache_invalidator().child = child;
1690 path->cache_invalidator().name =
name;
1723 bool eligible_for_batch_mode);
1731 eligible_for_batch_mode);
1735 const POSITION *pos,
bool is_after_filter,
1782 unsigned num_where_predicates);
1790 int num_where_predicates);
1796 unsigned num_where_predicates);
AccessPath * NewStreamingAccessPath(THD *thd, AccessPath *child, JOIN *join, Temp_table_param *temp_table_param, TABLE *table, int ref_slice)
Definition: access_path.h:1511
AccessPath * NewRemoveDuplicatesAccessPath(THD *thd, AccessPath *child, Item **group_items, int group_items_size)
Definition: access_path.h:1651
AccessPath * NewInvalidatorAccessPath(THD *thd, AccessPath *child, const char *name)
Definition: access_path.h:1685
AccessPath * NewRefAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool use_order, bool reverse, bool count_examined_rows)
Definition: access_path.h:1260
AccessPath * NewDeleteRowsAccessPath(THD *thd, AccessPath *child, table_map delete_tables, table_map immediate_tables)
Definition: access_path.cc:100
bool FinalizeMaterializedSubqueries(THD *thd, JOIN *join, AccessPath *path)
If the path is a FILTER path marked that subqueries are to be materialized, do so.
Definition: access_path.cc:307
void CopyBasicProperties(const AccessPath &from, AccessPath *to)
Definition: access_path.h:1226
void ExpandSingleFilterAccessPath(THD *thd, AccessPath *path, const JOIN *join, const Mem_root_array< Predicate > &predicates, unsigned num_where_predicates)
Like ExpandFilterAccessPaths(), but expands only the single access path at “path”.
Definition: access_path.cc:1349
AccessPath * NewFullTextSearchAccessPath(THD *thd, TABLE *table, Index_lookup *ref, Item_func_match *ft_func, bool use_order, bool use_limit, bool count_examined_rows)
Definition: access_path.h:1309
AccessPath * NewTemptableAggregateAccessPath(THD *thd, AccessPath *subquery_path, Temp_table_param *temp_table_param, TABLE *table, AccessPath *table_path, int ref_slice)
Definition: access_path.h:1436
table_map GetHashJoinTables(AccessPath *path)
Returns the tables that are part of a hash join.
Definition: access_path.cc:1471
AccessPath * NewDynamicIndexRangeScanAccessPath(THD *thd, TABLE *table, QEP_TAB *qep_tab, bool count_examined_rows)
Definition: access_path.h:1363
AccessPath * NewZeroRowsAggregatedAccessPath(THD *thd, const char *cause)
Definition: access_path.h:1500
AccessPath * NewAlternativeAccessPath(THD *thd, AccessPath *child, AccessPath *table_scan_path, Index_lookup *used_ref)
Definition: access_path.h:1674
AccessPath * NewUpdateRowsAccessPath(THD *thd, AccessPath *child, table_map delete_tables, table_map immediate_tables)
Definition: access_path.cc:112
AccessPath * NewMRRAccessPath(THD *thd, TABLE *table, Index_lookup *ref, int mrr_flags)
Definition: access_path.h:1340
table_map GetUsedTableMap(const AccessPath *path, bool include_pruned_tables)
Returns a map of all tables read when path or any of its children are executed.
Definition: access_path.cc:214
AccessPath * NewAppendAccessPath(THD *thd, Mem_root_array< AppendPathParameters > *children)
Definition: access_path.h:1606
AccessPath * NewNestedLoopSemiJoinWithDuplicateRemovalAccessPath(THD *thd, AccessPath *outer, AccessPath *inner, const TABLE *table, KEY *key, size_t key_len)
Definition: access_path.h:1399
AccessPath * NewRemoveDuplicatesOnIndexAccessPath(THD *thd, AccessPath *child, TABLE *table, KEY *key, unsigned loosescan_key_len)
Definition: access_path.h:1662
AccessPath * NewFakeSingleRowAccessPath(THD *thd, bool count_examined_rows)
Definition: access_path.h:1469
Item * ConditionFromFilterPredicates(const Mem_root_array< Predicate > &predicates, OverflowBitset mask, int num_where_predicates)
Extracts the Item expression from the given “filter_predicates” corresponding to the given “mask”.
Definition: access_path.cc:1338
AccessPath * NewFilterAccessPath(THD *thd, AccessPath *child, Item *condition)
Definition: access_path.h:1412
constexpr double kUnknownRowCount
To indicate that a row estimate is not yet made.
Definition: access_path.h:168
AccessPath * NewSortAccessPath(THD *thd, AccessPath *child, Filesort *filesort, ORDER *order, bool count_examined_rows)
Definition: access_path.cc:65
AccessPath * NewMaterializedTableFunctionAccessPath(THD *thd, TABLE *table, Table_function *table_function, AccessPath *table_path)
Definition: access_path.h:1373
AccessPath * NewMaterializeAccessPath(THD *thd, Mem_root_array< MaterializePathParameters::QueryBlock > query_blocks, Mem_root_array< const AccessPath * > *invalidators, TABLE *table, AccessPath *table_path, Common_table_expr *cte, Query_expression *unit, int ref_slice, bool rematerialize, ha_rows limit_rows, bool reject_multiple_rows)
Definition: access_path.h:1543
Mem_root_array< TABLE * > CollectTables(THD *thd, AccessPath *root_path)
Find the list of all tables used by this root, stopping at materializations.
Definition: access_path.cc:245
AccessPath * NewTableScanAccessPath(THD *thd, TABLE *table, bool count_examined_rows)
Definition: access_path.h:1238
void ExpandFilterAccessPaths(THD *thd, AccessPath *path, const JOIN *join, const Mem_root_array< Predicate > &predicates, unsigned num_where_predicates)
For each access path in the (sub)tree rooted at “path”, expand any use of “filter_predicates” into ne...
Definition: access_path.cc:1459
AccessPath * NewMaterializeInformationSchemaTableAccessPath(THD *thd, AccessPath *table_path, Table_ref *table_list, Item *condition)
Definition: access_path.h:1594
void FindTablesToGetRowidFor(AccessPath *path)
Modifies "path" and the paths below it so that they provide row IDs for all tables.
Definition: access_path.cc:1194
Mem_root_array< MaterializePathParameters::QueryBlock > SingleMaterializeQueryBlock(THD *thd, AccessPath *path, int select_number, JOIN *join, bool copy_items, Temp_table_param *temp_table_param)
Definition: access_path.h:1528
AccessPath * NewAggregateAccessPath(THD *thd, AccessPath *child, bool rollup)
Definition: access_path.h:1427
TABLE * GetBasicTable(const AccessPath *path)
Return the TABLE* referred from 'path' if it is a basic access path, else a nullptr is returned.
Definition: access_path.cc:161
AccessPath * NewRefOrNullAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool use_order, bool count_examined_rows)
Definition: access_path.h:1273
AccessPath * NewLimitOffsetAccessPath(THD *thd, AccessPath *child, ha_rows limit, ha_rows offset, bool count_all_rows, bool reject_multiple_rows, ha_rows *send_records_override)
Definition: access_path.h:1449
AccessPath * NewEQRefAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool count_examined_rows)
Definition: access_path.h:1285
AccessPath * NewWindowAccessPath(THD *thd, AccessPath *child, Window *window, Temp_table_param *temp_table_param, int ref_slice, bool needs_buffering)
Definition: access_path.h:1625
AccessPath * NewFollowTailAccessPath(THD *thd, TABLE *table, bool count_examined_rows)
Definition: access_path.h:1354
AccessPath * NewTableValueConstructorAccessPath(THD *thd)
Definition: access_path.h:1390
AccessPath * NewConstTableAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool count_examined_rows)
Definition: access_path.h:1325
unique_ptr_destroy_only< RowIterator > CreateIteratorFromAccessPath(THD *thd, MEM_ROOT *mem_root, AccessPath *path, JOIN *join, bool eligible_for_batch_mode)
Definition: access_path.cc:377
AccessPath * NewWeedoutAccessPath(THD *thd, AccessPath *child, SJ_TMP_TABLE *weedout_table)
Definition: access_path.h:1640
AccessPath * NewPushedJoinRefAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool use_order, bool is_unique, bool count_examined_rows)
Definition: access_path.h:1295
AccessPath * NewZeroRowsAccessPath(THD *thd, AccessPath *child, const char *cause)
Definition: access_path.h:1481
AccessPath * NewUnqualifiedCountAccessPath(THD *thd)
Definition: access_path.h:1384
AccessPath * NewIndexScanAccessPath(THD *thd, TABLE *table, int idx, bool use_order, bool reverse, bool count_examined_rows)
Definition: access_path.h:1247
A wrapper class which provides array bounds checking.
Definition: sql_array.h:46
After parsing, a Common Table Expression is accessed through a Table_ref.
Definition: table.h:4295
API for getting cost estimates for server operations that are not directly related to a table object.
Definition: opt_costmodel.h:51
Sorting related info.
Definition: filesort.h:51
Definition: item_func.h:3387
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:850
Definition: sql_optimizer.h:132
A typesafe replacement for DYNAMIC_ARRAY.
Definition: mem_root_array.h:425
Definition: overflow_bitset.h:76
Definition: sql_executor.h:259
Definition: range_optimizer.h:68
This class represents a query expression (one query block or several query blocks combined with UNION...
Definition: sql_lex.h:622
A context for reading through a single table using a chosen access method: index read,...
Definition: row_iterator.h:81
Definition: sql_executor.h:103
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:33
MEM_ROOT * mem_root
Definition: sql_lexer_thd.h:37
Class representing a table function.
Definition: table_function.h:52
Object containing parameters used when creating and using temporary tables.
Definition: temp_table_param.h:94
Represents the (explicit) window of a SQL 2003 section 7.11 <window clause>, or the implicit (inlined...
Definition: window.h:104
static MEM_ROOT mem_root
Definition: client_plugin.cc:109
void EstimateLimitOffsetCost(AccessPath *path)
Estimate the costs and row count for a LIMIT_OFFSET AccessPath.
Definition: cost_model.cc:886
bool filesort(THD *thd, Filesort *filesort, RowIterator *source_iterator, table_map tables_to_get_rowid_for, ha_rows num_rows_estimate, Filesort_info *fs_info, Sort_result *sort_result, ha_rows *found_rows)
Sort a table.
Definition: filesort.cc:366
void SetCostOnTableAccessPath(const Cost_model_server &cost_model, const POSITION *pos, bool is_after_filter, AccessPath *path)
Definition: sql_executor.cc:1852
std::bitset< kMaxSupportedFDs > FunctionalDependencySet
Definition: interesting_orders_defs.h:62
JoinType
Definition: join_type.h:27
static mi_bit_type mask[]
Definition: mi_packrec.cc:140
std::unique_ptr< T, Destroy_only< T > > unique_ptr_destroy_only
std::unique_ptr, but only destroying.
Definition: my_alloc.h:488
my_off_t ha_rows
Definition: my_base.h:1139
#define HA_POS_ERROR
Definition: my_base.h:1141
uint64_t table_map
Definition: my_table_map.h:29
static char * path
Definition: mysqldump.cc:133
PT & ref(PT *tp)
Definition: tablespace_impl.cc:358
uint64_t NodeMap
Since our graphs can never have more than 61 tables, node sets and edge lists are implemented using 6...
Definition: node_map.h:39
RangeReverse< Range > reverse(Range &x)
Iterate over a range in reverse.
Definition: utilities.h:131
std::string join(Container cont, const std::string &delim)
join elements of an container into a string separated by a delimiter.
Definition: string.h:150
OverflowBitset is a fixed-size (once allocated) bitmap that is optimized for the common case of few e...
required string key
Definition: replication_asynchronous_connection_failover.proto:59
case opt name
Definition: sslopt-case.h:32
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:192
auto & weedout()
Definition: access_path.h:789
auto & filter()
Definition: access_path.h:709
bool count_all_rows
Definition: access_path.h:1135
AccessPath * bka_path
Definition: access_path.h:905
auto & ref_or_null()
Definition: access_path.h:517
auto & materialized_table_function()
Definition: access_path.h:629
AccessPath * cpk_child
Definition: access_path.h:966
auto & rowid_union()
Definition: access_path.h:597
double cost_before_filter
Definition: access_path.h:395
hypergraph::NodeMap parameter_tables
If nonzero, a bitmap of other tables whose joined-in rows must already be loaded when rows from this ...
Definition: access_path.h:481
const auto & bka_join() const
Definition: access_path.h:689
TABLE * temp_table
Definition: access_path.h:1172
OverflowBitset equijoin_predicates
Definition: access_path.h:1076
Item ** group_items
Definition: access_path.h:1184
double rescan_cost() const
Return the cost of scanning the given path for the second time (or later) in the given query block.
Definition: access_path.h:390
bool rollup
Definition: access_path.h:1122
auto & materialize()
Definition: access_path.h:757
const auto & temptable_aggregate() const
Definition: access_path.h:737
OverflowBitset & subsumed_sargable_join_predicates()
Similar to applied_sargable_join_predicates, bitmap of sargable join predicates that have been applie...
Definition: access_path.h:453
auto & index_scan()
Definition: access_path.h:501
const auto & delete_rows() const
Definition: access_path.h:833
struct AccessPath::@55::@81 nested_loop_join
const auto & filter() const
Definition: access_path.h:713
auto & delete_rows()
Definition: access_path.h:829
bool reuse_handler
Definition: access_path.h:943
KEY_PART * used_key_part
Definition: access_path.h:917
struct AccessPath::@55::@90 materialize_information_schema_table
struct AccessPath::@55::@71 group_index_skip_scan
OverflowBitset & applied_sargable_join_predicates()
Bitmap of sargable join predicates that have already been applied in this access path by means of an ...
Definition: access_path.h:433
Item * condition
Definition: access_path.h:1094
struct AccessPath::@55::@74 unqualified_count
const auto & index_merge() const
Definition: access_path.h:585
const auto & update_rows() const
Definition: access_path.h:841
enum AccessPath::Type type
auto & alternative()
Definition: access_path.h:813
auto & pushed_join_ref()
Definition: access_path.h:533
AccessPath * outer
Definition: access_path.h:1050
auto & index_skip_scan()
Definition: access_path.h:605
struct AccessPath::@55::@95 remove_duplicates_on_index
bool rewrite_semi_to_inner
Definition: access_path.h:1054
const auto & zero_rows_aggregated() const
Definition: access_path.h:673
auto & group_index_skip_scan()
Definition: access_path.h:613
struct AccessPath::@55::@76 fake_single_row
const auto & eq_ref() const
Definition: access_path.h:529
int group_items_size
Definition: access_path.h:1185
bool use_order
Definition: access_path.h:867
struct AccessPath::@55::@88 stream
bool pfs_batch_mode
Definition: access_path.h:1068
auto & temptable_aggregate()
Definition: access_path.h:733
AccessPath()
Definition: access_path.h:198
GroupIndexSkipScanParameters * param
Definition: access_path.h:1010
auto & rowid_intersection()
Definition: access_path.h:589
bool materialize_subqueries
Definition: access_path.h:1104
AccessPath * child
Definition: access_path.h:1038
bool allow_spill_to_disk
Definition: access_path.h:1052
Index_lookup * used_ref
Definition: access_path.h:1198
struct AccessPath::@55::@78 zero_rows_aggregated
auto & mrr()
Definition: access_path.h:557
struct AccessPath::@55::@70 index_skip_scan
const auto & index_scan() const
Definition: access_path.h:505
const auto & fake_single_row() const
Definition: access_path.h:657
bool reject_multiple_rows
Definition: access_path.h:1136
bool allow_clustered_primary_key_scan
Definition: access_path.h:958
const char * name
Definition: access_path.h:1202
bool use_limit
Definition: access_path.h:895
Window * window
Definition: access_path.h:1171
table_map tables_to_get_rowid_for
Definition: access_path.h:1055
auto & materialize_information_schema_table()
Definition: access_path.h:765
auto & bka_join()
Definition: access_path.h:685
const auto & follow_tail() const
Definition: access_path.h:569
struct AccessPath::@55::@83 filter
SJ_TMP_TABLE * weedout_table
Definition: access_path.h:1179
Index_lookup * ref
Definition: access_path.h:872
const auto & window() const
Definition: access_path.h:785
const auto & materialized_table_function() const
Definition: access_path.h:633
auto & unqualified_count()
Definition: access_path.h:637
bool keep_current_rowid
Definition: access_path.h:907
bool using_extended_key_parts
Definition: access_path.h:953
auto & nested_loop_join()
Definition: access_path.h:693
const auto & full_text_search() const
Definition: access_path.h:545
bool can_be_used_for_ror
Definition: access_path.h:933
float rec_per_key
Definition: access_path.h:1061
Safety safe_for_rowid
Whether it is safe to get row IDs (for sorting) from this access path.
Definition: access_path.h:291
JOIN * join
Definition: access_path.h:1143
struct AccessPath::@55::@69 rowid_union
unsigned index
Definition: access_path.h:929
unsigned mrr_buf_size
Definition: access_path.h:925
struct AccessPath::@55::@60 eq_ref
auto & remove_duplicates()
Definition: access_path.h:797
struct AccessPath::@55::@68 rowid_intersection
struct AccessPath::@55::@61 pushed_join_ref
struct AccessPath::@55::@63 const_table
RowIterator * iterator
If an iterator has been instantiated for this access path, points to the iterator.
Definition: access_path.h:358
const auto & stream() const
Definition: access_path.h:753
double init_cost
Expected cost to initialize this access path; ie., cost to read k out of N rows would be init_cost + ...
Definition: access_path.h:370
const auto & remove_duplicates() const
Definition: access_path.h:801
auto & window()
Definition: access_path.h:781
bool need_rows_in_rowid_order
Definition: access_path.h:937
Table_ref * table_list
Definition: access_path.h:1163
const auto & unqualified_count() const
Definition: access_path.h:641
void * secondary_engine_data
Auxiliary data used by a secondary storage engine while processing the access path during optimizatio...
Definition: access_path.h:490
struct AccessPath::@55::@86 temptable_aggregate
struct AccessPath::@55::@85 aggregate
void set_num_output_rows(double val)
Definition: access_path.h:848
bool is_covering
Definition: access_path.h:986
const auto & mrr() const
Definition: access_path.h:561
bool remove_duplicates
Definition: access_path.h:1116
table_map tables_to_update
Definition: access_path.h:1211
const auto & table_value_constructor() const
Definition: access_path.h:649
KEY * key
Definition: access_path.h:1088
auto & table_value_constructor()
Definition: access_path.h:645
auto & stream()
Definition: access_path.h:749
size_t key_len
Definition: access_path.h:1089
const OverflowBitset & subsumed_sargable_join_predicates() const
Definition: access_path.h:456
const auto & zero_rows() const
Definition: access_path.h:665
const auto & append() const
Definition: access_path.h:777
ha_rows offset
Definition: access_path.h:1134
int idx
Definition: access_path.h:866
struct AccessPath::@55::@87 limit_offset
auto & hash_join()
Definition: access_path.h:677
auto & cache_invalidator()
Definition: access_path.h:821
struct AccessPath::@55::@73 materialized_table_function
bool force_sort_rowids
Definition: access_path.h:1118
unsigned num_used_key_parts
Definition: access_path.h:930
unsigned num_ranges
Definition: access_path.h:922
ORDER * order
Definition: access_path.h:1114
auto & sort()
Definition: access_path.h:717
auto & fake_single_row()
Definition: access_path.h:653
ha_rows limit
Definition: access_path.h:1115
auto & follow_tail()
Definition: access_path.h:565
double m_num_output_rows
Expected number of output rows, -1.0 for unknown.
Definition: access_path.h:852
const JoinPredicate * join_predicate
Definition: access_path.h:1051
const auto & const_table() const
Definition: access_path.h:553
const auto & dynamic_index_range_scan() const
Definition: access_path.h:625
const auto & table_scan() const
Definition: access_path.h:497
unsigned mrr_flags
Definition: access_path.h:924
int ref_slice
Definition: access_path.h:1129
OverflowBitset filter_predicates
Bitmap of WHERE predicates that we are including on this access path, referring to the “predicates” a...
Definition: access_path.h:417
bool can_be_used_for_imerge
Definition: access_path.h:940
bool forced_by_hint
Definition: access_path.h:957
auto & limit_offset()
Definition: access_path.h:741
AccessPath * inner
Definition: access_path.h:1050
bool provide_rowid
Definition: access_path.h:1146
const auto & index_range_scan() const
Definition: access_path.h:577
struct AccessPath::@55::@59 ref_or_null
const auto & ref() const
Definition: access_path.h:513
bool forced_by_dbug
Whether this access path is forced preferred over all others by means of a SET DEBUG force_subplan_0x...
Definition: access_path.h:302
Item_func_match * ft_func
Definition: access_path.h:896
struct AccessPath::@55::@79 hash_join
ha_rows * send_records_override
Definition: access_path.h:1139
struct AccessPath::@55::@77 zero_rows
auto & table_scan()
Definition: access_path.h:493
const auto & hash_join() const
Definition: access_path.h:681
QEP_TAB * qep_tab
Definition: access_path.h:1014
Table_function * table_function
Definition: access_path.h:1018
auto & zero_rows_aggregated()
Definition: access_path.h:669
const auto & sort() const
Definition: access_path.h:721
bool unwrap_rollup
Definition: access_path.h:1117
struct AccessPath::@55::@93 weedout
double init_once_cost
Of init_cost, how much of the initialization needs only to be done once per query block.
Definition: access_path.h:382
Type
Definition: access_path.h:207
@ FOLLOW_TAIL
Definition: access_path.h:220
@ FILTER
Definition: access_path.h:244
@ PUSHED_JOIN_REF
Definition: access_path.h:216
@ ZERO_ROWS_AGGREGATED
Definition: access_path.h:233
@ UPDATE_ROWS
Definition: access_path.h:262
@ AGGREGATE
Definition: access_path.h:246
@ BKA_JOIN
Definition: access_path.h:240
@ ZERO_ROWS
Definition: access_path.h:232
@ CONST_TABLE
Definition: access_path.h:218
@ GROUP_INDEX_SKIP_SCAN
Definition: access_path.h:226
@ INDEX_RANGE_SCAN
Definition: access_path.h:221
@ UNQUALIFIED_COUNT
Definition: access_path.h:235
@ EQ_REF
Definition: access_path.h:215
@ FAKE_SINGLE_ROW
Definition: access_path.h:231
@ MATERIALIZE_INFORMATION_SCHEMA_TABLE
Definition: access_path.h:251
@ WINDOW
Definition: access_path.h:253
@ REF_OR_NULL
Definition: access_path.h:214
@ MATERIALIZE
Definition: access_path.h:250
@ NESTED_LOOP_SEMIJOIN_WITH_DUPLICATE_REMOVAL
Definition: access_path.h:239
@ ROWID_UNION
Definition: access_path.h:224
@ INDEX_SKIP_SCAN
Definition: access_path.h:225
@ MRR
Definition: access_path.h:219
@ CACHE_INVALIDATOR
Definition: access_path.h:258
@ INDEX_SCAN
Definition: access_path.h:212
@ TABLE_VALUE_CONSTRUCTOR
Definition: access_path.h:230
@ WEEDOUT
Definition: access_path.h:254
@ MATERIALIZED_TABLE_FUNCTION
Definition: access_path.h:234
@ REMOVE_DUPLICATES_ON_INDEX
Definition: access_path.h:256
@ TABLE_SCAN
Definition: access_path.h:211
@ REF
Definition: access_path.h:213
@ TEMPTABLE_AGGREGATE
Definition: access_path.h:247
@ LIMIT_OFFSET
Definition: access_path.h:248
@ APPEND
Definition: access_path.h:252
@ NESTED_LOOP_JOIN
Definition: access_path.h:238
@ INDEX_MERGE
Definition: access_path.h:222
@ FULL_TEXT_SEARCH
Definition: access_path.h:217
@ ALTERNATIVE
Definition: access_path.h:257
@ STREAM
Definition: access_path.h:249
@ REMOVE_DUPLICATES
Definition: access_path.h:255
@ ROWID_INTERSECTION
Definition: access_path.h:223
@ DYNAMIC_INDEX_RANGE_SCAN
Definition: access_path.h:227
@ DELETE_ROWS
Definition: access_path.h:261
@ SORT
Definition: access_path.h:245
@ HASH_JOIN
Definition: access_path.h:241
bool retrieve_full_rows
Definition: access_path.h:969
const auto & rowid_union() const
Definition: access_path.h:601
const TABLE * table
Definition: access_path.h:1087
const auto & index_skip_scan() const
Definition: access_path.h:609
auto & dynamic_index_range_scan()
Definition: access_path.h:621
const auto & pushed_join_ref() const
Definition: access_path.h:537
struct AccessPath::@55::@72 dynamic_index_range_scan
auto & remove_duplicates_on_index()
Definition: access_path.h:805
table_map immediate_tables
Definition: access_path.h:1207
struct AccessPath::@55::@64 mrr
int mrr_flags
Definition: access_path.h:906
auto & full_text_search()
Definition: access_path.h:541
const auto & materialize() const
Definition: access_path.h:761
int ordering_state
Which ordering the rows produced by this path follow, if any (see interesting_orders....
Definition: access_path.h:352
auto & eq_ref()
Definition: access_path.h:525
JoinType join_type
Definition: access_path.h:1059
struct AccessPath::@55::@84 sort
struct AccessPath::@55::@66 index_range_scan
struct AccessPath::@55::@97 cache_invalidator
const auto & limit_offset() const
Definition: access_path.h:745
MaterializePathParameters * param
Definition: access_path.h:1157
const char * cause
Definition: access_path.h:1041
struct AccessPath::@55::@98 delete_rows
auto & update_rows()
Definition: access_path.h:837
auto & index_merge()
Definition: access_path.h:581
auto & aggregate()
Definition: access_path.h:725
struct AccessPath::@55::@62 full_text_search
const auto & group_index_skip_scan() const
Definition: access_path.h:617
auto & zero_rows()
Definition: access_path.h:661
AccessPath * subquery_path
Definition: access_path.h:1125
Mem_root_array< AppendPathParameters > * children
Definition: access_path.h:1167
double cost
Expected cost to read all of this access path once; -1.0 for unknown.
Definition: access_path.h:361
const auto & nested_loop_join() const
Definition: access_path.h:697
struct AccessPath::@55::@96 alternative
bool already_expanded_predicates
Definition: access_path.h:1069
const auto & remove_duplicates_on_index() const
Definition: access_path.h:809
struct AccessPath::@55::@67 index_merge
Temp_table_param * temp_table_param
Definition: access_path.h:1126
auto & nested_loop_semijoin_with_duplicate_removal()
Definition: access_path.h:701
bool reverse
Definition: access_path.h:868
AccessPath * table_scan_path
Definition: access_path.h:1194
const auto & materialize_information_schema_table() const
Definition: access_path.h:769
double subquery_cost
The total cost of executing the queries that we materialize.
Definition: access_path.h:1159
bool geometry
Definition: access_path.h:946
bool count_examined_rows
Whether this access path counts as one that scans a base table, and thus should be counted towards ex...
Definition: access_path.h:297
unsigned loosescan_key_len
Definition: access_path.h:1191
auto & ref()
Definition: access_path.h:509
struct AccessPath::@55::@80 bka_join
struct AccessPath::@55::@82 nested_loop_semijoin_with_duplicate_removal
table_map tables_to_delete_from
Definition: access_path.h:1206
struct AccessPath::@55::@57 index_scan
IndexSkipScanParameters * param
Definition: access_path.h:1001
const OverflowBitset & applied_sargable_join_predicates() const
Definition: access_path.h:436
Mem_root_array< AccessPath * > * children
Definition: access_path.h:959
OverflowBitset delayed_predicates
Bitmap of WHERE predicates that touch tables we have joined in, but that we could not apply yet (for ...
Definition: access_path.h:445
AccessPath * table_path
Definition: access_path.h:1019
const auto & aggregate() const
Definition: access_path.h:729
TABLE * table
Definition: access_path.h:862
auto & append()
Definition: access_path.h:773
struct AccessPath::@55::@99 update_rows
const auto & weedout() const
Definition: access_path.h:793
const auto & cache_invalidator() const
Definition: access_path.h:825
bool needs_buffering
Definition: access_path.h:1175
int8_t immediate_update_delete_table
For UPDATE and DELETE statements: The node index of a table which can be updated or deleted from imme...
Definition: access_path.h:346
QUICK_RANGE ** ranges
Definition: access_path.h:921
bool is_unique
Definition: access_path.h:889
const auto & alternative() const
Definition: access_path.h:817
Safety
A general enum to describe the safety of a given operation.
Definition: access_path.h:272
@ SAFE_IF_SCANNED_ONCE
The given operation is safe if this access path is scanned once, but not if it's scanned multiple tim...
Definition: access_path.h:281
@ UNSAFE
The given operation is unsafe on this access path, no matter how many or few times it's scanned.
Definition: access_path.h:287
@ SAFE
The given operation is always safe on this access path.
Definition: access_path.h:274
auto & const_table()
Definition: access_path.h:549
struct AccessPath::@55::@75 table_value_constructor
unsigned mrr_length_per_rec
Definition: access_path.h:1060
struct AccessPath::@55::@65 follow_tail
const auto & rowid_intersection() const
Definition: access_path.h:593
auto & index_range_scan()
Definition: access_path.h:573
double num_output_rows() const
Definition: access_path.h:846
struct AccessPath::@55::@89 materialize
double num_output_rows_before_filter
If no filter, identical to num_output_rows, cost, respectively.
Definition: access_path.h:394
const auto & ref_or_null() const
Definition: access_path.h:521
struct AccessPath::@55::@91 append
Filesort * filesort
Definition: access_path.h:1108
bool store_rowids
Definition: access_path.h:1053
const auto & nested_loop_semijoin_with_duplicate_removal() const
Definition: access_path.h:705
struct AccessPath::@55::@56 table_scan
Definition: access_path.h:162
JOIN * join
Definition: access_path.h:164
AccessPath * path
Definition: access_path.h:163
Definition: group_index_skip_scan_plan.h:44
Logically a part of AccessPath::index_skip_scan(), but is too large, so split out into its own struct...
Definition: index_skip_scan_plan.h:72
Structure used for index-based lookups.
Definition: sql_opt_exec_shared.h:66
A specification that two specific relational expressions (e.g., two tables, or a table and a join bet...
Definition: access_path.h:75
int semijoin_group_size
Definition: access_path.h:108
FunctionalDependencySet functional_dependencies
Definition: access_path.h:92
Mem_root_array< int > functional_dependencies_idx
Definition: access_path.h:97
RelationalExpression * expr
Definition: access_path.h:76
double selectivity
Definition: access_path.h:77
int ordering_idx_needed_for_semijoin_rewrite
Definition: access_path.h:102
Item ** semijoin_group
Definition: access_path.h:107
size_t estimated_bytes_per_row
Definition: access_path.h:81
Definition: range_optimizer.h:54
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:82
Definition: materialize_path_parameters.h:41
int select_number
Definition: materialize_path_parameters.h:43
bool copy_items
Definition: materialize_path_parameters.h:46
Temp_table_param * temp_table_param
Definition: materialize_path_parameters.h:47
AccessPath * subquery_path
Definition: materialize_path_parameters.h:42
bool disable_deduplication_by_hash_field
Definition: materialize_path_parameters.h:45
JOIN * join
Definition: materialize_path_parameters.h:44
Definition: materialize_path_parameters.h:39
bool rematerialize
True if rematerializing on every Init() call (e.g., because we have a dependency on a value from outs...
Definition: materialize_path_parameters.h:79
Common_table_expr * cte
If materializing a CTE, points to it (see m_cte), otherwise nullptr.
Definition: materialize_path_parameters.h:64
bool reject_multiple_rows
True if this is the top level iterator for a materialized derived table transformed from a scalar sub...
Definition: materialize_path_parameters.h:98
ha_rows limit_rows
Used for when pushing LIMIT down to MaterializeIterator; this is more efficient than having a LimitOf...
Definition: materialize_path_parameters.h:91
Mem_root_array< QueryBlock > query_blocks
Definition: materialize_path_parameters.h:57
TABLE * table
Handle to table to materialize into.
Definition: materialize_path_parameters.h:61
int ref_slice
Definition: materialize_path_parameters.h:73
Query_expression * unit
The query expression we are materializing.
Definition: materialize_path_parameters.h:67
Mem_root_array< const AccessPath * > * invalidators
Definition: materialize_path_parameters.h:58
A position of table within a join order.
Definition: sql_select.h:351
A filter of some sort that is not a join condition (those are stored in JoinPredicate objects).
Definition: access_path.h:116
hypergraph::NodeMap total_eligibility_set
Definition: access_path.h:129
bool was_join_condition
Definition: access_path.h:142
Mem_root_array< int > functional_dependencies_idx
Definition: access_path.h:154
FunctionalDependencySet functional_dependencies
Definition: access_path.h:153
int source_multiple_equality_idx
Definition: access_path.h:150
hypergraph::NodeMap used_nodes
Definition: access_path.h:120
Item * condition
Definition: access_path.h:117
double selectivity
Definition: access_path.h:131
Mem_root_array< ContainedSubquery > contained_subqueries
Definition: access_path.h:159
Represents an expression tree in the relational algebra of joins.
Definition: relational_expression.h:80
bool is_union_or_table() const
Test if this tmp table stores the result of a UNION set operation or a single table.
Definition: table.h:1547