Commit ae159473 authored by sergefp@mysql.com's avatar sergefp@mysql.com

Fix for bug 1974

parent d8603604
...@@ -270,6 +270,11 @@ explain select * from t0,t1 where t0.key1 = 5 and ...@@ -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 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 t0 ref i1 i1 4 const 1 Using where
1 SIMPLE t1 index_merge i1,i8 i1,i8 4,4 NULL 2 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 explain select * from t1 where key1=3 or key2=4
union select * from t1 where key1<4 or key3=5; union select * from t1 where key1<4 or key3=5;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
......
...@@ -237,6 +237,10 @@ select * from t0,t1 where (t0.key1=t1.key1) and ...@@ -237,6 +237,10 @@ select * from t0,t1 where (t0.key1=t1.key1) and
explain select * from t0,t1 where t0.key1 = 5 and explain select * from t0,t1 where t0.key1 = 5 and
(t1.key1 = t0.key1 or t1.key8 = t0.key1); (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 # index_merge inside union
explain select * from t1 where key1=3 or key2=4 explain select * from t1 where key1=3 or key2=4
union select * from t1 where key1<4 or key3=5; union select * from t1 where key1<4 or key3=5;
......
...@@ -1018,6 +1018,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use, ...@@ -1018,6 +1018,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
List_iterator_fast<SEL_IMERGE> it(tree->merges); List_iterator_fast<SEL_IMERGE> it(tree->merges);
while ((imerge= it++)) while ((imerge= it++))
{ {
bool imerge_failed= false;
double imerge_cost= 0; double imerge_cost= 0;
ha_rows imerge_total_records= 0; ha_rows imerge_total_records= 0;
double tree_read_time; double tree_read_time;
...@@ -1036,21 +1037,23 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use, ...@@ -1036,21 +1037,23 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
&tree_read_time, &tree_records, &tree_read_time, &tree_records,
&(imerge->best_keys[ptree - &(imerge->best_keys[ptree -
imerge->trees]))) imerge->trees])))
goto imerge_fail; imerge_failed= true;
imerge_cost += tree_read_time; imerge_cost += tree_read_time;
imerge_total_records += tree_records; imerge_total_records += tree_records;
} }
imerge_total_records= min(imerge_total_records,
head->file->records); if (!imerge_failed)
imerge_cost += imerge_total_records / TIME_FOR_COMPARE;
if (imerge_cost < min_imerge_cost)
{ {
min_imerge= imerge; imerge_total_records= min(imerge_total_records,
min_imerge_cost= imerge_cost; head->file->records);
min_imerge_records= imerge_total_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) if (!min_imerge)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment