MCPcopy Create free account
hub / github.com/MariaDB/server / add_key_part

Function add_key_part

sql/sql_select.cc:7433–7501  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

7431static LEX_CSTRING equal_str= { STRING_WITH_LEN("=") };
7432
7433static 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 /*

Callers 1

update_ref_and_keysFunction · 0.85

Calls 15

add_keyuseFunction · 0.85
get_hash_join_key_noFunction · 0.85
actual_n_key_partsMethod · 0.80
is_splittableMethod · 0.80
is_setMethod · 0.45
eqMethod · 0.45
compare_collationMethod · 0.45
compression_methodMethod · 0.45

Tested by

no test coverage detected