24#ifndef SQL_JOIN_OPTIMIZER_ACCESS_PATH_H
25#define SQL_JOIN_OPTIMIZER_ACCESS_PATH_H
195 double output_rows) {
196 assert(init_cost >= 0.0);
197 assert(total_cost >= init_cost);
198 assert(output_rows >= 0.0);
199 if (output_rows <= 1.0) {
202 return init_cost + (total_cost - init_cost) / output_rows;
400 assert(std::isfinite(val));
406 assert(std::isfinite(val));
412 assert(std::isfinite(val));
418 assert(std::isfinite(val));
540 return u.sample_scan;
544 return u.sample_scan;
556 return u.index_distance_scan;
560 return u.index_distance_scan;
572 return u.ref_or_null;
576 return u.ref_or_null;
588 return u.pushed_join_ref;
592 return u.pushed_join_ref;
596 return u.full_text_search;
600 return u.full_text_search;
604 return u.const_table;
608 return u.const_table;
620 return u.follow_tail;
624 return u.follow_tail;
628 return u.index_range_scan;
632 return u.index_range_scan;
636 return u.index_merge;
640 return u.index_merge;
644 return u.rowid_intersection;
648 return u.rowid_intersection;
652 return u.rowid_union;
656 return u.rowid_union;
660 return u.index_skip_scan;
664 return u.index_skip_scan;
668 return u.group_index_skip_scan;
672 return u.group_index_skip_scan;
676 return u.dynamic_index_range_scan;
680 return u.dynamic_index_range_scan;
684 return u.materialized_table_function;
688 return u.materialized_table_function;
692 return u.unqualified_count;
696 return u.unqualified_count;
700 return u.table_value_constructor;
704 return u.table_value_constructor;
708 return u.fake_single_row;
712 return u.fake_single_row;
724 return u.zero_rows_aggregated;
728 return u.zero_rows_aggregated;
748 return u.nested_loop_join;
752 return u.nested_loop_join;
756 return u.nested_loop_semijoin_with_duplicate_removal;
760 return u.nested_loop_semijoin_with_duplicate_removal;
788 return u.temptable_aggregate;
792 return u.temptable_aggregate;
796 return u.limit_offset;
800 return u.limit_offset;
812 return u.materialize;
816 return u.materialize;
820 return u.materialize_information_schema_table;
824 return u.materialize_information_schema_table;
852 return u.remove_duplicates;
856 return u.remove_duplicates;
860 return u.remove_duplicates_on_index;
864 return u.remove_duplicates_on_index;
868 return u.alternative;
872 return u.alternative;
876 return u.cache_invalidator;
880 return u.cache_invalidator;
884 return u.delete_rows;
888 return u.delete_rows;
892 return u.update_rows;
896 return u.update_rows;
902 assert(std::isfinite(val));
1316static_assert(std::is_trivially_destructible<AccessPath>::value,
1317 "AccessPath must be trivially destructible, as it is allocated "
1318 "on the MEM_ROOT and not wrapped in unique_ptr_destroy_only"
1319 "(because multiple candidates during planning could point to "
1320 "the same access paths, and refcounting would be expensive)");
1322 "We are creating a lot of access paths in the join "
1323 "optimizer, so be sure not to bloat it without noticing. "
1324 "(96 bytes for the base, 48 bytes for the variant.)");
1340 bool count_examined_rows) {
1343 path->count_examined_rows = count_examined_rows;
1349 double sampling_percentage,
1350 bool count_examined_rows) {
1353 path->count_examined_rows = count_examined_rows;
1355 path->sample_scan().sampling_percentage = sampling_percentage;
1361 bool count_examined_rows) {
1364 path->count_examined_rows = count_examined_rows;
1366 path->index_scan().idx = idx;
1367 path->index_scan().use_order = use_order;
1374 bool count_examined_rows) {
1377 path->count_examined_rows = count_examined_rows;
1380 path->ref().use_order = use_order;
1387 bool count_examined_rows) {
1390 path->count_examined_rows = count_examined_rows;
1392 path->ref_or_null().ref =
ref;
1393 path->ref_or_null().use_order = use_order;
1398 bool count_examined_rows) {
1401 path->count_examined_rows = count_examined_rows;
1410 bool count_examined_rows) {
1413 path->count_examined_rows = count_examined_rows;
1415 path->pushed_join_ref().ref =
ref;
1416 path->pushed_join_ref().use_order = use_order;
1417 path->pushed_join_ref().is_unique = is_unique;
1424 bool use_order,
bool use_limit,
1425 bool count_examined_rows) {
1428 path->count_examined_rows = count_examined_rows;
1430 path->full_text_search().ref =
ref;
1431 path->full_text_search().use_order = use_order;
1432 path->full_text_search().use_limit = use_limit;
1433 path->full_text_search().ft_func = ft_func;
1439 bool count_examined_rows) {
1442 path->count_examined_rows = count_examined_rows;
1443 path->set_num_output_rows(1.0);
1444 path->set_cost(0.0);
1445 path->set_init_cost(0.0);
1446 path->set_init_once_cost(0.0);
1448 path->const_table().ref =
ref;
1458 path->mrr().mrr_flags = mrr_flags;
1461 path->mrr().bka_path =
nullptr;
1467 bool count_examined_rows) {
1470 path->count_examined_rows = count_examined_rows;
1479 path->count_examined_rows = count_examined_rows;
1480 path->dynamic_index_range_scan().table =
table;
1481 path->dynamic_index_range_scan().qep_tab = qep_tab;
1490 path->materialized_table_function().table =
table;
1491 path->materialized_table_function().table_function = table_function;
1492 path->materialized_table_function().table_path = table_path;
1507 KEY *
key,
size_t key_len) {
1510 path->nested_loop_semijoin_with_duplicate_removal().outer = outer;
1511 path->nested_loop_semijoin_with_duplicate_removal().inner = inner;
1512 path->nested_loop_semijoin_with_duplicate_removal().table =
table;
1513 path->nested_loop_semijoin_with_duplicate_removal().key =
key;
1514 path->nested_loop_semijoin_with_duplicate_removal().key_len = key_len;
1522 path->filter().child = child;
1523 path->filter().condition = condition;
1524 path->filter().materialize_subqueries =
false;
1525 path->has_group_skip_scan = child->has_group_skip_scan;
1532 ORDER *order,
bool count_examined_rows);
1538 path->aggregate().child = child;
1539 path->aggregate().olap = olap;
1540 path->has_group_skip_scan = child->has_group_skip_scan;
1550 path->temptable_aggregate().subquery_path = subquery_path;
1551 path->temptable_aggregate().join =
join;
1552 path->temptable_aggregate().temp_table_param = temp_table_param;
1553 path->temptable_aggregate().table =
table;
1554 path->temptable_aggregate().table_path = table_path;
1555 path->temptable_aggregate().ref_slice = ref_slice;
1561 bool count_all_rows,
1562 bool reject_multiple_rows,
1563 ha_rows *send_records_override) {
1567 path->immediate_update_delete_table = child->immediate_update_delete_table;
1568 path->limit_offset().child = child;
1569 path->limit_offset().limit = limit;
1570 path->limit_offset().offset = offset;
1571 path->limit_offset().count_all_rows = count_all_rows;
1572 path->limit_offset().reject_multiple_rows = reject_multiple_rows;
1573 path->limit_offset().send_records_override = send_records_override;
1574 path->ordering_state = child->ordering_state;
1575 path->has_group_skip_scan = child->has_group_skip_scan;
1581 bool count_examined_rows) {
1584 path->count_examined_rows = count_examined_rows;
1585 path->set_num_output_rows(1.0);
1586 path->set_cost(0.0);
1587 path->set_init_cost(0.0);
1588 path->set_init_once_cost(0.0);
1593 const char *cause) {
1596 path->zero_rows().child = child;
1597 path->zero_rows().cause = cause;
1598 path->set_num_output_rows(0.0);
1599 path->set_cost(0.0);
1600 path->set_init_cost(0.0);
1601 path->set_init_once_cost(0.0);
1602 path->num_output_rows_before_filter = 0.0;
1603 path->set_cost_before_filter(0.0);
1612 const char *cause) {
1615 path->zero_rows_aggregated().cause = cause;
1616 path->set_num_output_rows(1.0);
1617 path->set_cost(0.0);
1618 path->set_init_cost(0.0);
1628 path->stream().child = child;
1630 path->stream().temp_table_param = temp_table_param;
1632 path->stream().ref_slice = ref_slice;
1634 path->stream().provide_rowid =
false;
1635 path->has_group_skip_scan = child->has_group_skip_scan;
1643 assert(
path !=
nullptr);
1659 int ref_slice,
bool rematerialize,
ha_rows limit_rows,
1660 bool reject_multiple_rows,
1666 if (rematerialize) {
1695 path->materialize().table_path = table_path;
1696 path->materialize().param = param;
1699 if (rematerialize) {
1712 path->materialize_information_schema_table().table_path = table_path;
1713 path->materialize_information_schema_table().table_list = table_list;
1714 path->materialize_information_schema_table().condition = condition;
1748 path->append().children = children;
1752 path->set_init_cost(
AddCost(
path->init_cost(), child.path->init_cost()));
1753 path->set_init_once_cost(
path->init_once_cost() +
1754 child.path->init_once_cost());
1756 AddRowCount(num_output_rows, child.path->num_output_rows());
1758 path->set_num_output_rows(num_output_rows);
1765 int ref_slice,
bool needs_buffering) {
1768 path->window().child = child;
1769 path->window().window = window;
1770 path->window().temp_table =
nullptr;
1771 path->window().temp_table_param = temp_table_param;
1772 path->window().ref_slice = ref_slice;
1773 path->window().needs_buffering = needs_buffering;
1774 path->set_num_output_rows(child->num_output_rows());
1782 path->weedout().child = child;
1783 path->weedout().weedout_table = weedout_table;
1784 path->weedout().tables_to_get_rowid_for =
1791 int group_items_size) {
1794 path->remove_duplicates().child = child;
1795 path->remove_duplicates().group_items = group_items;
1796 path->remove_duplicates().group_items_size = group_items_size;
1797 path->has_group_skip_scan = child->has_group_skip_scan;
1803 unsigned loosescan_key_len) {
1806 path->remove_duplicates_on_index().child = child;
1807 path->remove_duplicates_on_index().table =
table;
1808 path->remove_duplicates_on_index().key =
key;
1809 path->remove_duplicates_on_index().loosescan_key_len = loosescan_key_len;
1810 path->has_group_skip_scan = child->has_group_skip_scan;
1819 path->alternative().table_scan_path = table_scan_path;
1820 path->alternative().child = child;
1821 path->alternative().used_ref = used_ref;
1829 path->cache_invalidator().child = child;
1830 path->cache_invalidator().name =
name;
1867 bool eligible_for_batch_mode);
1875 eligible_for_batch_mode);
1879 const POSITION *pos,
bool is_after_filter,
1926 unsigned num_where_predicates);
1934 int num_where_predicates);
1940 unsigned num_where_predicates);
1962 const std::vector<HashJoinCondition> &equijoin_conditions,
constexpr double kUnknownCost
To indicate that a cost estimate is not yet made.
Definition: access_path.h:190
AccessPath * NewStreamingAccessPath(THD *thd, AccessPath *child, JOIN *join, Temp_table_param *temp_table_param, TABLE *table, int ref_slice)
Definition: access_path.h:1622
AccessPath * NewRemoveDuplicatesAccessPath(THD *thd, AccessPath *child, Item **group_items, int group_items_size)
Definition: access_path.h:1789
AccessPath * NewInvalidatorAccessPath(THD *thd, AccessPath *child, const char *name)
Definition: access_path.h:1825
AccessPath * NewRefAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool use_order, bool reverse, bool count_examined_rows)
Definition: access_path.h:1372
AccessPath * NewDeleteRowsAccessPath(THD *thd, AccessPath *child, table_map delete_tables, table_map immediate_tables)
Definition: access_path.cc:122
void CopyBasicProperties(const AccessPath &from, AccessPath *to)
Definition: access_path.h:1326
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:1532
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:1421
double AddRowCount(double c1, double c2)
Add row counts c1 and c2, but handle kUnknownRowCount correctly.
Definition: access_path.h:1731
table_map GetHashJoinTables(AccessPath *path)
Returns the tables that are part of a hash join.
Definition: access_path.cc:1657
AccessPath * NewDynamicIndexRangeScanAccessPath(THD *thd, TABLE *table, QEP_TAB *qep_tab, bool count_examined_rows)
Definition: access_path.h:1475
AccessPath * NewMaterializeAccessPath(THD *thd, Mem_root_array< MaterializePathParameters::Operand > operands, 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, MaterializePathParameters::DedupType dedup_reason=MaterializePathParameters::NO_DEDUP)
Definition: access_path.h:1655
AccessPath * NewZeroRowsAggregatedAccessPath(THD *thd, const char *cause)
Definition: access_path.h:1611
AccessPath * NewAlternativeAccessPath(THD *thd, AccessPath *child, AccessPath *table_scan_path, Index_lookup *used_ref)
Definition: access_path.h:1814
AccessPath * NewUpdateRowsAccessPath(THD *thd, AccessPath *child, table_map delete_tables, table_map immediate_tables)
Definition: access_path.cc:134
AccessPath * NewMRRAccessPath(THD *thd, TABLE *table, Index_lookup *ref, int mrr_flags)
Definition: access_path.h:1452
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:272
AccessPath * NewAppendAccessPath(THD *thd, Mem_root_array< AppendPathParameters > *children)
Definition: access_path.h:1744
AccessPath * NewNestedLoopSemiJoinWithDuplicateRemovalAccessPath(THD *thd, AccessPath *outer, AccessPath *inner, const TABLE *table, KEY *key, size_t key_len)
Definition: access_path.h:1505
void CollectStatusVariables(THD *thd, const JOIN *top_join, const AccessPath &top_path)
Update status variables which count how many scans of various types are used in a query plan.
Definition: access_path.cc:1671
AccessPath * NewTemptableAggregateAccessPath(THD *thd, AccessPath *subquery_path, JOIN *join, Temp_table_param *temp_table_param, TABLE *table, AccessPath *table_path, int ref_slice)
Definition: access_path.h:1544
AccessPath * NewRemoveDuplicatesOnIndexAccessPath(THD *thd, AccessPath *child, TABLE *table, KEY *key, unsigned loosescan_key_len)
Definition: access_path.h:1801
AccessPath * NewFakeSingleRowAccessPath(THD *thd, bool count_examined_rows)
Definition: access_path.h:1580
AccessPath * NewTableValueConstructorAccessPath(const THD *thd, const JOIN *join)
Definition: access_path.cc:166
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:1521
AccessPath * NewFilterAccessPath(THD *thd, AccessPath *child, Item *condition)
Definition: access_path.h:1518
constexpr double kUnknownRowCount
To indicate that a row estimate is not yet made.
Definition: access_path.h:185
AccessPath * NewSortAccessPath(THD *thd, AccessPath *child, Filesort *filesort, ORDER *order, bool count_examined_rows)
Definition: access_path.cc:87
AccessPath * NewMaterializedTableFunctionAccessPath(THD *thd, TABLE *table, Table_function *table_function, AccessPath *table_path)
Definition: access_path.h:1485
const Mem_root_array< Item * > * GetExtraHashJoinConditions(MEM_ROOT *mem_root, bool using_hypergraph_optimizer, const std::vector< HashJoinCondition > &equijoin_conditions, const Mem_root_array< Item * > &other_conditions)
Get the conditions to put into the extra conditions of the HashJoinIterator.
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:303
AccessPath * NewTableScanAccessPath(THD *thd, TABLE *table, bool count_examined_rows)
Definition: access_path.h:1339
AccessPath * NewSampleScanAccessPath(THD *thd, TABLE *table, double sampling_percentage, bool count_examined_rows)
Definition: access_path.h:1348
AccessPath * NewAggregateAccessPath(THD *thd, AccessPath *child, olap_type olap)
Definition: access_path.h:1534
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:1645
double AddCost(double c1, double c2)
Add path costs c1 and c2, but handle kUnknownCost correctly.
Definition: access_path.h:1719
AccessPath * NewMaterializeInformationSchemaTableAccessPath(THD *thd, AccessPath *table_path, Table_ref *table_list, Item *condition)
Definition: access_path.h:1708
void FindTablesToGetRowidFor(AccessPath *path)
Modifies "path" and the paths below it so that they provide row IDs for all tables.
Definition: access_path.cc:1364
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:215
AccessPath * NewRefOrNullAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool use_order, bool count_examined_rows)
Definition: access_path.h:1385
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:1559
AccessPath * NewEQRefAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool count_examined_rows)
Definition: access_path.h:1397
AccessPath * NewWindowAccessPath(THD *thd, AccessPath *child, Window *window, Temp_table_param *temp_table_param, int ref_slice, bool needs_buffering)
Definition: access_path.h:1762
double FirstRowCost(double init_cost, double total_cost, double output_rows)
Calculate the cost of reading the first row from an access path, given estimates for init cost,...
Definition: access_path.h:194
AccessPath * NewFollowTailAccessPath(THD *thd, TABLE *table, bool count_examined_rows)
Definition: access_path.h:1466
AccessPath * NewConstTableAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool count_examined_rows)
Definition: access_path.h:1437
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:515
AccessPath * NewWeedoutAccessPath(THD *thd, AccessPath *child, SJ_TMP_TABLE *weedout_table)
Definition: access_path.h:1778
AccessPath * NewPushedJoinRefAccessPath(THD *thd, TABLE *table, Index_lookup *ref, bool use_order, bool is_unique, bool count_examined_rows)
Definition: access_path.h:1407
AccessPath * NewZeroRowsAccessPath(THD *thd, AccessPath *child, const char *cause)
Definition: access_path.h:1592
AccessPath * NewUnqualifiedCountAccessPath(THD *thd)
Definition: access_path.h:1496
AccessPath * NewIndexScanAccessPath(THD *thd, TABLE *table, int idx, bool use_order, bool reverse, bool count_examined_rows)
Definition: access_path.h:1359
Mem_root_array< MaterializePathParameters::Operand > SingleMaterializeQueryBlock(THD *thd, AccessPath *path, int select_number, JOIN *join, bool copy_items, Temp_table_param *temp_table_param)
Definition: access_path.h:1640
After parsing, a Common Table Expression is accessed through a Table_ref.
Definition: table.h:4484
API for getting cost estimates for server operations that are not directly related to a table object.
Definition: opt_costmodel.h:54
Sorting related info.
Definition: filesort.h:52
A class that represents a join condition in a hash join.
Definition: item_cmpfunc.h:87
Definition: item_func.h:3539
Base class that is used to represent any kind of expression in a relational query.
Definition: item.h:930
Definition: sql_optimizer.h:133
A typesafe replacement for DYNAMIC_ARRAY.
Definition: mem_root_array.h:426
Definition: overflow_bitset.h:78
Definition: sql_executor.h:256
Definition: range_optimizer.h:69
This class represents a query expression (one query block or several query blocks combined with UNION...
Definition: sql_lex.h:627
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
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
MEM_ROOT * mem_root
Definition: sql_lexer_thd.h:40
Class representing a table function.
Definition: table_function.h:53
Object containing parameters used when creating and using temporary tables.
Definition: temp_table_param.h:97
Represents the (explicit) window of a SQL 2003 section 7.11 <window clause>, or the implicit (inlined...
Definition: window.h:110
static MEM_ROOT mem_root
Definition: client_plugin.cc:114
void EstimateLimitOffsetCost(AccessPath *path)
Estimate the costs and row count for a WINDOW AccessPath.
Definition: cost_model.cc:941
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:367
void SetCostOnTableAccessPath(const Cost_model_server &cost_model, const POSITION *pos, bool is_after_filter, AccessPath *path)
Definition: sql_executor.cc:2005
std::bitset< kMaxSupportedFDs > FunctionalDependencySet
Definition: interesting_orders_defs.h:63
JoinType
Definition: join_type.h:28
static mi_bit_type mask[]
Definition: mi_packrec.cc:141
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
This file includes constants used by all storage engines.
my_off_t ha_rows
Definition: my_base.h:1141
#define HA_POS_ERROR
Definition: my_base.h:1143
uint64_t table_map
Definition: my_table_map.h:30
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
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:40
RangeReverse< Range > reverse(Range &x)
Iterate over a range in reverse.
Definition: utilities.h:132
std::string join(const detail::range auto &rng, std::string_view delim)
join elements of a range into a string separated by a delimiter.
Definition: string.h:74
int delete_tables(PFS_engine_table_share_proxy **, unsigned int) noexcept
Definition: pfs_plugin_table_v1_all_empty.cc:39
olap_type
Definition: olap.h:31
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:60
case opt name
Definition: sslopt-case.h:29
Access paths are a query planning structure that correspond 1:1 to iterators, in that an access path ...
Definition: access_path.h:227
auto & weedout()
Definition: access_path.h:842
auto & filter()
Definition: access_path.h:762
bool count_all_rows
Definition: access_path.h:1232
AccessPath * bka_path
Definition: access_path.h:1001
auto & ref_or_null()
Definition: access_path.h:570
auto & materialized_table_function()
Definition: access_path.h:682
AccessPath * cpk_child
Definition: access_path.h:1062
auto & rowid_union()
Definition: access_path.h:650
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:518
const auto & bka_join() const
Definition: access_path.h:742
TABLE * temp_table
Definition: access_path.h:1272
OverflowBitset equijoin_predicates
Definition: access_path.h:1172
Item ** group_items
Definition: access_path.h:1284
struct AccessPath::@63::@85 table_value_constructor
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:429
auto & materialize()
Definition: access_path.h:810
const auto & temptable_aggregate() const
Definition: access_path.h:790
OverflowBitset & subsumed_sargable_join_predicates()
Similar to applied_sargable_join_predicates, bitmap of sargable join predicates that have been applie...
Definition: access_path.h:490
auto & index_scan()
Definition: access_path.h:546
const auto & delete_rows() const
Definition: access_path.h:886
const auto & filter() const
Definition: access_path.h:766
const auto & index_distance_scan() const
Definition: access_path.h:558
auto & delete_rows()
Definition: access_path.h:882
bool reuse_handler
Definition: access_path.h:1039
struct AccessPath::@63::@108 delete_rows
KEY_PART * used_key_part
Definition: access_path.h:1013
double m_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:921
olap_type olap
Definition: access_path.h:1218
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:470
Item * condition
Definition: access_path.h:1190
const auto & index_merge() const
Definition: access_path.h:638
struct AccessPath::@63::@80 index_skip_scan
struct AccessPath::@63::@72 full_text_search
const auto & update_rows() const
Definition: access_path.h:894
double subquery_rows
The number of materialized rows (as opposed to the number of rows fetched by table_path).
Definition: access_path.h:1259
enum AccessPath::Type type
auto & alternative()
Definition: access_path.h:866
struct AccessPath::@63::@88 zero_rows_aggregated
auto & pushed_join_ref()
Definition: access_path.h:586
struct AccessPath::@63::@78 rowid_intersection
void set_cost(double val)
Definition: access_path.h:399
AccessPath * outer
Definition: access_path.h:1146
struct AccessPath::@63::@82 dynamic_index_range_scan
auto & index_skip_scan()
Definition: access_path.h:658
bool rewrite_semi_to_inner
Definition: access_path.h:1150
const auto & zero_rows_aggregated() const
Definition: access_path.h:726
auto & group_index_skip_scan()
Definition: access_path.h:666
struct AccessPath::@63::@94 sort
struct AccessPath::@63::@71 pushed_join_ref
const auto & eq_ref() const
Definition: access_path.h:582
int group_items_size
Definition: access_path.h:1285
bool use_order
Definition: access_path.h:957
struct AccessPath::@63::@77 index_merge
bool pfs_batch_mode
Definition: access_path.h:1164
auto & temptable_aggregate()
Definition: access_path.h:786
GroupIndexSkipScanParameters * param
Definition: access_path.h:1106
auto & rowid_intersection()
Definition: access_path.h:642
double init_cost() const
Definition: access_path.h:388
bool materialize_subqueries
Definition: access_path.h:1200
AccessPath * child
Definition: access_path.h:1134
bool allow_spill_to_disk
Definition: access_path.h:1148
Index_lookup * used_ref
Definition: access_path.h:1298
auto & mrr()
Definition: access_path.h:610
auto & sample_scan()
Definition: access_path.h:538
const auto & index_scan() const
Definition: access_path.h:550
const auto & fake_single_row() const
Definition: access_path.h:710
bool reject_multiple_rows
Definition: access_path.h:1233
bool allow_clustered_primary_key_scan
Definition: access_path.h:1054
const char * name
Definition: access_path.h:1302
bool use_limit
Definition: access_path.h:991
Window * window
Definition: access_path.h:1271
table_map tables_to_get_rowid_for
Definition: access_path.h:1151
struct AccessPath::@63::@98 stream
auto & materialize_information_schema_table()
Definition: access_path.h:818
auto & bka_join()
Definition: access_path.h:738
const auto & follow_tail() const
Definition: access_path.h:622
SJ_TMP_TABLE * weedout_table
Definition: access_path.h:1279
bool has_group_skip_scan
Whether this access path contains a GROUP_INDEX_SKIP_SCAN.
Definition: access_path.h:323
struct AccessPath::@63::@67 index_distance_scan
Index_lookup * ref
Definition: access_path.h:968
const auto & window() const
Definition: access_path.h:838
void set_init_once_cost(double val)
Definition: access_path.h:411
const auto & materialized_table_function() const
Definition: access_path.h:686
auto & unqualified_count()
Definition: access_path.h:690
bool keep_current_rowid
Definition: access_path.h:1003
bool using_extended_key_parts
Definition: access_path.h:1049
auto & nested_loop_join()
Definition: access_path.h:746
const auto & full_text_search() const
Definition: access_path.h:598
struct AccessPath::@63::@105 remove_duplicates_on_index
bool can_be_used_for_ror
Definition: access_path.h:1029
float rec_per_key
Definition: access_path.h:1157
Safety safe_for_rowid
Whether it is safe to get row IDs (for sorting) from this access path.
Definition: access_path.h:314
JOIN * join
Definition: access_path.h:1222
struct AccessPath::@63::@86 fake_single_row
struct AccessPath::@63::@84 unqualified_count
unsigned index
Definition: access_path.h:1025
struct AccessPath::@63::@76 index_range_scan
unsigned mrr_buf_size
Definition: access_path.h:1021
auto & remove_duplicates()
Definition: access_path.h:850
struct AccessPath::@63::@87 zero_rows
struct AccessPath::@63::@65 sample_scan
struct AccessPath::@63::@66 index_scan
RowIterator * iterator
If an iterator has been instantiated for this access path, points to the iterator.
Definition: access_path.h:384
struct AccessPath::@63::@64 table_scan
const auto & stream() const
Definition: access_path.h:806
struct AccessPath::@63::@74 mrr
const auto & remove_duplicates() const
Definition: access_path.h:854
auto & window()
Definition: access_path.h:834
bool need_rows_in_rowid_order
Definition: access_path.h:1033
struct AccessPath::@63::@70 eq_ref
Table_ref * table_list
Definition: access_path.h:1263
const auto & unqualified_count() const
Definition: access_path.h:694
void * secondary_engine_data
Auxiliary data used by a secondary storage engine while processing the access path during optimizatio...
Definition: access_path.h:527
void set_init_cost(double val)
Definition: access_path.h:405
void set_num_output_rows(double val)
Definition: access_path.h:901
struct AccessPath::@63::@83 materialized_table_function
bool is_covering
Definition: access_path.h:1082
const auto & mrr() const
Definition: access_path.h:614
void set_cost_before_filter(double val)
Definition: access_path.h:417
bool remove_duplicates
Definition: access_path.h:1212
table_map tables_to_update
Definition: access_path.h:1311
const auto & table_value_constructor() const
Definition: access_path.h:702
KEY * key
Definition: access_path.h:1184
auto & table_value_constructor()
Definition: access_path.h:698
auto & stream()
Definition: access_path.h:802
size_t key_len
Definition: access_path.h:1185
const OverflowBitset & subsumed_sargable_join_predicates() const
Definition: access_path.h:493
const auto & zero_rows() const
Definition: access_path.h:718
const auto & append() const
Definition: access_path.h:830
ha_rows offset
Definition: access_path.h:1231
int idx
Definition: access_path.h:956
auto & hash_join()
Definition: access_path.h:730
auto & cache_invalidator()
Definition: access_path.h:874
bool force_sort_rowids
Definition: access_path.h:1214
unsigned num_used_key_parts
Definition: access_path.h:1026
unsigned num_ranges
Definition: access_path.h:1018
ORDER * order
Definition: access_path.h:1210
auto & sort()
Definition: access_path.h:770
auto & fake_single_row()
Definition: access_path.h:706
struct AccessPath::@63::@97 limit_offset
ha_rows limit
Definition: access_path.h:1211
auto & follow_tail()
Definition: access_path.h:618
double m_num_output_rows
Expected number of output rows.
Definition: access_path.h:909
const auto & sample_scan() const
Definition: access_path.h:542
const JoinPredicate * join_predicate
Definition: access_path.h:1147
const auto & const_table() const
Definition: access_path.h:606
struct AccessPath::@63::@92 nested_loop_semijoin_with_duplicate_removal
const auto & dynamic_index_range_scan() const
Definition: access_path.h:678
const auto & table_scan() const
Definition: access_path.h:534
unsigned mrr_flags
Definition: access_path.h:1020
int ref_slice
Definition: access_path.h:1226
OverflowBitset filter_predicates
Bitmap of WHERE predicates that we are including on this access path, referring to the “predicates” a...
Definition: access_path.h:454
bool can_be_used_for_imerge
Definition: access_path.h:1036
bool forced_by_hint
Definition: access_path.h:1053
auto & limit_offset()
Definition: access_path.h:794
AccessPath * inner
Definition: access_path.h:1146
QUICK_RANGE * range
Definition: access_path.h:963
bool provide_rowid
Definition: access_path.h:1243
struct AccessPath::@63::@93 filter
const auto & index_range_scan() const
Definition: access_path.h:630
const auto & ref() const
Definition: access_path.h:566
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:328
Item_func_match * ft_func
Definition: access_path.h:992
ha_rows * send_records_override
Definition: access_path.h:1236
auto & table_scan()
Definition: access_path.h:530
const auto & hash_join() const
Definition: access_path.h:734
QEP_TAB * qep_tab
Definition: access_path.h:1110
Table_function * table_function
Definition: access_path.h:1114
auto & zero_rows_aggregated()
Definition: access_path.h:722
struct AccessPath::@63::@73 const_table
const auto & sort() const
Definition: access_path.h:774
struct AccessPath::@63::@95 aggregate
bool unwrap_rollup
Definition: access_path.h:1213
Type
Definition: access_path.h:228
@ FOLLOW_TAIL
Definition: access_path.h:243
@ FILTER
Definition: access_path.h:267
@ PUSHED_JOIN_REF
Definition: access_path.h:239
@ ZERO_ROWS_AGGREGATED
Definition: access_path.h:256
@ UPDATE_ROWS
Definition: access_path.h:285
@ AGGREGATE
Definition: access_path.h:269
@ BKA_JOIN
Definition: access_path.h:263
@ ZERO_ROWS
Definition: access_path.h:255
@ CONST_TABLE
Definition: access_path.h:241
@ GROUP_INDEX_SKIP_SCAN
Definition: access_path.h:249
@ SAMPLE_SCAN
Definition: access_path.h:233
@ INDEX_RANGE_SCAN
Definition: access_path.h:244
@ UNQUALIFIED_COUNT
Definition: access_path.h:258
@ EQ_REF
Definition: access_path.h:238
@ FAKE_SINGLE_ROW
Definition: access_path.h:254
@ MATERIALIZE_INFORMATION_SCHEMA_TABLE
Definition: access_path.h:274
@ WINDOW
Definition: access_path.h:276
@ REF_OR_NULL
Definition: access_path.h:237
@ MATERIALIZE
Definition: access_path.h:273
@ NESTED_LOOP_SEMIJOIN_WITH_DUPLICATE_REMOVAL
Definition: access_path.h:262
@ ROWID_UNION
Definition: access_path.h:247
@ INDEX_SKIP_SCAN
Definition: access_path.h:248
@ MRR
Definition: access_path.h:242
@ CACHE_INVALIDATOR
Definition: access_path.h:281
@ INDEX_SCAN
Definition: access_path.h:234
@ TABLE_VALUE_CONSTRUCTOR
Definition: access_path.h:253
@ WEEDOUT
Definition: access_path.h:277
@ MATERIALIZED_TABLE_FUNCTION
Definition: access_path.h:257
@ REMOVE_DUPLICATES_ON_INDEX
Definition: access_path.h:279
@ TABLE_SCAN
Definition: access_path.h:232
@ REF
Definition: access_path.h:236
@ TEMPTABLE_AGGREGATE
Definition: access_path.h:270
@ LIMIT_OFFSET
Definition: access_path.h:271
@ APPEND
Definition: access_path.h:275
@ NESTED_LOOP_JOIN
Definition: access_path.h:261
@ INDEX_MERGE
Definition: access_path.h:245
@ FULL_TEXT_SEARCH
Definition: access_path.h:240
@ ALTERNATIVE
Definition: access_path.h:280
@ STREAM
Definition: access_path.h:272
@ REMOVE_DUPLICATES
Definition: access_path.h:278
@ ROWID_INTERSECTION
Definition: access_path.h:246
@ DYNAMIC_INDEX_RANGE_SCAN
Definition: access_path.h:250
@ DELETE_ROWS
Definition: access_path.h:284
@ SORT
Definition: access_path.h:268
@ INDEX_DISTANCE_SCAN
Definition: access_path.h:235
@ HASH_JOIN
Definition: access_path.h:264
bool retrieve_full_rows
Definition: access_path.h:1065
double m_init_once_cost
Of init_cost, how much of the initialization needs only to be done once per query block.
Definition: access_path.h:933
const auto & rowid_union() const
Definition: access_path.h:654
const TABLE * table
Definition: access_path.h:1183
const auto & index_skip_scan() const
Definition: access_path.h:662
struct AccessPath::@63::@69 ref_or_null
auto & dynamic_index_range_scan()
Definition: access_path.h:674
const auto & pushed_join_ref() const
Definition: access_path.h:590
auto & remove_duplicates_on_index()
Definition: access_path.h:858
table_map immediate_tables
Definition: access_path.h:1307
double m_cost_before_filter
If no filter, identical to cost.
Definition: access_path.h:937
double cost() const
Definition: access_path.h:386
int mrr_flags
Definition: access_path.h:1002
auto & full_text_search()
Definition: access_path.h:594
const auto & materialize() const
Definition: access_path.h:814
int ordering_state
Which ordering the rows produced by this path follow, if any (see interesting_orders....
Definition: access_path.h:378
auto & eq_ref()
Definition: access_path.h:578
JoinType join_type
Definition: access_path.h:1155
struct AccessPath::@63::@106 alternative
struct AccessPath::@63::@96 temptable_aggregate
const auto & limit_offset() const
Definition: access_path.h:798
MaterializePathParameters * param
Definition: access_path.h:1254
const char * cause
Definition: access_path.h:1137
struct AccessPath::@63::@89 hash_join
auto & update_rows()
Definition: access_path.h:890
auto & index_merge()
Definition: access_path.h:634
auto & aggregate()
Definition: access_path.h:778
struct AccessPath::@63::@101 append
double m_cost
Expected cost to read all of this access path once.
Definition: access_path.h:912
struct AccessPath::@63::@99 materialize
const auto & group_index_skip_scan() const
Definition: access_path.h:670
auto & zero_rows()
Definition: access_path.h:714
AccessPath * subquery_path
Definition: access_path.h:1221
Mem_root_array< AppendPathParameters > * children
Definition: access_path.h:1267
struct AccessPath::@63::@91 nested_loop_join
const auto & nested_loop_join() const
Definition: access_path.h:750
bool already_expanded_predicates
Definition: access_path.h:1165
struct AccessPath::@63::@75 follow_tail
const auto & remove_duplicates_on_index() const
Definition: access_path.h:862
Temp_table_param * temp_table_param
Definition: access_path.h:1223
auto & nested_loop_semijoin_with_duplicate_removal()
Definition: access_path.h:754
bool reverse
Definition: access_path.h:958
AccessPath * table_scan_path
Definition: access_path.h:1294
enum tablesample_type sampling_type
Definition: access_path.h:952
struct AccessPath::@63::@79 rowid_union
const auto & materialize_information_schema_table() const
Definition: access_path.h:822
double subquery_cost
The total cost of executing the queries that we materialize.
Definition: access_path.h:1256
bool geometry
Definition: access_path.h:1042
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:320
unsigned loosescan_key_len
Definition: access_path.h:1291
auto & index_distance_scan()
Definition: access_path.h:554
auto & ref()
Definition: access_path.h:562
struct AccessPath::@63::@90 bka_join
double first_row_cost() const
The cost of reading the first row.
Definition: access_path.h:391
table_map tables_to_delete_from
Definition: access_path.h:1306
double init_once_cost() const
Definition: access_path.h:395
IndexSkipScanParameters * param
Definition: access_path.h:1097
const OverflowBitset & applied_sargable_join_predicates() const
Definition: access_path.h:473
Mem_root_array< AccessPath * > * children
Definition: access_path.h:1055
struct AccessPath::@63::@81 group_index_skip_scan
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:482
AccessPath * table_path
Definition: access_path.h:1115
const auto & aggregate() const
Definition: access_path.h:782
TABLE * table
Definition: access_path.h:947
auto & append()
Definition: access_path.h:826
double cost_before_filter() const
Definition: access_path.h:397
struct AccessPath::@63::@109 update_rows
const auto & weedout() const
Definition: access_path.h:846
const auto & cache_invalidator() const
Definition: access_path.h:878
double sampling_percentage
Definition: access_path.h:951
bool needs_buffering
Definition: access_path.h:1275
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:372
QUICK_RANGE ** ranges
Definition: access_path.h:1017
bool is_unique
Definition: access_path.h:985
const auto & alternative() const
Definition: access_path.h:870
Safety
A general enum to describe the safety of a given operation.
Definition: access_path.h:295
@ 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:304
@ UNSAFE
The given operation is unsafe on this access path, no matter how many or few times it's scanned.
Definition: access_path.h:310
@ SAFE
The given operation is always safe on this access path.
Definition: access_path.h:297
auto & const_table()
Definition: access_path.h:602
unsigned mrr_length_per_rec
Definition: access_path.h:1156
struct AccessPath::@63::@107 cache_invalidator
const auto & rowid_intersection() const
Definition: access_path.h:646
Mem_root_array< Item_values_column * > * output_refs
Definition: access_path.h:1121
auto & index_range_scan()
Definition: access_path.h:626
double num_output_rows() const
Definition: access_path.h:899
double num_output_rows_before_filter
If no filter, identical to num_output_rows.
Definition: access_path.h:432
const auto & ref_or_null() const
Definition: access_path.h:574
Filesort * filesort
Definition: access_path.h:1204
struct AccessPath::@63::@103 weedout
struct AccessPath::@63::@100 materialize_information_schema_table
bool store_rowids
Definition: access_path.h:1149
const auto & nested_loop_semijoin_with_duplicate_removal() const
Definition: access_path.h:758
Definition: access_path.h:179
JOIN * join
Definition: access_path.h:181
AccessPath * path
Definition: access_path.h:180
Definition: group_index_skip_scan_plan.h:45
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:73
Structure used for index-based lookups.
Definition: sql_opt_exec_shared.h:67
A specification that two specific relational expressions (e.g., two tables, or a table and a join bet...
Definition: access_path.h:79
int semijoin_group_size
Definition: access_path.h:125
FunctionalDependencySet functional_dependencies
Definition: access_path.h:96
Mem_root_array< int > functional_dependencies_idx
Definition: access_path.h:101
RelationalExpression * expr
Definition: access_path.h:80
double selectivity
Definition: access_path.h:81
int ordering_idx_needed_for_semijoin_rewrite
Definition: access_path.h:119
Item ** semijoin_group
Definition: access_path.h:124
size_t estimated_bytes_per_row
Definition: access_path.h:85
Definition: range_optimizer.h:55
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: materialize_path_parameters.h:42
AccessPath * subquery_path
Definition: materialize_path_parameters.h:43
int select_number
Definition: materialize_path_parameters.h:44
JOIN * join
Definition: materialize_path_parameters.h:45
bool copy_items
Definition: materialize_path_parameters.h:47
Temp_table_param * temp_table_param
Definition: materialize_path_parameters.h:48
bool disable_deduplication_by_hash_field
Definition: materialize_path_parameters.h:46
Definition: materialize_path_parameters.h:40
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:80
DedupType deduplication_reason
Definition: materialize_path_parameters.h:111
Mem_root_array< Operand > m_operands
Definition: materialize_path_parameters.h:58
Common_table_expr * cte
If materializing a CTE, points to it (see m_cte), otherwise nullptr.
Definition: materialize_path_parameters.h:65
DedupType
The context for which deduplication is being used.
Definition: materialize_path_parameters.h:106
@ NO_DEDUP
Definition: materialize_path_parameters.h:109
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:99
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:92
TABLE * table
Handle to table to materialize into.
Definition: materialize_path_parameters.h:62
int ref_slice
Definition: materialize_path_parameters.h:74
Query_expression * unit
The query expression we are materializing.
Definition: materialize_path_parameters.h:68
Mem_root_array< const AccessPath * > * invalidators
Definition: materialize_path_parameters.h:59
A position of table within a join order.
Definition: sql_select.h:355
A filter of some sort that is not a join condition (those are stored in JoinPredicate objects).
Definition: access_path.h:133
hypergraph::NodeMap total_eligibility_set
Definition: access_path.h:146
bool was_join_condition
Definition: access_path.h:159
Mem_root_array< int > functional_dependencies_idx
Definition: access_path.h:171
FunctionalDependencySet functional_dependencies
Definition: access_path.h:170
int source_multiple_equality_idx
Definition: access_path.h:167
hypergraph::NodeMap used_nodes
Definition: access_path.h:137
Item * condition
Definition: access_path.h:134
double selectivity
Definition: access_path.h:148
Mem_root_array< ContainedSubquery > contained_subqueries
Definition: access_path.h:176
Represents an expression tree in the relational algebra of joins.
Definition: relational_expression.h:147
tablesample_type
Definition: tablesample.h:27