diff --git a/mysql-test/r/index_merge.result b/mysql-test/r/index_merge.result index 5b0c2ffd7a2..63a0ebc4086 100644 --- a/mysql-test/r/index_merge.result +++ b/mysql-test/r/index_merge.result @@ -270,6 +270,11 @@ explain select * from t0,t1 where t0.key1 = 5 and id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t0 ref i1 i1 4 const 1 Using where 1 SIMPLE t1 index_merge i1,i8 i1,i8 4,4 NULL 2 Using where +explain select * from t0,t1 where t0.key1 < 3 and +(t1.key1 = t0.key1 or t1.key8 = t0.key1); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t0 range i1 i1 4 NULL 3 Using where +1 SIMPLE t1 ALL i1,i8 NULL NULL NULL 1024 Range checked for each record (index map: 0x81) explain select * from t1 where key1=3 or key2=4 union select * from t1 where key1<4 or key3=5; id select_type table type possible_keys key key_len ref rows Extra diff --git a/mysql-test/t/index_merge.test b/mysql-test/t/index_merge.test index 793ae848c52..79eda7c1f56 100644 --- a/mysql-test/t/index_merge.test +++ b/mysql-test/t/index_merge.test @@ -237,6 +237,10 @@ select * from t0,t1 where (t0.key1=t1.key1) and explain select * from t0,t1 where t0.key1 = 5 and (t1.key1 = t0.key1 or t1.key8 = t0.key1); +# Fix for bug#1974 +explain select * from t0,t1 where t0.key1 < 3 and + (t1.key1 = t0.key1 or t1.key8 = t0.key1); + # index_merge inside union explain select * from t1 where key1=3 or key2=4 union select * from t1 where key1<4 or key3=5; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index a2c29a1ff6f..0897340b5fa 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -1018,6 +1018,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use, List_iterator_fast it(tree->merges); while ((imerge= it++)) { + bool imerge_failed= false; double imerge_cost= 0; ha_rows imerge_total_records= 0; double tree_read_time; @@ -1036,21 +1037,23 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use, &tree_read_time, &tree_records, &(imerge->best_keys[ptree - imerge->trees]))) - goto imerge_fail; - + imerge_failed= true; imerge_cost += tree_read_time; imerge_total_records += tree_records; } - imerge_total_records= min(imerge_total_records, - head->file->records); - imerge_cost += imerge_total_records / TIME_FOR_COMPARE; - if (imerge_cost < min_imerge_cost) + + if (!imerge_failed) { - min_imerge= imerge; - min_imerge_cost= imerge_cost; - min_imerge_records= imerge_total_records; + imerge_total_records= min(imerge_total_records, + head->file->records); + imerge_cost += imerge_total_records / TIME_FOR_COMPARE; + if (imerge_cost < min_imerge_cost) + { + min_imerge= imerge; + min_imerge_cost= imerge_cost; + min_imerge_records= imerge_total_records; + } } -imerge_fail:; } if (!min_imerge)