| 7431 | static LEX_CSTRING equal_str= { STRING_WITH_LEN("=") }; |
| 7432 | |
| 7433 | static bool add_key_part(DYNAMIC_ARRAY *keyuse_array, KEY_FIELD *key_field) |
| 7434 | { |
| 7435 | Field *field=key_field->field; |
| 7436 | TABLE *form= field->table; |
| 7437 | THD *thd= form->in_use; |
| 7438 | |
| 7439 | if (key_field->eq_func && !(key_field->optimize & KEY_OPTIMIZE_EXISTS)) |
| 7440 | { |
| 7441 | for (uint key=0 ; key < form->s->keys ; key++) |
| 7442 | { |
| 7443 | if (!(form->keys_in_use_for_query.is_set(key))) |
| 7444 | continue; |
| 7445 | if (form->key_info[key].algorithm == HA_KEY_ALG_FULLTEXT || |
| 7446 | form->key_info[key].algorithm == HA_KEY_ALG_RTREE || |
| 7447 | form->key_info[key].algorithm == HA_KEY_ALG_VECTOR || |
| 7448 | form->key_info[key].flags & HA_UNIQUE_HASH) |
| 7449 | continue; |
| 7450 | |
| 7451 | KEY *keyinfo= form->key_info+key; |
| 7452 | uint key_parts= form->actual_n_key_parts(keyinfo); |
| 7453 | for (uint part=0 ; part < key_parts ; part++) |
| 7454 | { |
| 7455 | if (field->eq(form->key_info[key].key_part[part].field)) |
| 7456 | { |
| 7457 | Data_type_compatibility compat= |
| 7458 | field->can_optimize_keypart_ref(key_field->cond, key_field->val); |
| 7459 | if (compat == Data_type_compatibility::OK) |
| 7460 | { |
| 7461 | if (add_keyuse(keyuse_array, key_field, key, part)) |
| 7462 | return TRUE; |
| 7463 | } |
| 7464 | else if (thd->give_notes_for_unusable_keys()) |
| 7465 | { |
| 7466 | field->raise_note_cannot_use_key_part(thd, key, part, |
| 7467 | equal_str, |
| 7468 | key_field->cond->compare_collation(), |
| 7469 | key_field->val, |
| 7470 | compat); |
| 7471 | } |
| 7472 | } |
| 7473 | } |
| 7474 | } |
| 7475 | /* |
| 7476 | Compressed field cannot be part of a key. For optimizer temporary table |
| 7477 | compressed fields are replaced by uncompressed, see |
| 7478 | is_optimizer_tmp_table() and Field_*_compressed::make_new_field(). |
| 7479 | */ |
| 7480 | if (!field->compression_method() && |
| 7481 | field->hash_join_is_possible() && |
| 7482 | (key_field->optimize & KEY_OPTIMIZE_EQ) && |
| 7483 | key_field->val->used_tables()) |
| 7484 | { |
| 7485 | if (field->can_optimize_hash_join(key_field->cond, key_field->val) != |
| 7486 | Data_type_compatibility::OK) |
| 7487 | return false; |
| 7488 | if (form->is_splittable()) |
| 7489 | form->add_splitting_info_for_key_field(key_field); |
| 7490 | /* |
no test coverage detected