Skip to content

Commit 4be0bfa

Browse files
committed
Simplified code in generate_derived_keys() and when using pos_in_tables
Added comments that not used keys of derivied tables will be deleted. Added some comments about checking if pos_in_table_list is 0. Other things: - Added a marker (DBTYPE_IN_PREDICATE) in TABLE_LIST->derived_type to indicate that the table was generated from IN (list). This is useful for debugging and can later be used by explain if needed. - Removed a not needed test of table->pos_in_table_list as it should always be valid at this point in time.
1 parent 9a4110a commit 4be0bfa

File tree

4 files changed

+41
-18
lines changed

4 files changed

+41
-18
lines changed

sql/sql_select.cc

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4266,7 +4266,6 @@ JOIN::add_sorting_to_table(JOIN_TAB *tab, ORDER *order)
42664266

42674267
TABLE *table= tab->table;
42684268
if ((tab == join_tab + const_tables) &&
4269-
table->pos_in_table_list &&
42704269
table->pos_in_table_list->is_sjm_scan_table())
42714270
{
42724271
tab->filesort->set_all_read_bits= TRUE;
@@ -7391,6 +7390,10 @@ static void remember_if_eq_ref_key(JOIN *join, KEYUSE *use)
73917390
Special treatment for ft-keys.
73927391
Update join->eq_ref_tables with a bitmap of all tables that can possible
73937392
have a EQ_REF key.
7393+
7394+
Note that the keys are generated to be used by best_access_path() during
7395+
the optimization stage. Unused keys will later be deleted by
7396+
JOIN::drop_unused_derived_keys().
73947397
*/
73957398

73967399
bool sort_and_filter_keyuse(JOIN *join, DYNAMIC_ARRAY *keyuse,
@@ -7440,7 +7443,9 @@ bool sort_and_filter_keyuse(JOIN *join, DYNAMIC_ARRAY *keyuse,
74407443
}
74417444
else
74427445
{
7443-
/* Key changed, check if previous key was a primary/unique key lookup */
7446+
/*
7447+
Key changed, check if previous key was a primary/unique key lookup
7448+
*/
74447449
if (prev != &key_end && !found_unprefixed_key_part)
74457450
remember_if_eq_ref_key(join, prev);
74467451
found_unprefixed_key_part= 0;
@@ -13794,36 +13799,45 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys)
1379413799
static
1379513800
bool generate_derived_keys(DYNAMIC_ARRAY *keyuse_array)
1379613801
{
13797-
KEYUSE *keyuse= dynamic_element(keyuse_array, 0, KEYUSE*);
13802+
KEYUSE *keyuse, *end_keyuse;
1379813803
size_t elements= keyuse_array->elements;
1379913804
TABLE *prev_table= 0;
13800-
for (size_t i= 0; i < elements; i++, keyuse++)
13805+
13806+
DBUG_ASSERT(elements > 0);
13807+
/* The last element is an end marker */
13808+
DBUG_ASSERT(dynamic_element(keyuse_array, elements-1,
13809+
KEYUSE*)[0].table == 0);
13810+
13811+
for (keyuse= dynamic_element(keyuse_array, 0, KEYUSE*),
13812+
end_keyuse= keyuse + elements - 1;
13813+
keyuse < end_keyuse;
13814+
keyuse++)
1380113815
{
13802-
if (!keyuse->table)
13803-
break;
13816+
DBUG_ASSERT(keyuse->table);
13817+
1380413818
KEYUSE *first_table_keyuse= NULL;
1380513819
table_map last_used_tables= 0;
1380613820
uint count= 0;
1380713821
uint keys= 0;
1380813822
TABLE_LIST *derived= NULL;
13823+
1380913824
if (keyuse->table != prev_table)
1381013825
derived= keyuse->table->pos_in_table_list;
13811-
while (derived && derived->is_materialized_derived())
13826+
13827+
if (!derived->is_materialized_derived())
13828+
continue;
13829+
13830+
for (;;)
1381213831
{
1381313832
if (keyuse->table != prev_table)
1381413833
{
1381513834
prev_table= keyuse->table;
1381613835
while (keyuse->table == prev_table && keyuse->key != MAX_KEY)
13817-
{
1381813836
keyuse++;
13819-
i++;
13820-
}
1382113837
if (keyuse->table != prev_table)
1382213838
{
1382313839
keyuse--;
13824-
i--;
13825-
derived= NULL;
13826-
continue;
13840+
break;
1382713841
}
1382813842
first_table_keyuse= keyuse;
1382913843
last_used_tables= keyuse->used_tables;
@@ -13837,14 +13851,12 @@ bool generate_derived_keys(DYNAMIC_ARRAY *keyuse_array)
1383713851
}
1383813852
count++;
1383913853
keyuse++;
13840-
i++;
1384113854
if (keyuse->table != prev_table)
1384213855
{
1384313856
if (generate_derived_keys_for_table(first_table_keyuse, count, ++keys))
1384413857
return TRUE;
1384513858
keyuse--;
13846-
i--;
13847-
derived= NULL;
13859+
break;
1384813860
}
1384913861
}
1385013862
}

sql/sql_show.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8899,6 +8899,10 @@ bool optimize_schema_tables_reads(JOIN *join)
88998899
tab;
89008900
tab= next_linear_tab(join, tab, WITH_BUSH_ROOTS))
89018901
{
8902+
/*
8903+
The following is true for the temporary table that will hold the
8904+
final result.
8905+
*/
89028906
if (!tab->table || !tab->table->pos_in_table_list)
89038907
continue;
89048908

@@ -8970,6 +8974,10 @@ bool get_schema_tables_result(JOIN *join,
89708974
tab;
89718975
tab= next_linear_tab(join, tab, WITH_BUSH_ROOTS))
89728976
{
8977+
/*
8978+
The following is true for the temporary table that will hold the
8979+
final result.
8980+
*/
89738981
if (!tab->table || !tab->table->pos_in_table_list)
89748982
break;
89758983

sql/sql_tvc.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1047,7 +1047,9 @@ Item *Item_func_in::in_predicate_to_in_subs_transformer(THD *thd,
10471047
sq_select->add_where_field(derived_unit->first_select());
10481048
sq_select->context.table_list= sq_select->table_list.first;
10491049
sq_select->context.first_name_resolution_table= sq_select->table_list.first;
1050-
sq_select->table_list.first->derived_type= DTYPE_TABLE | DTYPE_MATERIALIZE;
1050+
sq_select->table_list.first->derived_type= (DTYPE_TABLE |
1051+
DTYPE_MATERIALIZE |
1052+
DTYPE_IN_PREDICATE);
10511053
lex->derived_tables|= DERIVED_SUBQUERY;
10521054

10531055
sq_select->where= 0;

sql/table.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1993,7 +1993,8 @@ class IS_table_read_plan;
19931993
#define DTYPE_MERGE 4U
19941994
#define DTYPE_MATERIALIZE 8U
19951995
#define DTYPE_MULTITABLE 16U
1996-
#define DTYPE_MASK (DTYPE_VIEW|DTYPE_TABLE|DTYPE_MULTITABLE)
1996+
#define DTYPE_IN_PREDICATE 32U
1997+
#define DTYPE_MASK (DTYPE_VIEW|DTYPE_TABLE|DTYPE_MULTITABLE|DTYPE_IN_PREDICATE)
19971998

19981999
/*
19992000
Phases of derived tables/views handling, see sql_derived.cc

0 commit comments

Comments
 (0)