summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sergefp@mysql.com>2005-09-23 13:43:20 +0400
committerunknown <sergefp@mysql.com>2005-09-23 13:43:20 +0400
commit32de973588d71d4cb7a6decf7a83c0554de2a9a1 (patch)
tree2e801cb6f35588dff5e51605eaa727f593755774
parent727f0b8a1f2fdc3f458f6b5da5ebe3cc73620403 (diff)
downloadmariadb-git-32de973588d71d4cb7a6decf7a83c0554de2a9a1.tar.gz
Fix for BUG#13419: In "ref" optimizer, take into account that item=Item_func_in(x,y) is
not equivalent to "x=y" when item->negated == TRUE. mysql-test/r/func_in.result: Testcase for BUG#13419 mysql-test/t/func_in.test: Testcase for BUG#13419 sql/sql_select.cc: Fix for BUG#13419: * Take into account that item=Item_func_in(x,y) is not equivalent to "x=y" when item->negated == TRUE. * Removed comment that is no longer true.
-rw-r--r--mysql-test/r/func_in.result9
-rw-r--r--mysql-test/t/func_in.test7
-rw-r--r--sql/sql_select.cc4
3 files changed, 18 insertions, 2 deletions
diff --git a/mysql-test/r/func_in.result b/mysql-test/r/func_in.result
index 516d0a28a21..3cf2afc83d1 100644
--- a/mysql-test/r/func_in.result
+++ b/mysql-test/r/func_in.result
@@ -193,3 +193,12 @@ select * from t1 where a in (NULL, 'aa');
a
aa
drop table t1;
+create table t1 (id int, key(id));
+insert into t1 values (1),(2),(3);
+select count(*) from t1 where id not in (1);
+count(*)
+2
+select count(*) from t1 where id not in (1,2);
+count(*)
+1
+drop table t1;
diff --git a/mysql-test/t/func_in.test b/mysql-test/t/func_in.test
index aec2de7a467..2ffe5a2d5f7 100644
--- a/mysql-test/t/func_in.test
+++ b/mysql-test/t/func_in.test
@@ -102,4 +102,11 @@ insert into t1 values ('aa'), ('bb');
select * from t1 where a in (NULL, 'aa');
drop table t1;
+# BUG#13419
+create table t1 (id int, key(id));
+insert into t1 values (1),(2),(3);
+select count(*) from t1 where id not in (1);
+select count(*) from t1 where id not in (1,2);
+drop table t1;
+
# End of 4.1 tests
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 59b82b53b32..0d9cab6a36b 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2140,7 +2140,6 @@ merge_key_fields(KEY_FIELD *start,KEY_FIELD *new_fields,KEY_FIELD *end,
field Field used in comparision
eq_func True if we used =, <=> or IS NULL
value Value used for comparison with field
- Is NULL for BETWEEN and IN
usable_tables Tables which can be used for key optimization
NOTES
@@ -2325,7 +2324,8 @@ add_key_fields(KEY_FIELD **key_fields,uint *and_level,
add_key_field(key_fields,*and_level,cond_func,
((Item_field*)(cond_func->key_item()->real_item()))->field,
cond_func->argument_count() == 2 &&
- cond_func->functype() == Item_func::IN_FUNC,
+ cond_func->functype() == Item_func::IN_FUNC &&
+ !((Item_func_in*)cond_func)->negated,
cond_func->arguments()+1, cond_func->argument_count()-1,
usable_tables);
break;