mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
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.
This commit is contained in:
@@ -4391,3 +4391,42 @@ SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
|
|||||||
s1
|
s1
|
||||||
a
|
a
|
||||||
DROP TABLE t1;
|
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;
|
||||||
|
@@ -3273,3 +3273,47 @@ INSERT INTO t1 VALUES ('a');
|
|||||||
SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
|
SELECT * FROM t1 WHERE _utf8'a' = ANY (SELECT s1 FROM t1);
|
||||||
DROP TABLE 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;
|
||||||
|
@@ -13155,6 +13155,16 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
|
|||||||
table->key_read=1;
|
table->key_read=1;
|
||||||
table->file->extra(HA_EXTRA_KEYREAD);
|
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();
|
table->file->ha_index_or_rnd_end();
|
||||||
if (join->select_options & SELECT_DESCRIBE)
|
if (join->select_options & SELECT_DESCRIBE)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user