summaryrefslogtreecommitdiff
path: root/sql/sql_select.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_select.cc')
-rw-r--r--sql/sql_select.cc23
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);
}
}