Re: Wrong result with sort_union/index_merge in maria-5.1 and a large table
The bug can be demonstrated on any platform with the following test case:
CREATE TABLE t1 (
pk int NOT NULL AUTO_INCREMENT PRIMARY KEY,
a int,
b int,
INDEX idx(a))
ENGINE=INNODB;
INSERT INTO t1(a,b) VALUES
(11, 1100), (2, 200), (1, 100), (14, 1400), (5, 500),
(3, 300), (17, 1700), (4, 400), (12, 1200), (8, 800),
(6, 600), (18, 1800), (9, 900), (10, 1000), (7, 700),
(13, 1300), (15, 1500), (19, 1900), (16, 1600), (20, 2000);
INSERT INTO t1(a,b) SELECT a+20, b+2000 FROM t1;
INSERT INTO t1(a,b) SELECT a+40, b+4000 FROM t1;
INSERT INTO t1(a,b) SELECT a+80, b+8000 FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1(a,b) SELECT a,b FROM t1;
INSERT INTO t1 VALUES (1000000, 0, 0);
SET SESSION sort_buffer_size = 1024*36;
EXPLAIN
SELECT COUNT
FROM
(SELECT * FROM t1
WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
SELECT COUNT
FROM
(SELECT * FROM t1
WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
EXPLAIN
SELECT COUNT
FROM
(SELECT * FROM t1 IGNORE INDEX(idx)
WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
SELECT COUNT
FROM
(SELECT * FROM t1 IGNORE INDEX(idx)
WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
Running this test case one can see that the execution with index merge returns a wrong result:
MariaDB [test]> EXPLAIN
-> SELECT COUNT
FROM
-> (SELECT * FROM t1
-> WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
-----------------------------------------------------------------------------------------------------------------+
| id |
select_type |
table |
type |
possible_keys |
key |
key_len |
ref |
rows |
Extra |
-----------------------------------------------------------------------------------------------------------------+
| 1 |
PRIMARY |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
Select tables optimized away |
| 2 |
DERIVED |
t1 |
index_merge |
PRIMARY,idx |
idx,PRIMARY |
5,4 |
NULL |
11419 |
Using sort_union(idx,PRIMARY); Using where |
-----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.12 sec)
MariaDB [test]> SELECT COUNT
FROM
-> (SELECT * FROM t1
-> WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
----------
COUNT |
----------
----------
1 row in set (0.12 sec)
MariaDB [test]> EXPLAIN
-> SELECT COUNT
FROM
-> (SELECT * FROM t1 IGNORE INDEX(idx)
-> WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
--------------------------------------------------------------------------------------+
| id |
select_type |
table |
type |
possible_keys |
key |
key_len |
ref |
rows |
Extra |
--------------------------------------------------------------------------------------+
| 1 |
PRIMARY |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
Select tables optimized away |
| 2 |
DERIVED |
t1 |
ALL |
PRIMARY |
NULL |
NULL |
NULL |
164439 |
Using where |
--------------------------------------------------------------------------------------+
2 rows in set (0.50 sec)
MariaDB [test]> SELECT COUNT
FROM
-> (SELECT * FROM t1 IGNORE INDEX(idx)
-> WHERE a BETWEEN 2 AND 7 OR pk=1000000) AS t;
----------
COUNT |
----------
----------
1 row in set (0.51 sec)
The test case appears to require at least 10K rows to work. Further simplification was not possible.
Test case
LPexportBug640419_bug640419.zip