summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_select.cc6
-rw-r--r--sql/sql_yacc.yy20
2 files changed, 21 insertions, 5 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 87ce26b24d5..e60688fe574 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2834,11 +2834,11 @@ add_key_fields(KEY_FIELD **key_fields,uint *and_level,
cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM &&
!(cond_func->arguments()[0]->used_tables() & OUTER_REF_TABLE_BIT))
values--;
+ DBUG_ASSERT(cond_func->functype() != Item_func::IN_FUNC ||
+ cond_func->argument_count() != 2);
add_key_equal_fields(key_fields, *and_level, cond_func,
(Item_field*) (cond_func->key_item()->real_item()),
- cond_func->argument_count() == 2 &&
- cond_func->functype() == Item_func::IN_FUNC,
- values,
+ 0, values,
cond_func->argument_count()-1,
usable_tables);
}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 2397540deae..756a8a6ee3d 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -4227,9 +4227,25 @@ bool_pri:
predicate:
bit_expr IN_SYM '(' expr_list ')'
- { $4->push_front($1); $$= new Item_func_in(*$4); }
+ {
+ if ($4->elements == 1)
+ $$= new Item_func_eq($1, $4->head());
+ else
+ {
+ $4->push_front($1);
+ $$= new Item_func_in(*$4);
+ }
+ }
| bit_expr not IN_SYM '(' expr_list ')'
- { $5->push_front($1); $$= negate_expression(YYTHD, new Item_func_in(*$5)); }
+ {
+ if ($5->elements == 1)
+ $$= new Item_func_ne($1, $5->head());
+ else
+ {
+ $5->push_front($1);
+ $$= negate_expression(YYTHD, new Item_func_in(*$5));
+ }
+ }
| bit_expr IN_SYM in_subselect
{ $$= new Item_in_subselect($1, $3); }
| bit_expr not IN_SYM in_subselect