Commit 8462d3a4 authored by unknown's avatar unknown
Browse files

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.


mysql-test/r/subselect.result:
  Bug #21180: Subselect with index for both WHERE and ORDER BY produces empty result
   - test case
mysql-test/t/subselect.test:
  Bug #21180: Subselect with index for both WHERE and ORDER BY produces empty result
   - test case
sql/opt_range.cc:
  Bug #21180: Subselect with index for both WHERE and ORDER BY produces empty result
   - partially backported the correct reseting of QUICK_SELECTs from 5.x.
sql/opt_range.h:
  Bug #21180: Subselect with index for both WHERE and ORDER BY produces empty result
   - partially backported the correct reseting of QUICK_SELECTs from 5.x.
parent 84ece59c
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -2895,3 +2895,32 @@ select * from t1 where NOT(s1 = ALL (select s1/s1 from t1));
s1
2
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;
+26 −0
Original line number Diff line number Diff line
@@ -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 NOT(s1 = ALL (select s1/s1 from 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
+13 −1
Original line number Diff line number Diff line
@@ -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 */

@@ -3201,7 +3209,11 @@ bool QUICK_SELECT_DESC::test_if_null_range(QUICK_RANGE *range_arg,
  return 0;
}
#endif

void QUICK_SELECT_DESC::reset(void)
{ 
  rev_it.rewind();
  QUICK_SELECT::reset();
}

/*****************************************************************************
** Print a quick range for debugging
+2 −2
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ class QUICK_SELECT {

  QUICK_SELECT(THD *thd, TABLE *table,uint index_arg,bool no_alloc=0);
  virtual ~QUICK_SELECT();
  void reset(void) { next=0; it.rewind(); }
  virtual void reset(void);
  int init()
  {
    key_part_info= head->key_info[index].key_part;
@@ -120,7 +120,7 @@ class QUICK_SELECT_DESC: public QUICK_SELECT
#ifdef NOT_USED
  bool test_if_null_range(QUICK_RANGE *range, uint used_key_parts);
#endif
  void reset(void) { next=0; rev_it.rewind(); }
  void reset(void);
  List<QUICK_RANGE> rev_ranges;
  List_iterator<QUICK_RANGE> rev_it;
};