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

Function add_key_field

sql/sql_select.cc:6789–6937  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6787*/
6788
6789static void
6790add_key_field(JOIN *join,
6791 KEY_FIELD **key_fields,uint and_level, Item_bool_func *cond,
6792 Field *field, bool eq_func, Item **value, uint num_values,
6793 table_map usable_tables, SARGABLE_PARAM **sargables,
6794 uint row_col_no= 0)
6795{
6796 uint optimize= 0;
6797 if (eq_func &&
6798 ((join->is_allowed_hash_join_access(field->table) &&
6799 field->hash_join_is_possible() &&
6800 !(field->table->pos_in_table_list->is_materialized_derived() &&
6801 field->table->is_created())) ||
6802 (field->table->pos_in_table_list->is_materialized_derived() &&
6803 !field->table->is_created() && !(field->flags & BLOB_FLAG))))
6804 {
6805 optimize= KEY_OPTIMIZE_EQ;
6806 }
6807 else if (!(field->flags & PART_KEY_FLAG))
6808 {
6809 // Don't remove column IS NULL on a LEFT JOIN table
6810 if (eq_func && (*value)->type() == Item::NULL_ITEM &&
6811 field->table->maybe_null && !field->null_ptr)
6812 {
6813 optimize= KEY_OPTIMIZE_EXISTS;
6814 DBUG_ASSERT(num_values == 1);
6815 }
6816 }
6817 if (optimize != KEY_OPTIMIZE_EXISTS)
6818 {
6819 table_map used_tables=0;
6820 bool optimizable=0;
6821 for (uint i=0; i<num_values; i++)
6822 {
6823 Item *curr_val;
6824 if (row_col_no && value[i]->real_item()->type() == Item::ROW_ITEM)
6825 {
6826 Item_row *value_tuple= (Item_row *) (value[i]->real_item());
6827 curr_val= value_tuple->element_index(row_col_no - 1);
6828 }
6829 else
6830 curr_val= value[i];
6831 table_map value_used_tables= curr_val->used_tables();
6832 used_tables|= value_used_tables;
6833 if (!(value_used_tables & (field->table->map | RAND_TABLE_BIT)))
6834 optimizable=1;
6835 }
6836 if (!optimizable)
6837 return;
6838 if (!(usable_tables & field->table->map))
6839 {
6840 if (!eq_func || (*value)->type() != Item::NULL_ITEM ||
6841 !field->table->maybe_null || field->null_ptr)
6842 return; // Can't use left join optimize
6843 optimize= KEY_OPTIMIZE_EXISTS;
6844 }
6845 else
6846 {

Callers 2

add_key_equal_fieldsFunction · 0.85
add_key_fieldsMethod · 0.85

Calls 15

bitmap_set_bitFunction · 0.85
get_possible_keysMethod · 0.80
intersectMethod · 0.80
real_maybe_nullMethod · 0.80
hash_join_is_possibleMethod · 0.45
is_createdMethod · 0.45
typeMethod · 0.45
real_itemMethod · 0.45
element_indexMethod · 0.45

Tested by

no test coverage detected