| 6787 | */ |
| 6788 | |
| 6789 | static void |
| 6790 | add_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 | { |
no test coverage detected