File: loose_scan.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (234 lines) | stat: -rw-r--r-- 6,455 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
--echo #
--echo # Bug#13464493 "19 X HIGHER THAN EXPECTED EXEC. TIME FOR
--echo #               MYSQL_BENCH/COUNT_DISTINCT_KEY_PREFIX" 
--echo #

CREATE TABLE t1 (
  c1 CHAR(1) NOT NULL,
  i1 INTEGER NOT NULL,
  i2 INTEGER NOT NULL,
  PRIMARY KEY (c1,i1),
  UNIQUE KEY k1 (c1,i2)
) ENGINE=InnoDB, CHARSET utf8mb4;

INSERT INTO t1 VALUES ('A',0,999),('A',6,993),('A',12,987),
   ('A',18,981),('A',24,975),('A',30,969),('A',36,963),('A',42,957),
   ('A',48,951),('A',54,945),('A',60,939),('A',66,933),('A',72,927),
   ('A',78,921),('A',84,915),('A',90,909),('A',96,903),('A',102,897),
   ('A',108,891),('A',114,885),('A',120,879),('A',126,873),('A',132,867),
   ('A',138,861),('A',144,855),('A',150,849),('A',156,843),('A',162,837),
   ('A',168,831),('A',174,825),('A',180,819),('A',186,813),('A',192,807),
   ('A',198,801),('A',204,795),('B',210,789),('B',216,783),('B',222,777),
   ('B',228,771),('B',234,765),('B',240,759),('B',246,753),('B',252,747),
   ('B',258,741),('B',264,735),('B',270,729),('B',276,723),('B',282,717),
   ('B',288,711),('B',294,705),('B',300,699),('B',306,693),('B',312,687),
   ('B',318,681),('B',324,675),('B',330,669),('B',336,663),('B',342,657),
   ('B',348,651),('B',354,645),('B',360,639),('B',366,633),('B',372,627),
   ('B',378,621),('C',384,615),('C',390,609),('C',396,603),('C',402,597),
   ('C',408,591),('C',414,585),('C',420,579),('C',426,573),('C',432,567),
   ('C',438,561),('C',444,555),('C',450,549),('C',456,543),('C',462,537),
   ('C',468,531),('C',474,525),('C',480,519),('C',486,513),('C',492,507),
   ('C',498,501),('C',504,495),('C',510,489),('C',516,483),('C',522,477),
   ('C',528,471),('C',534,465),('C',540,459),('C',546,453),('C',552,447),
   ('C',558,441),('C',564,435),('C',570,429),('C',576,423),('C',582,417),
   ('C',588,411),('C',594,405);

-- disable_result_log
ANALYZE TABLE t1;
-- enable_result_log

# The following query should use loose index scan on the secondary
# index k1. The Extra field should show "Using index for group-by".

let query=
SELECT COUNT(DISTINCT c1) FROM t1;

eval EXPLAIN $query;
eval $query;

DROP TABLE t1;

--echo #
--echo # Bug#11757108 "CHANGE IN EXECUTION PLAN FOR COUNT_DISTINCT_GROUP_ON_KEY
--echo #               CAUSES PEFORMANCE REGRESSIONS"
--echo #

CREATE TABLE t0 (
  i1 INTEGER NOT NULL
);

INSERT INTO t0 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
                      (11),(12),(13),(14),(15),(16),(17),(18),(19),(20),
                      (21),(22),(23),(24),(25),(26),(27),(28),(29),(30);

CREATE TABLE t1 (
  c1 CHAR(1) NOT NULL,
  i1 INTEGER NOT NULL,
  i2 INTEGER NOT NULL,
  PRIMARY KEY (c1,i1),
  UNIQUE KEY k1 (c1,i2)
) ENGINE=InnoDB, CHARSET utf8mb4;
                 
INSERT INTO t1 SELECT 'A',i1,i1 FROM t0;
INSERT INTO t1 SELECT 'B',i1,i1 FROM t0;
INSERT INTO t1 SELECT 'C',i1,i1 FROM t0;
INSERT INTO t1 SELECT 'D',i1,i1 FROM t0;
INSERT INTO t1 SELECT 'E',i1,i1 FROM t0;
INSERT INTO t1 SELECT 'F',i1,i1 FROM t0;

-- disable_result_log
ANALYZE TABLE t1;
-- enable_result_log

# The following query should use loose index scan on the secondary
# index k1. The Extra field should show "Using index for group-by (scanning)".

let query=
select c1,count(distinct i2) from t1 group by c1;

eval EXPLAIN $query;
FLUSH STATUS;
eval $query;

# The query should be run using the scanning option for loose index scan.
# It should only do a few read key calls and many read next calls:
--skip_if_hypergraph  # Does not support this access method yet.
SHOW STATUS LIKE 'Handler_read_key';
--skip_if_hypergraph  # Does not support this access method yet.
SHOW STATUS LIKE 'Handler_read_next';

DROP TABLE t0, t1;

--echo #
--echo # Bug#17222452 SELECT COUNT(DISTINCT A,B) INCORRECTLY COUNTS 
--echo #              ROWS CONTAINING NULL 
--echo #
CREATE TABLE t (a INT, b INT,KEY k(a,b));
INSERT INTO t VALUES (1,2),
       (NULL,3),(3,3),(1,NULL),
       (NULL,2), (NULL,NULL);
--replace_column 10 # 11 # 
EXPLAIN SELECT COUNT(DISTINCT a,b) FROM t;
SELECT COUNT(DISTINCT a,b) FROM t;
--replace_column 10 #
EXPLAIN SELECT COUNT(DISTINCT a,b) FROM t IGNORE INDEX (k);
SELECT COUNT(DISTINCT a,b) FROM t IGNORE INDEX (k);
DROP TABLE t;

--echo #
--echo # Bug#16982071: ASSERT `TAB->KEYS.IS_SET(KEYNO)' FAILED IN 
--echo # SETUP_SEMIJOIN_DUPS_ELIMINATION
--echo #

CREATE TABLE t1 (
  pk INTEGER,
  col_int INTEGER,
  PRIMARY KEY (pk)
);

CREATE TABLE t2 (
  pk INTEGER,
  col_varchar_key VARCHAR(1),
  PRIMARY KEY (pk),
  KEY (col_varchar_key)
) CHARSET utf8mb4;

INSERT INTO t2 VALUES (1, 'g');

CREATE TABLE t3 (
  pk INTEGER,
  col_varchar_key VARCHAR(1),
  PRIMARY KEY (pk),
  KEY (col_varchar_key)
) CHARSET utf8mb4;

INSERT INTO t3 VALUES (1, 'v'),(2, NULL);

let $query=
  SELECT  t1.col_int
  FROM t1, t3
  WHERE  t3.col_varchar_key IN (
     SELECT t2.col_varchar_key FROM t2 WHERE t2.pk > t1.col_int
  );

--replace_column 10 #
--eval EXPLAIN $query
--eval $query

DROP TABLE t1, t2, t3;

--echo #
--echo # Bug #30659810: INCORRECT QUERY RESULTS
--echo #

CREATE TABLE t1 (
  a INTEGER NOT NULL
);
INSERT INTO t1 VALUES (2),(2);

CREATE TABLE t2 (
  b INTEGER
);
INSERT INTO t2 VALUES (2),(11),(11);

CREATE TABLE t3 (
  b INTEGER,
  pk INTEGER,
  KEY b_key (b)
);
INSERT INTO t3 VALUES (2,5);

CREATE TABLE t4 (
  pk INTEGER NOT NULL
);
INSERT INTO t4 VALUES (5),(7);

ANALYZE TABLE t1,t2,t3,t4;

let $query =
  SELECT *
FROM t1
  JOIN t2 ON t1.a = t2.b
WHERE t2.b IN (
  SELECT t3.b
  FROM t3 JOIN t4 ON t3.pk = t4.pk
);

# Verify that the left (outer) side of the nested loop semijoin iterator
# only contains a single table; anything else would give the wrong results
# (deduplicating away rows that should not be deduplicated).
--skip_if_hypergraph  # Different query plan.
eval EXPLAIN FORMAT=TREE $query;
eval $query;

DROP TABLE t1, t2, t3, t4;

--echo #
--echo # Bug #32597719: WL#14325: ASSERTION `IS_NULL_ROW == FALSE' FAILED|SQL/SORTING_ITERATOR.H
--echo #

CREATE TABLE t1 (
  col_int INTEGER,
  col_varchar_key VARCHAR(1)
);

CREATE TABLE t2 (
  pk INTEGER,
  j JSON
);

INSERT INTO t2 VALUES (1,'true'),(2,'true'),(3,'true'),(4,'true'),(5,'true');

ANALYZE TABLE t1, t2;

# Sets up a plan where the sort is _not_ on the first table,
# but produces no rows, so that the final AggregateIterator
# needs to set the NULL row flag on a sort that has not
# been started yet.
SELECT SUM(t1.col_int)
  FROM t1, t2
WHERE t2.j IN (
  SELECT t3.j FROM t2 JOIN t2 AS t3 ON t2.pk <> t3.pk
) AND t1.col_varchar_key='';

DROP TABLE t1, t2;