@@ -4266,7 +4266,6 @@ JOIN::add_sorting_to_table(JOIN_TAB *tab, ORDER *order)
4266
4266
4267
4267
TABLE *table= tab->table;
4268
4268
if ((tab == join_tab + const_tables) &&
4269
- table->pos_in_table_list &&
4270
4269
table->pos_in_table_list->is_sjm_scan_table())
4271
4270
{
4272
4271
tab->filesort->set_all_read_bits= TRUE;
@@ -7391,6 +7390,10 @@ static void remember_if_eq_ref_key(JOIN *join, KEYUSE *use)
7391
7390
Special treatment for ft-keys.
7392
7391
Update join->eq_ref_tables with a bitmap of all tables that can possible
7393
7392
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().
7394
7397
*/
7395
7398
7396
7399
bool sort_and_filter_keyuse(JOIN *join, DYNAMIC_ARRAY *keyuse,
@@ -7440,7 +7443,9 @@ bool sort_and_filter_keyuse(JOIN *join, DYNAMIC_ARRAY *keyuse,
7440
7443
}
7441
7444
else
7442
7445
{
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
+ */
7444
7449
if (prev != &key_end && !found_unprefixed_key_part)
7445
7450
remember_if_eq_ref_key(join, prev);
7446
7451
found_unprefixed_key_part= 0;
@@ -13794,36 +13799,45 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys)
13794
13799
static
13795
13800
bool generate_derived_keys(DYNAMIC_ARRAY *keyuse_array)
13796
13801
{
13797
- KEYUSE *keyuse= dynamic_element(keyuse_array, 0, KEYUSE*) ;
13802
+ KEYUSE *keyuse, *end_keyuse ;
13798
13803
size_t elements= keyuse_array->elements;
13799
13804
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++)
13801
13815
{
13802
- if (! keyuse->table)
13803
- break;
13816
+ DBUG_ASSERT( keyuse->table);
13817
+
13804
13818
KEYUSE *first_table_keyuse= NULL;
13805
13819
table_map last_used_tables= 0;
13806
13820
uint count= 0;
13807
13821
uint keys= 0;
13808
13822
TABLE_LIST *derived= NULL;
13823
+
13809
13824
if (keyuse->table != prev_table)
13810
13825
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 (;;)
13812
13831
{
13813
13832
if (keyuse->table != prev_table)
13814
13833
{
13815
13834
prev_table= keyuse->table;
13816
13835
while (keyuse->table == prev_table && keyuse->key != MAX_KEY)
13817
- {
13818
13836
keyuse++;
13819
- i++;
13820
- }
13821
13837
if (keyuse->table != prev_table)
13822
13838
{
13823
13839
keyuse--;
13824
- i--;
13825
- derived= NULL;
13826
- continue;
13840
+ break;
13827
13841
}
13828
13842
first_table_keyuse= keyuse;
13829
13843
last_used_tables= keyuse->used_tables;
@@ -13837,14 +13851,12 @@ bool generate_derived_keys(DYNAMIC_ARRAY *keyuse_array)
13837
13851
}
13838
13852
count++;
13839
13853
keyuse++;
13840
- i++;
13841
13854
if (keyuse->table != prev_table)
13842
13855
{
13843
13856
if (generate_derived_keys_for_table(first_table_keyuse, count, ++keys))
13844
13857
return TRUE;
13845
13858
keyuse--;
13846
- i--;
13847
- derived= NULL;
13859
+ break;
13848
13860
}
13849
13861
}
13850
13862
}
0 commit comments