mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Bug #21180: Subselect with index for both WHERE and ORDER BY produces empty result
Reseting subqueries with "quick" access methods was incomplete. Partially backported the correct reseting of QUICK_SELECTs from 5.x.
This commit is contained in:
@ -2895,3 +2895,32 @@ select * from t1 where NOT(s1 = ALL (select s1/s1 from t1));
|
|||||||
s1
|
s1
|
||||||
2
|
2
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1(a int, primary key (a));
|
||||||
|
insert into t1 values (10);
|
||||||
|
create table t2 (a int primary key, b varchar(32), c int, unique key b(c, b));
|
||||||
|
insert into t2(a, c, b) values (1,10,'359'), (2,10,'35988'), (3,10,'35989');
|
||||||
|
explain SELECT sql_no_cache t1.a, r.a, r.b FROM t1 LEFT JOIN t2 r
|
||||||
|
ON r.a = (SELECT t2.a FROM t2 WHERE t2.c = t1.a AND t2.b <= '359899'
|
||||||
|
ORDER BY t2.c DESC, t2.b DESC LIMIT 1) WHERE t1.a = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 system PRIMARY NULL NULL NULL 1
|
||||||
|
1 PRIMARY r const PRIMARY PRIMARY 4 const 1
|
||||||
|
2 DEPENDENT SUBQUERY t2 range b b 38 NULL 2 Using where
|
||||||
|
SELECT sql_no_cache t1.a, r.a, r.b FROM t1 LEFT JOIN t2 r
|
||||||
|
ON r.a = (SELECT t2.a FROM t2 WHERE t2.c = t1.a AND t2.b <= '359899'
|
||||||
|
ORDER BY t2.c DESC, t2.b DESC LIMIT 1) WHERE t1.a = 10;
|
||||||
|
a a b
|
||||||
|
10 3 35989
|
||||||
|
explain SELECT sql_no_cache t1.a, r.a, r.b FROM t1 LEFT JOIN t2 r
|
||||||
|
ON r.a = (SELECT t2.a FROM t2 WHERE t2.c = t1.a AND t2.b <= '359899'
|
||||||
|
ORDER BY t2.c, t2.b LIMIT 1) WHERE t1.a = 10;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1 system PRIMARY NULL NULL NULL 1
|
||||||
|
1 PRIMARY r const PRIMARY PRIMARY 4 const 1
|
||||||
|
2 DEPENDENT SUBQUERY t2 range b b 38 NULL 2 Using where
|
||||||
|
SELECT sql_no_cache t1.a, r.a, r.b FROM t1 LEFT JOIN t2 r
|
||||||
|
ON r.a = (SELECT t2.a FROM t2 WHERE t2.c = t1.a AND t2.b <= '359899'
|
||||||
|
ORDER BY t2.c, t2.b LIMIT 1) WHERE t1.a = 10;
|
||||||
|
a a b
|
||||||
|
10 1 359
|
||||||
|
drop table t1,t2;
|
||||||
|
@ -1861,4 +1861,30 @@ select * from t1 where NOT(s1+1 = ANY (select s1 from t1));
|
|||||||
select * from t1 where (s1 = ALL (select s1/s1 from t1));
|
select * from t1 where (s1 = ALL (select s1/s1 from t1));
|
||||||
select * from t1 where NOT(s1 = ALL (select s1/s1 from t1));
|
select * from t1 where NOT(s1 = ALL (select s1/s1 from t1));
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #21180: Subselect with index for both WHERE and ORDER BY
|
||||||
|
# produces empty result
|
||||||
|
#
|
||||||
|
create table t1(a int, primary key (a));
|
||||||
|
insert into t1 values (10);
|
||||||
|
|
||||||
|
create table t2 (a int primary key, b varchar(32), c int, unique key b(c, b));
|
||||||
|
insert into t2(a, c, b) values (1,10,'359'), (2,10,'35988'), (3,10,'35989');
|
||||||
|
|
||||||
|
explain SELECT sql_no_cache t1.a, r.a, r.b FROM t1 LEFT JOIN t2 r
|
||||||
|
ON r.a = (SELECT t2.a FROM t2 WHERE t2.c = t1.a AND t2.b <= '359899'
|
||||||
|
ORDER BY t2.c DESC, t2.b DESC LIMIT 1) WHERE t1.a = 10;
|
||||||
|
SELECT sql_no_cache t1.a, r.a, r.b FROM t1 LEFT JOIN t2 r
|
||||||
|
ON r.a = (SELECT t2.a FROM t2 WHERE t2.c = t1.a AND t2.b <= '359899'
|
||||||
|
ORDER BY t2.c DESC, t2.b DESC LIMIT 1) WHERE t1.a = 10;
|
||||||
|
|
||||||
|
explain SELECT sql_no_cache t1.a, r.a, r.b FROM t1 LEFT JOIN t2 r
|
||||||
|
ON r.a = (SELECT t2.a FROM t2 WHERE t2.c = t1.a AND t2.b <= '359899'
|
||||||
|
ORDER BY t2.c, t2.b LIMIT 1) WHERE t1.a = 10;
|
||||||
|
SELECT sql_no_cache t1.a, r.a, r.b FROM t1 LEFT JOIN t2 r
|
||||||
|
ON r.a = (SELECT t2.a FROM t2 WHERE t2.c = t1.a AND t2.b <= '359899'
|
||||||
|
ORDER BY t2.c, t2.b LIMIT 1) WHERE t1.a = 10;
|
||||||
|
|
||||||
|
drop table t1,t2;
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
@ -2980,6 +2980,14 @@ int QUICK_SELECT::get_next()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QUICK_SELECT::reset(void)
|
||||||
|
{
|
||||||
|
next= 0;
|
||||||
|
it.rewind();
|
||||||
|
range= 0;
|
||||||
|
if (file->inited == handler::NONE)
|
||||||
|
file->ha_index_init(index);
|
||||||
|
}
|
||||||
|
|
||||||
/* Get next for geometrical indexes */
|
/* Get next for geometrical indexes */
|
||||||
|
|
||||||
@ -3201,7 +3209,11 @@ bool QUICK_SELECT_DESC::test_if_null_range(QUICK_RANGE *range_arg,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
void QUICK_SELECT_DESC::reset(void)
|
||||||
|
{
|
||||||
|
rev_it.rewind();
|
||||||
|
QUICK_SELECT::reset();
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
** Print a quick range for debugging
|
** Print a quick range for debugging
|
||||||
|
@ -86,7 +86,7 @@ public:
|
|||||||
|
|
||||||
QUICK_SELECT(THD *thd, TABLE *table,uint index_arg,bool no_alloc=0);
|
QUICK_SELECT(THD *thd, TABLE *table,uint index_arg,bool no_alloc=0);
|
||||||
virtual ~QUICK_SELECT();
|
virtual ~QUICK_SELECT();
|
||||||
void reset(void) { next=0; it.rewind(); }
|
virtual void reset(void);
|
||||||
int init()
|
int init()
|
||||||
{
|
{
|
||||||
key_part_info= head->key_info[index].key_part;
|
key_part_info= head->key_info[index].key_part;
|
||||||
@ -120,7 +120,7 @@ private:
|
|||||||
#ifdef NOT_USED
|
#ifdef NOT_USED
|
||||||
bool test_if_null_range(QUICK_RANGE *range, uint used_key_parts);
|
bool test_if_null_range(QUICK_RANGE *range, uint used_key_parts);
|
||||||
#endif
|
#endif
|
||||||
void reset(void) { next=0; rev_it.rewind(); }
|
void reset(void);
|
||||||
List<QUICK_RANGE> rev_ranges;
|
List<QUICK_RANGE> rev_ranges;
|
||||||
List_iterator<QUICK_RANGE> rev_it;
|
List_iterator<QUICK_RANGE> rev_it;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user