mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fix for BUG#13317: Make range optimizer able to produce ranges for "view.field IN (c1,c2)"
and "view.field BETWEEN c1 AND c2"
This commit is contained in:
@ -768,3 +768,22 @@ SELECT * FROM t1;
|
|||||||
a
|
a
|
||||||
2
|
2
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
create table t1 (a int, b int, primary key(a,b));
|
||||||
|
create view v1 as select a, b from t1;
|
||||||
|
INSERT INTO `t1` VALUES
|
||||||
|
(0,0),(1,0),(2,0),(3,0),(4,0),(5,1),(6,1),(7,1),(8,1),(9,1),(10,2),(11,2),(12,2)
|
||||||
|
,(13,2),(14,2),(15,3),(16,3),(17,3),(18,3),(19,3);
|
||||||
|
explain select * from t1 where a in (3,4) and b in (1,2,3);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 range PRIMARY PRIMARY 8 NULL # Using where; Using index
|
||||||
|
explain select * from v1 where a in (3,4) and b in (1,2,3);
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 range PRIMARY PRIMARY 8 NULL # Using where; Using index
|
||||||
|
explain select * from t1 where a between 3 and 4 and b between 1 and 2;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 range PRIMARY PRIMARY 8 NULL # Using where; Using index
|
||||||
|
explain select * from v1 where a between 3 and 4 and b between 1 and 2;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 range PRIMARY PRIMARY 8 NULL # Using where; Using index
|
||||||
|
drop view v1;
|
||||||
|
drop table t1;
|
||||||
|
@ -578,3 +578,25 @@ DELETE FROM t1 WHERE NOT(a <=> 2);
|
|||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#13317: range optimization doesn't work for IN over VIEW.
|
||||||
|
#
|
||||||
|
create table t1 (a int, b int, primary key(a,b));
|
||||||
|
create view v1 as select a, b from t1;
|
||||||
|
|
||||||
|
INSERT INTO `t1` VALUES
|
||||||
|
(0,0),(1,0),(2,0),(3,0),(4,0),(5,1),(6,1),(7,1),(8,1),(9,1),(10,2),(11,2),(12,2)
|
||||||
|
,(13,2),(14,2),(15,3),(16,3),(17,3),(18,3),(19,3);
|
||||||
|
|
||||||
|
--replace_column 9 #
|
||||||
|
explain select * from t1 where a in (3,4) and b in (1,2,3);
|
||||||
|
--replace_column 9 #
|
||||||
|
explain select * from v1 where a in (3,4) and b in (1,2,3);
|
||||||
|
--replace_column 9 #
|
||||||
|
explain select * from t1 where a between 3 and 4 and b between 1 and 2;
|
||||||
|
--replace_column 9 #
|
||||||
|
explain select * from v1 where a between 3 and 4 and b between 1 and 2;
|
||||||
|
|
||||||
|
drop view v1;
|
||||||
|
drop table t1;
|
||||||
|
@ -3533,17 +3533,17 @@ static SEL_TREE *get_mm_tree(PARAM *param,COND *cond)
|
|||||||
|
|
||||||
switch (cond_func->functype()) {
|
switch (cond_func->functype()) {
|
||||||
case Item_func::BETWEEN:
|
case Item_func::BETWEEN:
|
||||||
if (cond_func->arguments()[0]->type() != Item::FIELD_ITEM)
|
if (cond_func->arguments()[0]->real_item()->type() != Item::FIELD_ITEM)
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
field_item= (Item_field*) (cond_func->arguments()[0]);
|
field_item= (Item_field*) (cond_func->arguments()[0]->real_item());
|
||||||
value= NULL;
|
value= NULL;
|
||||||
break;
|
break;
|
||||||
case Item_func::IN_FUNC:
|
case Item_func::IN_FUNC:
|
||||||
{
|
{
|
||||||
Item_func_in *func=(Item_func_in*) cond_func;
|
Item_func_in *func=(Item_func_in*) cond_func;
|
||||||
if (func->key_item()->type() != Item::FIELD_ITEM)
|
if (func->key_item()->real_item()->type() != Item::FIELD_ITEM)
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
field_item= (Item_field*) (func->key_item());
|
field_item= (Item_field*) (func->key_item()->real_item());
|
||||||
value= NULL;
|
value= NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user