From b2c83e7f033088a9bc1a0058c57a093396ab3eba Mon Sep 17 00:00:00 2001 From: "serg@serg.mylan" <> Date: Mon, 1 Sep 2003 14:18:27 +0200 Subject: [PATCH] workaround for IN's special treatment of first argument. Not for 4.1 --- mysql-test/r/range.result | 6 ++++++ mysql-test/t/range.test | 3 +++ sql/sql_select.cc | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/mysql-test/r/range.result b/mysql-test/r/range.result index 5da6f6c30e1..a02da87b0e9 100644 --- a/mysql-test/r/range.result +++ b/mysql-test/r/range.result @@ -253,4 +253,10 @@ explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= 0 and t2.x <= t1.y; table type possible_keys key key_len ref rows Extra t1 ref y y 5 const 1 Using where t2 range x x 5 NULL 2 Using where +explain select count(*) from t1 where x in (1); +table type possible_keys key key_len ref rows Extra +t1 range x x 5 NULL 1 Using where; Using index +explain select count(*) from t1 where x in (1,2); +table type possible_keys key key_len ref rows Extra +t1 range x x 5 NULL 2 Using where; Using index drop table t1; diff --git a/mysql-test/t/range.test b/mysql-test/t/range.test index 521709eddee..3e749682475 100644 --- a/mysql-test/t/range.test +++ b/mysql-test/t/range.test @@ -198,5 +198,8 @@ explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= t1.y-1 and t2.x <= t1 # equation propagation explain select * from t1, t1 t2 where t1.y = 2 and t2.x between 0 and t1.y; explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= 0 and t2.x <= t1.y; +# testing IN +explain select count(*) from t1 where x in (1); +explain select count(*) from t1 where x in (1,2); drop table t1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index d48e809966c..153b083b3ef 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1556,7 +1556,13 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, if (cond_func->key_item()->type() == Item::FIELD_ITEM) add_key_field(key_fields,*and_level, ((Item_field*) (cond_func->key_item()))->field, 0, +#ifndef TO_BE_REMOVED_IN_4_1 + /* special treatment for IN. Not necessary in 4.1 */ + cond_func->arguments() + (cond_func->functype() != Item_func::IN_FUNC), + cond_func->argument_count() - (cond_func->functype() != Item_func::IN_FUNC), +#else cond_func->arguments()+1, cond_func->argument_count()-1, +#endif usable_tables); break; case Item_func::OPTIMIZE_OP: