mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug#44821: select distinct on partitioned table returns wrong results
Range analysis did not request sorted output from the storage engine, which cause partitioned handlers to process one partition at a time while reading key prefixes in ascending order, causing values to be missed. Fixed by always requesting sorted order during range analysis. This fix is introduced in 6.0 by the fix for bug no 41136.
This commit is contained in:
@ -2463,3 +2463,61 @@ c
|
||||
2
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
CREATE TABLE t1 ( a INT, b INT, c INT, KEY bc(b, c) )
|
||||
PARTITION BY KEY (a, b) PARTITIONS 3
|
||||
;
|
||||
INSERT INTO t1 VALUES
|
||||
(17, 1, -8),
|
||||
(3, 1, -7),
|
||||
(23, 1, -6),
|
||||
(22, 1, -5),
|
||||
(11, 1, -4),
|
||||
(21, 1, -3),
|
||||
(19, 1, -2),
|
||||
(30, 1, -1),
|
||||
(20, 1, 1),
|
||||
(16, 1, 2),
|
||||
(18, 1, 3),
|
||||
(9, 1, 4),
|
||||
(15, 1, 5),
|
||||
(28, 1, 6),
|
||||
(29, 1, 7),
|
||||
(25, 1, 8),
|
||||
(10, 1, 9),
|
||||
(13, 1, 10),
|
||||
(27, 1, 11),
|
||||
(24, 1, 12),
|
||||
(12, 1, 13),
|
||||
(26, 1, 14),
|
||||
(14, 1, 15)
|
||||
;
|
||||
SELECT b, c FROM t1 WHERE b = 1 GROUP BY b, c;
|
||||
b c
|
||||
1 -8
|
||||
1 -7
|
||||
1 -6
|
||||
1 -5
|
||||
1 -4
|
||||
1 -3
|
||||
1 -2
|
||||
1 -1
|
||||
1 1
|
||||
1 2
|
||||
1 3
|
||||
1 4
|
||||
1 5
|
||||
1 6
|
||||
1 7
|
||||
1 8
|
||||
1 9
|
||||
1 10
|
||||
1 11
|
||||
1 12
|
||||
1 13
|
||||
1 14
|
||||
1 15
|
||||
EXPLAIN
|
||||
SELECT b, c FROM t1 WHERE b = 1 GROUP BY b, c;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range bc bc 10 NULL 7 Using where; Using index for group-by
|
||||
DROP TABLE t1;
|
||||
|
@ -983,3 +983,43 @@ SELECT DISTINCT c FROM t1 WHERE d=4;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
#
|
||||
# Bug#44821: select distinct on partitioned table returns wrong results
|
||||
#
|
||||
CREATE TABLE t1 ( a INT, b INT, c INT, KEY bc(b, c) )
|
||||
PARTITION BY KEY (a, b) PARTITIONS 3
|
||||
;
|
||||
|
||||
INSERT INTO t1 VALUES
|
||||
(17, 1, -8),
|
||||
(3, 1, -7),
|
||||
(23, 1, -6),
|
||||
(22, 1, -5),
|
||||
(11, 1, -4),
|
||||
(21, 1, -3),
|
||||
(19, 1, -2),
|
||||
(30, 1, -1),
|
||||
|
||||
(20, 1, 1),
|
||||
(16, 1, 2),
|
||||
(18, 1, 3),
|
||||
(9, 1, 4),
|
||||
(15, 1, 5),
|
||||
(28, 1, 6),
|
||||
(29, 1, 7),
|
||||
(25, 1, 8),
|
||||
(10, 1, 9),
|
||||
(13, 1, 10),
|
||||
(27, 1, 11),
|
||||
(24, 1, 12),
|
||||
(12, 1, 13),
|
||||
(26, 1, 14),
|
||||
(14, 1, 15)
|
||||
;
|
||||
|
||||
SELECT b, c FROM t1 WHERE b = 1 GROUP BY b, c;
|
||||
|
||||
EXPLAIN
|
||||
SELECT b, c FROM t1 WHERE b = 1 GROUP BY b, c;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
@ -8556,7 +8556,7 @@ int QUICK_RANGE_SELECT::get_next_prefix(uint prefix_length,
|
||||
result= file->read_range_first(last_range->min_keypart_map ? &start_key : 0,
|
||||
last_range->max_keypart_map ? &end_key : 0,
|
||||
test(last_range->flag & EQ_RANGE),
|
||||
sorted);
|
||||
TRUE);
|
||||
if (last_range->flag == (UNIQUE_RANGE | EQ_RANGE))
|
||||
last_range= 0; // Stop searching
|
||||
|
||||
|
Reference in New Issue
Block a user