summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Petrunia <sergey@mariadb.com>2022-06-18 19:52:14 +0300
committerSergei Petrunia <sergey@mariadb.com>2022-06-18 19:52:14 +0300
commit95fe7010113fe2ce5b4c11c8db96b61eb49da295 (patch)
tree264589f40e52952ae042064c9bfa07fcd8c16fef
parent4a888d5b265b1e0e1e8b2a20c4b71220cdd825ea (diff)
downloadmariadb-git-bb-10.10-spetrunia.tar.gz
Cleanups for: 0762dd928 Improve pruning in greedy_search by sorting tables during searchbb-10.10-spetrunia
-rw-r--r--sql/sql_select.cc18
-rw-r--r--sql/sql_select.h8
2 files changed, 17 insertions, 9 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index b9d606eac1f..96c53b360a7 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -5441,13 +5441,19 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
}
}
+ /* Set JOIN_TAB::embedded_dependent for tables inside semi-joins */
{
for (JOIN_TAB *s= stat ; s < stat_end ; s++)
{
- TABLE_LIST *tl= s->table->pos_in_table_list;
- if (tl->embedding && tl->embedding->sj_subq_pred)
+ TABLE_LIST *emb= s->table->pos_in_table_list->embedding;
+ while (emb)
{
- s->embedded_dependent= tl->embedding->original_subq_pred_used_tables;
+ if (emb->sj_subq_pred)
+ {
+ s->embedded_dependent= emb->original_subq_pred_used_tables;
+ break;
+ }
+ emb= emb->embedding;
}
}
}
@@ -8366,7 +8372,7 @@ best_access_path(JOIN *join,
*/
if (s->key_start_dependent)
key_dependent= s->key_dependent;
- /* Add dependencey for sub queries */
+ /* Add dependency from semi-join subquery */
key_dependent|= s->embedded_dependent;
}
/* Check that s->key_dependent contains all used_tables found in s->keyuse */
@@ -9953,8 +9959,8 @@ check_if_edge_table(POSITION *pos,
struct SORT_POSITION
{
- JOIN_TAB **join_tab;
- POSITION *position;
+ JOIN_TAB **join_tab; /* Position of the JOIN_TAB in join->best_ref array */
+ POSITION *position; /* Pointer to how we read the table */
};
diff --git a/sql/sql_select.h b/sql/sql_select.h
index 46a359c746f..a6e4c752f9b 100644
--- a/sql/sql_select.h
+++ b/sql/sql_select.h
@@ -359,9 +359,11 @@ typedef struct st_join_table {
table_map dependent,key_dependent;
/*
- This is set for embedded sub queries. It contains the table map of
- the outer expression, like 'A' in the following expression:
- WHERE A in (SELECT ....)
+ This is non-zero for tables in semi-join nests. It contains bits
+ of tables that the subquery depends on.
+ For example, for
+ WHERE t1.col in (SELECT t10.col FROM t10 WHERE t10.col<t2.col)
+ t10->embedded_dependent= {t1, t2}
*/
table_map embedded_dependent;