Skip to content

Commit c7e824d

Browse files
author
Ayush Gupta
committed
Bug#35854362 - Incorrect results when using group by loose
index scan Description: - Indexes are ordered based on their keys. Loose index scan effectively jumps from one unique value (or set of values) to the next based on the index’s prefix keys. - To “jump” values in an index, we use the handler call: ha_index_read_map(). - the first range read sets an end-of-range value to indicate the end of the first range. - The next range read does not clear the previous end-of-range value and applies it to the current range. - Since the end-of-range value has already been crossed in the previous range read, this causes the reads to stop. So the iteration is finished with the current range without moving onto the next range(unique set of values)resulting in an incorrect query result. Fix: - In order to find the next unique value, the old end-of-range value is cleared. Change-Id: I84290fb794db13ec6f0795dd14a92cf85b9dad09
1 parent 6a5a4a5 commit c7e824d

File tree

3 files changed

+160
-0
lines changed

3 files changed

+160
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#
2+
# Bug #35854362: INCORRECT RESULTS WHEN USING GROUP BY LOOSE
3+
# INDEX SCAN
4+
#
5+
CREATE TABLE t1 (
6+
a1 CHAR(64),
7+
a2 CHAR(64),
8+
b CHAR(16),
9+
c CHAR(16) NOT NULL,
10+
d CHAR(16),
11+
dummy CHAR(248) DEFAULT ' '
12+
);
13+
INSERT INTO t1 (a1, a2, b, c, d) VALUES
14+
('a','a','a','a111','xy1'),('a','a','a','b111','xy2'),('a','a','a','c111','xy3'),('a','a','a','d111','xy4'),
15+
('a','a','b','e112','xy1'),('a','a','b','f112','xy2'),('a','a','b','g112','xy3'),('a','a','b','h112','xy4'),
16+
('a','b','a','i121','xy1'),('a','b','a','j121','xy2'),('a','b','a','k121','xy3'),('a','b','a','l121','xy4'),
17+
('a','b','b','m122','xy1'),('a','b','b','n122','xy2'),('a','b','b','o122','xy3'),('a','b','b','p122','xy4'),
18+
('b','a','a','a211','xy1'),('b','a','a','b211','xy2'),('b','a','a','c211','xy3'),('b','a','a','d211','xy4'),
19+
('b','a','b','e212','xy1'),('b','a','b','f212','xy2'),('b','a','b','g212','xy3'),('b','a','b','h212','xy4'),
20+
('b','b','a','i221','xy1'),('b','b','a','j221','xy2'),('b','b','a','k221','xy3'),('b','b','a','l221','xy4'),
21+
('b','b','b','m222','xy1'),('b','b','b','n222','xy2'),('b','b','b','o222','xy3'),('b','b','b','p222','xy4'),
22+
('c','a','a','a311','xy1'),('c','a','a','b311','xy2'),('c','a','a','c311','xy3'),('c','a','a','d311','xy4'),
23+
('c','a','b','e312','xy1'),('c','a','b','f312','xy2'),('c','a','b','g312','xy3'),('c','a','b','h312','xy4'),
24+
('c','b','a','i321','xy1'),('c','b','a','j321','xy2'),('c','b','a','k321','xy3'),('c','b','a','l321','xy4'),
25+
('c','b','b','m322','xy1'),('c','b','b','n322','xy2'),('c','b','b','o322','xy3'),('c','b','b','p322','xy4'),
26+
('d','a','a','a411','xy1'),('d','a','a','b411','xy2'),('d','a','a','c411','xy3'),('d','a','a','d411','xy4'),
27+
('d','a','b','e412','xy1'),('d','a','b','f412','xy2'),('d','a','b','g412','xy3'),('d','a','b','h412','xy4'),
28+
('d','b','a','i421','xy1'),('d','b','a','j421','xy2'),('d','b','a','k421','xy3'),('d','b','a','l421','xy4'),
29+
('d','b','b','m422','xy1'),('d','b','b','n422','xy2'),('d','b','b','o422','xy3'),('d','b','b','p422','xy4'),
30+
('a','a','a','a111','xy1'),('a','a','a','b111','xy2'),('a','a','a','c111','xy3'),('a','a','a','d111','xy4'),
31+
('a','a','b','e112','xy1'),('a','a','b','f112','xy2'),('a','a','b','g112','xy3'),('a','a','b','h112','xy4'),
32+
('a','b','a','i121','xy1'),('a','b','a','j121','xy2'),('a','b','a','k121','xy3'),('a','b','a','l121','xy4'),
33+
('a','b','b','m122','xy1'),('a','b','b','n122','xy2'),('a','b','b','o122','xy3'),('a','b','b','p122','xy4'),
34+
('b','a','a','a211','xy1'),('b','a','a','b211','xy2'),('b','a','a','c211','xy3'),('b','a','a','d211','xy4'),
35+
('b','a','b','e212','xy1'),('b','a','b','f212','xy2'),('b','a','b','g212','xy3'),('b','a','b','h212','xy4'),
36+
('b','b','a','i221','xy1'),('b','b','a','j221','xy2'),('b','b','a','k221','xy3'),('b','b','a','l221','xy4'),
37+
('b','b','b','m222','xy1'),('b','b','b','n222','xy2'),('b','b','b','o222','xy3'),('b','b','b','p222','xy4'),
38+
('c','a','a','a311','xy1'),('c','a','a','b311','xy2'),('c','a','a','c311','xy3'),('c','a','a','d311','xy4'),
39+
('c','a','b','e312','xy1'),('c','a','b','f312','xy2'),('c','a','b','g312','xy3'),('c','a','b','h312','xy4'),
40+
('c','b','a','i321','xy1'),('c','b','a','j321','xy2'),('c','b','a','k321','xy3'),('c','b','a','l321','xy4'),
41+
('c','b','b','m322','xy1'),('c','b','b','n322','xy2'),('c','b','b','o322','xy3'),('c','b','b','p322','xy4'),
42+
('d','a','a','a411','xy1'),('d','a','a','b411','xy2'),('d','a','a','c411','xy3'),('d','a','a','d411','xy4'),
43+
('d','a','b','e412','xy1'),('d','a','b','f412','xy2'),('d','a','b','g412','xy3'),('d','a','b','h412','xy4'),
44+
('d','b','a','i421','xy1'),('d','b','a','j421','xy2'),('d','b','a','k421','xy3'),('d','b','a','l421','xy4'),
45+
('d','b','b','m422','xy1'),('d','b','b','n422','xy2'),('d','b','b','o422','xy3'),('d','b','b','p422','xy4');
46+
CREATE INDEX idx_t1_0 ON t1 (a1);
47+
CREATE INDEX idx_t1_1 ON t1 (a1,a2,b,c);
48+
CREATE INDEX idx_t1_2 on t1 (a1,a2,b);
49+
SET SESSION DEBUG="+d,force_lis_for_group_by";
50+
INSERT INTO t1 (
51+
WITH RECURSIVE a (i) AS (
52+
SELECT 0
53+
UNION ALL
54+
SELECT i+1 FROM a where i < 9
55+
),
56+
b (i) AS (
57+
SELECT x.i + y.i * 10 + z.i * 100
58+
FROM a x, a y, a z
59+
)
60+
SELECT 'b','a','a','a211','xy1','' FROM b
61+
);
62+
SELECT @@innodb_purge_stop_now INTO @old_val;
63+
SET GLOBAL innodb_purge_stop_now = 1;
64+
DELETE FROM t1 WHERE a1 = 'b';
65+
SELECT DISTINCT a1
66+
FROM t1
67+
WHERE a1 IN ('a', 'd')
68+
AND a2 = 'b';
69+
a1
70+
a
71+
d
72+
SET SESSION DEBUG="-d,force_lis_for_group_by";
73+
SET GLOBAL innodb_purge_stop_now = @old_val;
74+
SET GLOBAL innodb_purge_run_now=1;
75+
DROP TABLE t1;
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# for innodb_purge_stop_now=ON
2+
--source include/have_debug.inc
3+
4+
--echo #
5+
--echo # Bug #35854362: INCORRECT RESULTS WHEN USING GROUP BY LOOSE
6+
--echo # INDEX SCAN
7+
--echo #
8+
9+
CREATE TABLE t1 (
10+
a1 CHAR(64),
11+
a2 CHAR(64),
12+
b CHAR(16),
13+
c CHAR(16) NOT NULL,
14+
d CHAR(16),
15+
dummy CHAR(248) DEFAULT ' '
16+
);
17+
18+
INSERT INTO t1 (a1, a2, b, c, d) VALUES
19+
('a','a','a','a111','xy1'),('a','a','a','b111','xy2'),('a','a','a','c111','xy3'),('a','a','a','d111','xy4'),
20+
('a','a','b','e112','xy1'),('a','a','b','f112','xy2'),('a','a','b','g112','xy3'),('a','a','b','h112','xy4'),
21+
('a','b','a','i121','xy1'),('a','b','a','j121','xy2'),('a','b','a','k121','xy3'),('a','b','a','l121','xy4'),
22+
('a','b','b','m122','xy1'),('a','b','b','n122','xy2'),('a','b','b','o122','xy3'),('a','b','b','p122','xy4'),
23+
('b','a','a','a211','xy1'),('b','a','a','b211','xy2'),('b','a','a','c211','xy3'),('b','a','a','d211','xy4'),
24+
('b','a','b','e212','xy1'),('b','a','b','f212','xy2'),('b','a','b','g212','xy3'),('b','a','b','h212','xy4'),
25+
('b','b','a','i221','xy1'),('b','b','a','j221','xy2'),('b','b','a','k221','xy3'),('b','b','a','l221','xy4'),
26+
('b','b','b','m222','xy1'),('b','b','b','n222','xy2'),('b','b','b','o222','xy3'),('b','b','b','p222','xy4'),
27+
('c','a','a','a311','xy1'),('c','a','a','b311','xy2'),('c','a','a','c311','xy3'),('c','a','a','d311','xy4'),
28+
('c','a','b','e312','xy1'),('c','a','b','f312','xy2'),('c','a','b','g312','xy3'),('c','a','b','h312','xy4'),
29+
('c','b','a','i321','xy1'),('c','b','a','j321','xy2'),('c','b','a','k321','xy3'),('c','b','a','l321','xy4'),
30+
('c','b','b','m322','xy1'),('c','b','b','n322','xy2'),('c','b','b','o322','xy3'),('c','b','b','p322','xy4'),
31+
('d','a','a','a411','xy1'),('d','a','a','b411','xy2'),('d','a','a','c411','xy3'),('d','a','a','d411','xy4'),
32+
('d','a','b','e412','xy1'),('d','a','b','f412','xy2'),('d','a','b','g412','xy3'),('d','a','b','h412','xy4'),
33+
('d','b','a','i421','xy1'),('d','b','a','j421','xy2'),('d','b','a','k421','xy3'),('d','b','a','l421','xy4'),
34+
('d','b','b','m422','xy1'),('d','b','b','n422','xy2'),('d','b','b','o422','xy3'),('d','b','b','p422','xy4'),
35+
('a','a','a','a111','xy1'),('a','a','a','b111','xy2'),('a','a','a','c111','xy3'),('a','a','a','d111','xy4'),
36+
('a','a','b','e112','xy1'),('a','a','b','f112','xy2'),('a','a','b','g112','xy3'),('a','a','b','h112','xy4'),
37+
('a','b','a','i121','xy1'),('a','b','a','j121','xy2'),('a','b','a','k121','xy3'),('a','b','a','l121','xy4'),
38+
('a','b','b','m122','xy1'),('a','b','b','n122','xy2'),('a','b','b','o122','xy3'),('a','b','b','p122','xy4'),
39+
('b','a','a','a211','xy1'),('b','a','a','b211','xy2'),('b','a','a','c211','xy3'),('b','a','a','d211','xy4'),
40+
('b','a','b','e212','xy1'),('b','a','b','f212','xy2'),('b','a','b','g212','xy3'),('b','a','b','h212','xy4'),
41+
('b','b','a','i221','xy1'),('b','b','a','j221','xy2'),('b','b','a','k221','xy3'),('b','b','a','l221','xy4'),
42+
('b','b','b','m222','xy1'),('b','b','b','n222','xy2'),('b','b','b','o222','xy3'),('b','b','b','p222','xy4'),
43+
('c','a','a','a311','xy1'),('c','a','a','b311','xy2'),('c','a','a','c311','xy3'),('c','a','a','d311','xy4'),
44+
('c','a','b','e312','xy1'),('c','a','b','f312','xy2'),('c','a','b','g312','xy3'),('c','a','b','h312','xy4'),
45+
('c','b','a','i321','xy1'),('c','b','a','j321','xy2'),('c','b','a','k321','xy3'),('c','b','a','l321','xy4'),
46+
('c','b','b','m322','xy1'),('c','b','b','n322','xy2'),('c','b','b','o322','xy3'),('c','b','b','p322','xy4'),
47+
('d','a','a','a411','xy1'),('d','a','a','b411','xy2'),('d','a','a','c411','xy3'),('d','a','a','d411','xy4'),
48+
('d','a','b','e412','xy1'),('d','a','b','f412','xy2'),('d','a','b','g412','xy3'),('d','a','b','h412','xy4'),
49+
('d','b','a','i421','xy1'),('d','b','a','j421','xy2'),('d','b','a','k421','xy3'),('d','b','a','l421','xy4'),
50+
('d','b','b','m422','xy1'),('d','b','b','n422','xy2'),('d','b','b','o422','xy3'),('d','b','b','p422','xy4');
51+
52+
CREATE INDEX idx_t1_0 ON t1 (a1);
53+
CREATE INDEX idx_t1_1 ON t1 (a1,a2,b,c);
54+
CREATE INDEX idx_t1_2 on t1 (a1,a2,b);
55+
SET SESSION DEBUG="+d,force_lis_for_group_by";
56+
57+
INSERT INTO t1 (
58+
WITH RECURSIVE a (i) AS (
59+
SELECT 0
60+
UNION ALL
61+
SELECT i+1 FROM a where i < 9
62+
),
63+
b (i) AS (
64+
SELECT x.i + y.i * 10 + z.i * 100
65+
FROM a x, a y, a z
66+
)
67+
SELECT 'b','a','a','a211','xy1','' FROM b
68+
);
69+
70+
SELECT @@innodb_purge_stop_now INTO @old_val;
71+
SET GLOBAL innodb_purge_stop_now = 1;
72+
73+
DELETE FROM t1 WHERE a1 = 'b';
74+
75+
SELECT DISTINCT a1
76+
FROM t1
77+
WHERE a1 IN ('a', 'd')
78+
AND a2 = 'b';
79+
80+
SET SESSION DEBUG="-d,force_lis_for_group_by";
81+
SET GLOBAL innodb_purge_stop_now = @old_val;
82+
SET GLOBAL innodb_purge_run_now=1;
83+
84+
DROP TABLE t1;

sql/range_optimizer/group_index_skip_scan.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,7 @@ int GroupIndexSkipScanIterator::get_next_prefix(uint prefix_length,
543543
if (last_prefix_range != nullptr) {
544544
/* Read the next record in the same range with prefix after cur_prefix. */
545545
assert(cur_prefix != nullptr);
546+
table()->file->set_end_range(nullptr, handler::RANGE_SCAN_ASC);
546547
int result = table()->file->ha_index_read_map(
547548
table()->record[0], cur_prefix, keypart_map, HA_READ_AFTER_KEY);
548549
if (result || last_prefix_range->max_keypart_map == 0) return result;

0 commit comments

Comments
 (0)