1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

between range optimization bug (between with const on one end only)

This commit is contained in:
serg@serg.mylan
2003-08-08 19:13:27 +02:00
parent f96d57d302
commit df8b7799cb
2 changed files with 9 additions and 6 deletions

View File

@@ -232,7 +232,7 @@ update t1 set y=x;
explain select * from t1, t1 t2 where t1.y = 2 and t2.x between 7 and t1.y+0; explain select * from t1, t1 t2 where t1.y = 2 and t2.x between 7 and t1.y+0;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 ref y y 5 const 1 Using where t1 ref y y 5 const 1 Using where
t2 ALL x NULL NULL NULL 9 Using where t2 range x x 5 NULL 4 Using where
explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= 7 and t2.x <= t1.y+0; explain select * from t1, t1 t2 where t1.y = 2 and t2.x >= 7 and t2.x <= t1.y+0;
table type possible_keys key key_len ref rows Extra table type possible_keys key key_len ref rows Extra
t1 ref y y 5 const 1 Using where t1 ref y y 5 const 1 Using where

View File

@@ -794,18 +794,15 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond)
DBUG_RETURN(new SEL_TREE(SEL_TREE::ALWAYS)); DBUG_RETURN(new SEL_TREE(SEL_TREE::ALWAYS));
DBUG_RETURN(new SEL_TREE(SEL_TREE::IMPOSSIBLE)); DBUG_RETURN(new SEL_TREE(SEL_TREE::IMPOSSIBLE));
} }
table_map ref_tables=cond->used_tables(); table_map ref_tables=cond->used_tables();
if (ref_tables & ~(param->prev_tables | param->read_tables |
param->current_table))
DBUG_RETURN(0); // Can't be calculated yet
if (cond->type() != Item::FUNC_ITEM) if (cond->type() != Item::FUNC_ITEM)
{ // Should be a field { // Should be a field
if (ref_tables & param->current_table) if (ref_tables & param->current_table)
DBUG_RETURN(0); DBUG_RETURN(0);
DBUG_RETURN(new SEL_TREE(SEL_TREE::MAYBE)); DBUG_RETURN(new SEL_TREE(SEL_TREE::MAYBE));
} }
if (!(ref_tables & param->current_table))
DBUG_RETURN(new SEL_TREE(SEL_TREE::MAYBE)); // This may be false or true
Item_func *cond_func= (Item_func*) cond; Item_func *cond_func= (Item_func*) cond;
if (cond_func->select_optimize() == Item_func::OPTIMIZE_NONE) if (cond_func->select_optimize() == Item_func::OPTIMIZE_NONE)
DBUG_RETURN(0); // Can't be calculated DBUG_RETURN(0); // Can't be calculated
@@ -847,6 +844,12 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond)
DBUG_RETURN(0); // Can't optimize this IN DBUG_RETURN(0); // Can't optimize this IN
} }
if (ref_tables & ~(param->prev_tables | param->read_tables |
param->current_table))
DBUG_RETURN(0); // Can't be calculated yet
if (!(ref_tables & param->current_table))
DBUG_RETURN(new SEL_TREE(SEL_TREE::MAYBE)); // This may be false or true
/* check field op const */ /* check field op const */
/* btw, ft_func's arguments()[0] isn't FIELD_ITEM. SerG*/ /* btw, ft_func's arguments()[0] isn't FIELD_ITEM. SerG*/
if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM) if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM)