| 13552 | */ |
| 13553 | |
| 13554 | static bool create_hj_key_for_table(JOIN *join, JOIN_TAB *join_tab, |
| 13555 | KEYUSE *org_keyuse, table_map used_tables) |
| 13556 | { |
| 13557 | KEY *keyinfo; |
| 13558 | KEY_PART_INFO *key_part_info; |
| 13559 | KEYUSE *keyuse= org_keyuse; |
| 13560 | uint key_parts= 0; |
| 13561 | THD *thd= join->thd; |
| 13562 | TABLE *table= join_tab->table; |
| 13563 | bool first_keyuse= TRUE; |
| 13564 | DBUG_ENTER("create_hj_key_for_table"); |
| 13565 | |
| 13566 | do |
| 13567 | { |
| 13568 | if (!(~used_tables & keyuse->used_tables) && |
| 13569 | join_tab->keyuse_is_valid_for_access_in_chosen_plan(join, keyuse) && |
| 13570 | are_tables_local(join_tab, keyuse->used_tables)) |
| 13571 | { |
| 13572 | if (first_keyuse) |
| 13573 | { |
| 13574 | key_parts++; |
| 13575 | } |
| 13576 | else |
| 13577 | { |
| 13578 | KEYUSE *curr= org_keyuse; |
| 13579 | for( ; curr < keyuse; curr++) |
| 13580 | { |
| 13581 | if (curr->keypart == keyuse->keypart && |
| 13582 | !(~used_tables & curr->used_tables) && |
| 13583 | join_tab->keyuse_is_valid_for_access_in_chosen_plan(join, |
| 13584 | curr) && |
| 13585 | are_tables_local(join_tab, curr->used_tables)) |
| 13586 | break; |
| 13587 | } |
| 13588 | if (curr == keyuse) |
| 13589 | key_parts++; |
| 13590 | } |
| 13591 | } |
| 13592 | first_keyuse= FALSE; |
| 13593 | keyuse++; |
| 13594 | } while (keyuse->table == table && keyuse->is_for_hash_join()); |
| 13595 | if (!key_parts) |
| 13596 | DBUG_RETURN(TRUE); |
| 13597 | /* This memory is allocated only once for the joined table join_tab */ |
| 13598 | if (!(keyinfo= thd->alloc<KEY>(1)) || |
| 13599 | !(key_part_info = thd->alloc<KEY_PART_INFO>(key_parts))) |
| 13600 | DBUG_RETURN(TRUE); |
| 13601 | keyinfo->usable_key_parts= keyinfo->user_defined_key_parts = key_parts; |
| 13602 | keyinfo->ext_key_parts= keyinfo->user_defined_key_parts; |
| 13603 | keyinfo->key_part= key_part_info; |
| 13604 | keyinfo->key_length=0; |
| 13605 | keyinfo->algorithm= HA_KEY_ALG_UNDEF; |
| 13606 | keyinfo->flags= HA_GENERATED_KEY; |
| 13607 | keyinfo->is_statistics_from_stat_tables= FALSE; |
| 13608 | keyinfo->all_nulls_key_parts= 0; |
| 13609 | keyinfo->stat_storage_length= 0; |
| 13610 | keyinfo->name.str= "$hj"; |
| 13611 | keyinfo->name.length= 3; |
no test coverage detected