diff options
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r-- | sql/sql_select.cc | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 4a500032f11..d59769b486c 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4744,12 +4744,25 @@ Item_func_ne::add_key_fields(JOIN *join, KEY_FIELD **key_fields, uint *and_level, table_map usable_tables, SARGABLE_PARAM **sargables) { - if (is_local_field(args[0]) && !(used_tables() & OUTER_REF_TABLE_BIT)) + if (!(used_tables() & OUTER_REF_TABLE_BIT)) { - Item **values= is_local_field(args[1]) ? args : args + 1; - add_key_equal_fields(join, key_fields, *and_level, this, - (Item_field*) (args[0]->real_item()), false, - values, 1, usable_tables, sargables); + /* + QQ: perhaps test for !is_local_field(args[1]) is not really needed here. + Other comparison functions, e.g. Item_func_le, Item_func_gt, etc, + do not have this test. See Item_bool_func2::add_key_field_optimize_op(). + Check with the optimizer team. + */ + if (is_local_field(args[0]) && !is_local_field(args[1])) + add_key_equal_fields(join, key_fields, *and_level, this, + (Item_field*) (args[0]->real_item()), false, + &args[1], 1, usable_tables, sargables); + /* + QQ: perhaps test for !is_local_field(args[0]) is not really needed here. + */ + if (is_local_field(args[1]) && !is_local_field(args[0])) + add_key_equal_fields(join, key_fields, *and_level, this, + (Item_field*) (args[1]->real_item()), false, + &args[0], 1, usable_tables, sargables); } } |