Commit 3468f4b4 authored by Georgi Kodinov's avatar Georgi Kodinov
Browse files

Bug#37548: result value erronously reported being NULL in certain subqueries

      
When switching to indexed ORDER BY we must be sure to reset the index read
flag if we are switching from a covering index to non-covering.
parent 12846f41
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -4391,3 +4391,42 @@ SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
s1
a
DROP TABLE t1;
CREATE TABLE t1 (a int, b int, PRIMARY KEY (a), KEY b (b));
INSERT INTO t1 VALUES (1,NULL), (9,NULL);
CREATE TABLE t2 (
a int,
b int,
c int,
d int,
PRIMARY KEY (a),
UNIQUE KEY b (b,c,d),
KEY b_2 (b),
KEY c (c),
KEY d (d)
);
INSERT INTO t2 VALUES 
(43, 2, 11 ,30),
(44, 2, 12 ,30),
(45, 1, 1  ,10000),
(46, 1, 2  ,10000),
(556,1, 32 ,10000);
CREATE TABLE t3 (
a int,
b int,
c int,
PRIMARY KEY (a),
UNIQUE KEY b (b,c),
KEY c (c),
KEY b_2 (b)
);
INSERT INTO t3 VALUES (1,1,1), (2,32,1);
explain 
SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT 1) AS incorrect FROM t1, t3 WHERE t3.b=t1.a;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	t3	index	b,b_2	b	10	NULL	2	Using index
1	PRIMARY	t1	eq_ref	PRIMARY	PRIMARY	4	test.t3.b	1	Using index
2	DEPENDENT SUBQUERY	t2	index	b,b_2,c	d	5	NULL	1	Using where
SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT 1) AS incorrect FROM t1, t3 WHERE t3.b=t1.a;
a	incorrect
1	1
DROP TABLE t1,t2,t3;
+44 −0
Original line number Diff line number Diff line
@@ -3273,3 +3273,47 @@ INSERT INTO t1 VALUES ('a');
SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
DROP TABLE t1;

#
# Bug #37548: result value erronously reported being NULL in certain subqueries
#

CREATE TABLE t1 (a int, b int, PRIMARY KEY (a), KEY b (b));

INSERT INTO t1 VALUES (1,NULL), (9,NULL);

CREATE TABLE t2 (
  a int,
  b int,
  c int,
  d int,
  PRIMARY KEY (a),
  UNIQUE KEY b (b,c,d),
  KEY b_2 (b),
  KEY c (c),
  KEY d (d)
);

INSERT INTO t2 VALUES 
  (43, 2, 11 ,30),
  (44, 2, 12 ,30),
  (45, 1, 1  ,10000),
  (46, 1, 2  ,10000),
  (556,1, 32 ,10000);

CREATE TABLE t3 (
  a int,
  b int,
  c int,
  PRIMARY KEY (a),
  UNIQUE KEY b (b,c),
  KEY c (c),
  KEY b_2 (b)
);

INSERT INTO t3 VALUES (1,1,1), (2,32,1);

explain 
SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT 1) AS incorrect FROM t1, t3 WHERE t3.b=t1.a;
SELECT t1.a, (SELECT 1 FROM t2 WHERE t2.b=t3.c AND t2.c=t1.a ORDER BY t2.d LIMIT 1) AS incorrect FROM t1, t3 WHERE t3.b=t1.a;

DROP TABLE t1,t2,t3;
+10 −0
Original line number Diff line number Diff line
@@ -13155,6 +13155,16 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
            table->key_read=1;
            table->file->extra(HA_EXTRA_KEYREAD);
          }
          else if (table->key_read)
          {
            /*
              Clear the covering key read flags that might have been
              previously set for some key other than the current best_key.
            */
            table->key_read= 0;
            table->file->extra(HA_EXTRA_NO_KEYREAD);
          }
          table->file->ha_index_or_rnd_end();
          if (join->select_options & SELECT_DESCRIBE)
          {