blob: 8db23c55a6bba1c9cca673a61878333327a0f9cf [file] [log] [blame]
dan86fb6e12018-05-16 20:58:07 +00001# 2018 May 8
2#
3# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
5#
6# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
9#
10#***********************************************************************
11# This file implements regression tests for SQLite library.
12#
13
14set testdir [file dirname $argv0]
15source $testdir/tester.tcl
16set testprefix window1
17
dan67a9b8e2018-06-22 20:51:35 +000018ifcapable !windowfunc {
19 finish_test
20 return
21}
dan86fb6e12018-05-16 20:58:07 +000022
23do_execsql_test 1.0 {
24 CREATE TABLE t1(a, b, c, d);
25 INSERT INTO t1 VALUES(1, 2, 3, 4);
26 INSERT INTO t1 VALUES(5, 6, 7, 8);
27 INSERT INTO t1 VALUES(9, 10, 11, 12);
28}
29
30do_execsql_test 1.1 {
31 SELECT sum(b) OVER () FROM t1
32} {18 18 18}
33
34do_execsql_test 1.2 {
35 SELECT a, sum(b) OVER () FROM t1
36} {1 18 5 18 9 18}
37
38do_execsql_test 1.3 {
39 SELECT a, 4 + sum(b) OVER () FROM t1
40} {1 22 5 22 9 22}
41
42do_execsql_test 1.4 {
43 SELECT a + 4 + sum(b) OVER () FROM t1
44} {23 27 31}
45
46do_execsql_test 1.5 {
47 SELECT a, sum(b) OVER (PARTITION BY c) FROM t1
48} {1 2 5 6 9 10}
49
50foreach {tn sql} {
51 1 "SELECT sum(b) OVER () FROM t1"
52 2 "SELECT sum(b) OVER (PARTITION BY c) FROM t1"
53 3 "SELECT sum(b) OVER (ORDER BY c) FROM t1"
54 4 "SELECT sum(b) OVER (PARTITION BY d ORDER BY c) FROM t1"
55 5 "SELECT sum(b) FILTER (WHERE a>0) OVER (PARTITION BY d ORDER BY c) FROM t1"
56 6 "SELECT sum(b) OVER (ORDER BY c RANGE UNBOUNDED PRECEDING) FROM t1"
57 7 "SELECT sum(b) OVER (ORDER BY c ROWS 45 PRECEDING) FROM t1"
58 8 "SELECT sum(b) OVER (ORDER BY c RANGE CURRENT ROW) FROM t1"
59 9 "SELECT sum(b) OVER (ORDER BY c RANGE BETWEEN UNBOUNDED PRECEDING
60 AND CURRENT ROW) FROM t1"
61 10 "SELECT sum(b) OVER (ORDER BY c ROWS BETWEEN UNBOUNDED PRECEDING
62 AND UNBOUNDED FOLLOWING) FROM t1"
63} {
64 do_test 2.$tn { lindex [catchsql $sql] 0 } 0
65}
66
67foreach {tn sql} {
68 1 "SELECT * FROM t1 WHERE sum(b) OVER ()"
69 2 "SELECT * FROM t1 GROUP BY sum(b) OVER ()"
70 3 "SELECT * FROM t1 GROUP BY a HAVING sum(b) OVER ()"
71} {
72 do_catchsql_test 3.$tn $sql {1 {misuse of window function sum()}}
73}
74
75do_execsql_test 4.0 {
76 CREATE TABLE t2(a, b, c);
77 INSERT INTO t2 VALUES(0, 0, 0);
78 INSERT INTO t2 VALUES(1, 1, 1);
79 INSERT INTO t2 VALUES(2, 0, 2);
80 INSERT INTO t2 VALUES(3, 1, 0);
81 INSERT INTO t2 VALUES(4, 0, 1);
82 INSERT INTO t2 VALUES(5, 1, 2);
83 INSERT INTO t2 VALUES(6, 0, 0);
84}
85
86do_execsql_test 4.1 {
87 SELECT a, sum(a) OVER (PARTITION BY b) FROM t2;
88} {
89 0 12 2 12 4 12 6 12 1 9 3 9 5 9
90}
91
92do_execsql_test 4.2 {
93 SELECT a, sum(a) OVER (PARTITION BY b) FROM t2 ORDER BY a;
94} {
95 0 12 1 9 2 12 3 9 4 12 5 9 6 12
96}
97
98do_execsql_test 4.3 {
99 SELECT a, sum(a) OVER () FROM t2 ORDER BY a;
100} {
101 0 21 1 21 2 21 3 21 4 21 5 21 6 21
102}
103
104do_execsql_test 4.4 {
105 SELECT a, sum(a) OVER (ORDER BY a) FROM t2;
106} {
107 0 0 1 1 2 3 3 6 4 10 5 15 6 21
108}
109
110do_execsql_test 4.5 {
111 SELECT a, sum(a) OVER (PARTITION BY b ORDER BY a) FROM t2 ORDER BY a
112} {
113 0 0 1 1 2 2 3 4 4 6 5 9 6 12
114}
115
dan2e362f92018-05-17 14:26:27 +0000116do_execsql_test 4.6 {
117 SELECT a, sum(a) OVER (PARTITION BY c ORDER BY a) FROM t2 ORDER BY a
118} {
119 0 0 1 1 2 2 3 3 4 5 5 7 6 9
120}
121
122do_execsql_test 4.7 {
123 SELECT a, sum(a) OVER (PARTITION BY b ORDER BY a DESC) FROM t2 ORDER BY a
124} {
125 0 12 1 9 2 12 3 8 4 10 5 5 6 6
126}
127
128do_execsql_test 4.8 {
129 SELECT a,
130 sum(a) OVER (PARTITION BY b ORDER BY a DESC),
131 sum(a) OVER (PARTITION BY c ORDER BY a)
132 FROM t2 ORDER BY a
133} {
134 0 12 0
135 1 9 1
136 2 12 2
137 3 8 3
138 4 10 5
139 5 5 7
140 6 6 9
141}
142
dane2f781b2018-05-17 19:24:08 +0000143do_execsql_test 4.9 {
144 SELECT a,
145 sum(a) OVER (ORDER BY a),
146 avg(a) OVER (ORDER BY a)
147 FROM t2 ORDER BY a
148} {
149 0 0 0.0
150 1 1 0.5
151 2 3 1.0
152 3 6 1.5
153 4 10 2.0
154 5 15 2.5
155 6 21 3.0
156}
157
danb6e9f7a2018-05-19 14:15:29 +0000158do_execsql_test 4.10.1 {
dane2f781b2018-05-17 19:24:08 +0000159 SELECT a,
160 count() OVER (ORDER BY a DESC),
161 group_concat(a, '.') OVER (ORDER BY a DESC)
162 FROM t2 ORDER BY a DESC
163} {
164 6 1 6
165 5 2 6.5
166 4 3 6.5.4
167 3 4 6.5.4.3
168 2 5 6.5.4.3.2
169 1 6 6.5.4.3.2.1
170 0 7 6.5.4.3.2.1.0
171}
172
danb6e9f7a2018-05-19 14:15:29 +0000173do_execsql_test 4.10.2 {
174 SELECT a,
175 count(*) OVER (ORDER BY a DESC),
176 group_concat(a, '.') OVER (ORDER BY a DESC)
177 FROM t2 ORDER BY a DESC
178} {
179 6 1 6
180 5 2 6.5
181 4 3 6.5.4
182 3 4 6.5.4.3
183 2 5 6.5.4.3.2
184 1 6 6.5.4.3.2.1
185 0 7 6.5.4.3.2.1.0
186}
187
dan6bc5c9e2018-06-04 18:55:11 +0000188do_catchsql_test 5.1 {
189 SELECT ntile(0) OVER (ORDER BY a) FROM t2;
190} {1 {argument of ntile must be a positive integer}}
191do_catchsql_test 5.2 {
192 SELECT ntile(-1) OVER (ORDER BY a) FROM t2;
193} {1 {argument of ntile must be a positive integer}}
194do_catchsql_test 5.3 {
195 SELECT ntile('zbc') OVER (ORDER BY a) FROM t2;
196} {1 {argument of ntile must be a positive integer}}
197do_execsql_test 5.4 {
198 CREATE TABLE t4(a, b);
199 SELECT ntile(1) OVER (ORDER BY a) FROM t4;
200} {}
201
dandacf1de2018-06-08 16:11:55 +0000202#-------------------------------------------------------------------------
203reset_db
204do_execsql_test 6.1 {
205 CREATE TABLE t1(x);
206 INSERT INTO t1 VALUES(7), (6), (5), (4), (3), (2), (1);
207
208 CREATE TABLE t2(x);
209 INSERT INTO t2 VALUES('b'), ('a');
210
211 SELECT x, count(*) OVER (ORDER BY x) FROM t1;
212} {1 1 2 2 3 3 4 4 5 5 6 6 7 7}
213
214do_execsql_test 6.2 {
215 SELECT * FROM t2, (SELECT x, count(*) OVER (ORDER BY x) FROM t1);
216} {
217 b 1 1 b 2 2 b 3 3 b 4 4 b 5 5 b 6 6 b 7 7
218 a 1 1 a 2 2 a 3 3 a 4 4 a 5 5 a 6 6 a 7 7
219}
220
dan26522d12018-06-11 18:16:51 +0000221do_catchsql_test 6.3 {
dan8b985602018-06-09 17:43:45 +0000222 SELECT x, lag(x) FILTER (WHERE (x%2)=0) OVER w FROM t1
223 WINDOW w AS (ORDER BY x)
224} {1 {FILTER clause may only be used with aggregate window functions}}
dan26522d12018-06-11 18:16:51 +0000225
226#-------------------------------------------------------------------------
227# Attempt to use a window function as an aggregate. And other errors.
228#
229reset_db
230do_execsql_test 7.0 {
231 CREATE TABLE t1(x, y);
232 INSERT INTO t1 VALUES(1, 2);
233 INSERT INTO t1 VALUES(3, 4);
234 INSERT INTO t1 VALUES(5, 6);
235 INSERT INTO t1 VALUES(7, 8);
236 INSERT INTO t1 VALUES(9, 10);
237}
238
239do_catchsql_test 7.1.1 {
240 SELECT nth_value(x, 1) FROM t1;
241} {1 {misuse of window function nth_value()}}
242do_catchsql_test 7.1.2 {
243 SELECT * FROM t1 WHERE nth_value(x, 1) OVER (ORDER BY y);
244} {1 {misuse of window function nth_value()}}
245do_catchsql_test 7.1.3 {
246 SELECT count(*) FROM t1 GROUP BY y HAVING nth_value(x, 1) OVER (ORDER BY y);
247} {1 {misuse of window function nth_value()}}
248do_catchsql_test 7.1.4 {
249 SELECT count(*) FROM t1 GROUP BY nth_value(x, 1) OVER (ORDER BY y);
250} {1 {misuse of window function nth_value()}}
251do_catchsql_test 7.1.5 {
danc3163072018-06-23 19:29:56 +0000252 SELECT count(*) FROM t1 LIMIT nth_value(x, 1) OVER ();
dan26522d12018-06-11 18:16:51 +0000253} {1 {no such column: x}}
254do_catchsql_test 7.1.6 {
255 SELECT trim(x) OVER (ORDER BY y) FROM t1;
256} {1 {trim() may not be used as a window function}}
dan9a947222018-06-14 19:06:36 +0000257do_catchsql_test 7.1.7 {
258 SELECT max(x) OVER abc FROM t1 WINDOW def AS (ORDER BY y);
259} {1 {no such window: abc}}
dan5e61c1b2019-07-13 17:45:25 +0000260do_catchsql_test 7.1.8 {
261 SELECT row_number(x) OVER () FROM t1
dan8f245172019-07-13 17:54:24 +0000262} {1 {wrong number of arguments to function row_number()}}
dan9a947222018-06-14 19:06:36 +0000263
dane0a5e202018-06-15 16:10:44 +0000264do_execsql_test 7.2 {
265 SELECT
266 lead(y) OVER win,
267 lead(y, 2) OVER win,
268 lead(y, 3, 'default') OVER win
269 FROM t1
270 WINDOW win AS (ORDER BY x)
271} {
272 4 6 8 6 8 10 8 10 default 10 {} default {} {} default
273}
274
dan13b08bb2018-06-15 20:46:12 +0000275do_execsql_test 7.3 {
276 SELECT row_number() OVER (ORDER BY x) FROM t1
277} {1 2 3 4 5}
278
dan660af932018-06-18 16:55:22 +0000279do_execsql_test 7.4 {
280 SELECT
281 row_number() OVER win,
282 lead(x) OVER win
283 FROM t1
284 WINDOW win AS (ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
285} {1 3 2 5 3 7 4 9 5 {}}
dane2f781b2018-05-17 19:24:08 +0000286
danc95f38d2018-06-18 20:34:43 +0000287#-------------------------------------------------------------------------
288# Attempt to use a window function in a view.
289#
290do_execsql_test 8.0 {
291 CREATE TABLE t3(a, b, c);
292
293 WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<6 )
294 INSERT INTO t3 SELECT i, i, i FROM s;
295
296 CREATE VIEW v1 AS SELECT
297 sum(b) OVER (ORDER BY c),
298 min(b) OVER (ORDER BY c),
299 max(b) OVER (ORDER BY c)
300 FROM t3;
301
302 CREATE VIEW v2 AS SELECT
303 sum(b) OVER win,
304 min(b) OVER win,
305 max(b) OVER win
306 FROM t3
307 WINDOW win AS (ORDER BY c);
308}
309
310do_execsql_test 8.1.1 {
311 SELECT * FROM v1
312} {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
313do_execsql_test 8.1.2 {
314 SELECT * FROM v2
315} {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
316
317db close
318sqlite3 db test.db
319do_execsql_test 8.2.1 {
320 SELECT * FROM v1
321} {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
322do_execsql_test 8.2.2 {
323 SELECT * FROM v2
324} {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
325
dan6fb2b542018-06-19 17:13:11 +0000326#-------------------------------------------------------------------------
327# Attempt to use a window function in a trigger.
328#
329do_execsql_test 9.0 {
330 CREATE TABLE t4(x, y);
331 INSERT INTO t4 VALUES(1, 'g');
332 INSERT INTO t4 VALUES(2, 'i');
333 INSERT INTO t4 VALUES(3, 'l');
334 INSERT INTO t4 VALUES(4, 'g');
335 INSERT INTO t4 VALUES(5, 'a');
336
337 CREATE TABLE t5(x, y, m);
338 CREATE TRIGGER t4i AFTER INSERT ON t4 BEGIN
339 DELETE FROM t5;
340 INSERT INTO t5
341 SELECT x, y, max(y) OVER xyz FROM t4
342 WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x);
343 END;
344}
345
346do_execsql_test 9.1.1 {
347 SELECT x, y, max(y) OVER xyz FROM t4
348 WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x) ORDER BY 1
349} {1 g g 2 i i 3 l l 4 g i 5 a l}
350
351do_execsql_test 9.1.2 {
352 INSERT INTO t4 VALUES(6, 'm');
353 SELECT x, y, max(y) OVER xyz FROM t4
354 WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x) ORDER BY 1
355} {1 g g 2 i i 3 l l 4 g i 5 a l 6 m m}
356
357do_execsql_test 9.1.3 {
358 SELECT * FROM t5 ORDER BY 1
359} {1 g g 2 i i 3 l l 4 g i 5 a l 6 m m}
danc95f38d2018-06-18 20:34:43 +0000360
dancc464412018-06-19 18:11:05 +0000361do_execsql_test 9.2 {
362 WITH aaa(x, y, z) AS (
363 SELECT x, y, max(y) OVER xyz FROM t4
364 WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x)
365 )
366 SELECT * FROM aaa ORDER BY 1;
367} {1 g g 2 i i 3 l l 4 g i 5 a l 6 m m}
368
369do_execsql_test 9.3 {
370 WITH aaa(x, y, z) AS (
371 SELECT x, y, max(y) OVER xyz FROM t4
372 WINDOW xyz AS (ORDER BY x)
373 )
374 SELECT *, min(z) OVER (ORDER BY x) FROM aaa ORDER BY 1;
375} {1 g g g 2 i i g 3 l l g 4 g l g 5 a l g 6 m m g}
danc95f38d2018-06-18 20:34:43 +0000376
drh7b0d34f2021-04-17 13:46:23 +0000377do_catchsql_test 9.4 {
378 -- 2021-04-17 dbsqlfuzz d9cf66100064952b66951845dfab41de1c124611
379 DROP TABLE IF EXISTS t1;
380 CREATE TABLE t1(a,b,c,d);
381 DROP TABLE IF EXISTS t2;
382 CREATE TABLE t2(x,y);
383 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
384 INSERT INTO t2(x,y)
385 SELECT a, max(d) OVER w1 FROM t1
386 WINDOW w1 AS (PARTITION BY EXISTS(SELECT 1 FROM t1 WHERE c=?1) );
387 END;
388} {1 {trigger cannot use variables}}
389
dan3c6fbd62021-04-17 20:13:53 +0000390do_catchsql_test 9.4.2 {
391 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
392 INSERT INTO t1(a,b)
393 SELECT a, max(d) OVER w1 FROM t1
394 WINDOW w1 AS (
395 ORDER BY a ROWS BETWEEN ? PRECEDING AND UNBOUNDED FOLLOWING
396 );
397 END;
398} {1 {trigger cannot use variables}}
399do_catchsql_test 9.4.3 {
400 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
401 INSERT INTO t1(a,b)
402 SELECT a, max(d) OVER w1 FROM t1
403 WINDOW w1 AS (
404 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND ? FOLLOWING
405 );
406 END;
407} {1 {trigger cannot use variables}}
408
dance103732018-06-23 07:59:39 +0000409#-------------------------------------------------------------------------
410#
411do_execsql_test 10.0 {
412 CREATE TABLE sales(emp TEXT PRIMARY KEY, region, total);
413 INSERT INTO sales VALUES
414 ('Alice', 'North', 34),
415 ('Frank', 'South', 22),
416 ('Charles', 'North', 45),
417 ('Darrell', 'South', 8),
418 ('Grant', 'South', 23),
419 ('Brad' , 'North', 22),
420 ('Elizabeth', 'South', 99),
421 ('Horace', 'East', 1);
422}
423
424# Best two salespeople from each region
425#
426do_execsql_test 10.1 {
427 SELECT emp, region, total FROM (
428 SELECT
429 emp, region, total,
430 row_number() OVER (PARTITION BY region ORDER BY total DESC) AS rank
431 FROM sales
432 ) WHERE rank<=2 ORDER BY region, total DESC
433} {
434 Horace East 1
435 Charles North 45
436 Alice North 34
437 Elizabeth South 99
438 Grant South 23
439}
440
danefa3a3c2018-06-23 16:26:20 +0000441do_execsql_test 10.2 {
442 SELECT emp, region, sum(total) OVER win FROM sales
443 WINDOW win AS (PARTITION BY region ORDER BY total)
444} {
445 Horace East 1
446 Brad North 22
447 Alice North 56
448 Charles North 101
449 Darrell South 8
450 Frank South 30
451 Grant South 53
452 Elizabeth South 152
453}
454
455do_execsql_test 10.3 {
456 SELECT emp, region, sum(total) OVER win FROM sales
457 WINDOW win AS (PARTITION BY region ORDER BY total)
458 LIMIT 5
459} {
460 Horace East 1
461 Brad North 22
462 Alice North 56
463 Charles North 101
464 Darrell South 8
465}
466
467do_execsql_test 10.4 {
468 SELECT emp, region, sum(total) OVER win FROM sales
469 WINDOW win AS (PARTITION BY region ORDER BY total)
470 LIMIT 5 OFFSET 2
471} {
472 Alice North 56
473 Charles North 101
474 Darrell South 8
475 Frank South 30
476 Grant South 53
477}
478
danc3163072018-06-23 19:29:56 +0000479do_execsql_test 10.5 {
480 SELECT emp, region, sum(total) OVER win FROM sales
481 WINDOW win AS (
482 PARTITION BY region ORDER BY total
483 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
484 )
485} {
486 Horace East 1
487 Brad North 101
488 Alice North 79
489 Charles North 45
490 Darrell South 152
491 Frank South 144
492 Grant South 122
493 Elizabeth South 99
494}
495
496do_execsql_test 10.6 {
497 SELECT emp, region, sum(total) OVER win FROM sales
498 WINDOW win AS (
499 PARTITION BY region ORDER BY total
500 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
501 ) LIMIT 5 OFFSET 2
502} {
503 Alice North 79
504 Charles North 45
505 Darrell South 152
506 Frank South 144
507 Grant South 122
508}
509
510do_execsql_test 10.7 {
511 SELECT emp, region, (
512 SELECT sum(total) OVER (
513 ORDER BY total RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
514 ) || outer.emp FROM sales
515 ) FROM sales AS outer;
516} {
517 Alice North 254Alice
518 Frank South 254Frank
519 Charles North 254Charles
520 Darrell South 254Darrell
521 Grant South 254Grant
522 Brad North 254Brad
523 Elizabeth South 254Elizabeth
524 Horace East 254Horace
525}
526
danc3163072018-06-23 19:29:56 +0000527do_execsql_test 10.8 {
528 SELECT emp, region, (
529 SELECT sum(total) FILTER (WHERE sales.emp!=outer.emp) OVER (
530 ORDER BY total RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
531 ) FROM sales
532 ) FROM sales AS outer;
533} {
534 Alice North 220
535 Frank South 232
536 Charles North 209
537 Darrell South 246
538 Grant South 231
539 Brad North 232
540 Elizabeth South 155
541 Horace East 253
542}
543
dan867be212018-06-25 11:42:08 +0000544#-------------------------------------------------------------------------
545# Check that it is not possible to use a window function in a CREATE INDEX
546# statement.
547#
548do_execsql_test 11.0 { CREATE TABLE t6(a, b, c); }
549
550do_catchsql_test 11.1 {
551 CREATE INDEX t6i ON t6(a) WHERE sum(b) OVER ();
552} {1 {misuse of window function sum()}}
553do_catchsql_test 11.2 {
554 CREATE INDEX t6i ON t6(a) WHERE lead(b) OVER ();
555} {1 {misuse of window function lead()}}
556
557do_catchsql_test 11.3 {
558 CREATE INDEX t6i ON t6(sum(b) OVER ());
559} {1 {misuse of window function sum()}}
560do_catchsql_test 11.4 {
561 CREATE INDEX t6i ON t6(lead(b) OVER ());
562} {1 {misuse of window function lead()}}
danc3163072018-06-23 19:29:56 +0000563
drhd4cb09e2018-09-17 15:19:13 +0000564# 2018-09-17 ticket 510cde277783b5fb5de628393959849dff377eb3
565# Endless loop on a query with window functions and a limit
566#
567do_execsql_test 12.100 {
568 DROP TABLE IF EXISTS t1;
569 CREATE TABLE t1(id INT, b VARCHAR, c VARCHAR);
570 INSERT INTO t1 VALUES(1, 'A', 'one');
571 INSERT INTO t1 VALUES(2, 'B', 'two');
572 INSERT INTO t1 VALUES(3, 'C', 'three');
573 INSERT INTO t1 VALUES(4, 'D', 'one');
574 INSERT INTO t1 VALUES(5, 'E', 'two');
575 SELECT id, b, lead(c,1) OVER(ORDER BY c) AS x
576 FROM t1 WHERE id>1
577 ORDER BY b LIMIT 1;
578} {2 B two}
579do_execsql_test 12.110 {
580 INSERT INTO t1 VALUES(6, 'F', 'three');
581 INSERT INTO t1 VALUES(7, 'G', 'one');
582 SELECT id, b, lead(c,1) OVER(ORDER BY c) AS x
583 FROM t1 WHERE id>1
584 ORDER BY b LIMIT 2;
585} {2 B two 3 C three}
dan26522d12018-06-11 18:16:51 +0000586
dan0f5f5402018-10-23 13:48:19 +0000587#-------------------------------------------------------------------------
588
589do_execsql_test 13.1 {
590 DROP TABLE IF EXISTS t1;
591 CREATE TABLE t1(a int, b int);
592 INSERT INTO t1 VALUES(1,11);
593 INSERT INTO t1 VALUES(2,12);
594}
595
596do_execsql_test 13.2.1 {
597 SELECT a, rank() OVER(ORDER BY b) FROM t1;
598 SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
599} {
600 1 1 2 2 2 1 1 2
601}
602do_execsql_test 13.2.2 {
603 SELECT a, rank() OVER(ORDER BY b) FROM t1
604 UNION ALL
605 SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
606} {
607 1 1 2 2 2 1 1 2
608}
609do_execsql_test 13.3 {
610 SELECT a, rank() OVER(ORDER BY b) FROM t1
611 UNION
612 SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
613} {
614 1 1 1 2 2 1 2 2
615}
616
617do_execsql_test 13.4 {
618 SELECT a, rank() OVER(ORDER BY b) FROM t1
619 EXCEPT
620 SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
621} {
622 1 1 2 2
623}
624
625do_execsql_test 13.5 {
626 SELECT a, rank() OVER(ORDER BY b) FROM t1
627 INTERSECT
628 SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
drh3a075482018-12-22 15:46:23 +0000629} {}
dan0f5f5402018-10-23 13:48:19 +0000630
drh11df7d22018-12-06 19:15:36 +0000631# 2018-12-06
632# https://www.sqlite.org/src/info/f09fcd17810f65f7
drhbb383df2018-12-06 19:56:20 +0000633# Assertion fault when window functions are used.
634#
635# Root cause is the query flattener invoking sqlite3ExprDup() on
636# expressions that contain subqueries with window functions. The
637# sqlite3ExprDup() routine is not making correctly initializing
638# Select.pWin field of the subqueries.
drh11df7d22018-12-06 19:15:36 +0000639#
640sqlite3 db :memory:
641do_execsql_test 14.0 {
642 SELECT * FROM(
643 SELECT * FROM (SELECT 1 AS c) WHERE c IN (
644 SELECT (row_number() OVER()) FROM (VALUES (0))
645 )
646 );
647} {1}
drhbb383df2018-12-06 19:56:20 +0000648do_execsql_test 14.1 {
649 CREATE TABLE t1(x); INSERT INTO t1(x) VALUES(12345);
650 CREATE TABLE t2(c); INSERT INTO t2(c) VALUES(1);
651 SELECT y, y+1, y+2 FROM (
652 SELECT c IN (
653 SELECT (row_number() OVER()) FROM t1
654 ) AS y FROM t2
655 );
656} {1 2 3}
drh11df7d22018-12-06 19:15:36 +0000657
drh4afdfa12018-12-31 16:36:42 +0000658# 2018-12-31
659# https://www.sqlite.org/src/info/d0866b26f83e9c55
660# Window function in correlated subquery causes assertion fault
661#
662do_catchsql_test 15.0 {
663 WITH t(id, parent) AS (
664 SELECT CAST(1 AS INT), CAST(NULL AS INT)
665 UNION ALL
666 SELECT 2, NULL
667 UNION ALL
668 SELECT 3, 1
669 UNION ALL
670 SELECT 4, 1
671 UNION ALL
672 SELECT 5, 2
673 UNION ALL
674 SELECT 6, 2
675 ), q AS (
676 SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn
677 FROM t
678 WHERE parent IS NULL
679 UNION ALL
680 SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn
681 FROM q
682 JOIN t
683 ON t.parent = q.id
684 )
685 SELECT *
686 FROM q;
687} {1 {cannot use window functions in recursive queries}}
688do_execsql_test 15.1 {
689 DROP TABLE IF EXISTS t1;
690 DROP TABLE IF EXISTS t2;
691 CREATE TABLE t1(x);
692 INSERT INTO t1 VALUES('a'), ('b'), ('c');
693 CREATE TABLE t2(a, b);
694 INSERT INTO t2 VALUES('X', 1), ('X', 2), ('Y', 2), ('Y', 3);
695 SELECT x, (
696 SELECT sum(b)
697 OVER (PARTITION BY a ROWS BETWEEN UNBOUNDED PRECEDING
698 AND UNBOUNDED FOLLOWING)
699 FROM t2 WHERE b<x
700 ) FROM t1;
701} {a 3 b 3 c 3}
702
dan97c8cb32019-01-01 18:00:17 +0000703do_execsql_test 15.2 {
704 SELECT(
705 WITH c AS(
706 VALUES(1)
707 ) SELECT '' FROM c,c
708 ) x WHERE x+x;
709} {}
710
dand9995032019-01-23 16:59:24 +0000711#-------------------------------------------------------------------------
712
713do_execsql_test 16.0 {
714 CREATE TABLE t7(a,b);
715 INSERT INTO t7(rowid, a, b) VALUES
716 (1, 1, 3),
717 (2, 10, 4),
718 (3, 100, 2);
719}
720
721do_execsql_test 16.1 {
722 SELECT rowid, sum(a) OVER (PARTITION BY b IN (SELECT rowid FROM t7)) FROM t7;
723} {
724 2 10
725 1 101
726 3 101
727}
728
729do_execsql_test 16.2 {
730 SELECT rowid, sum(a) OVER w1 FROM t7
731 WINDOW w1 AS (PARTITION BY b IN (SELECT rowid FROM t7));
732} {
733 2 10
734 1 101
735 3 101
736}
737
dane7c9ca42019-02-16 17:27:51 +0000738#-------------------------------------------------------------------------
danf030b372019-02-22 19:24:16 +0000739do_execsql_test 17.0 {
740 CREATE TABLE t8(a);
741 INSERT INTO t8 VALUES(1), (2), (3);
742}
743
744do_execsql_test 17.1 {
745 SELECT +sum(0) OVER () ORDER BY +sum(0) OVER ();
746} {0}
747
748do_execsql_test 17.2 {
749 select +sum(a) OVER () FROM t8 ORDER BY +sum(a) OVER () DESC;
750} {6 6 6}
751
752do_execsql_test 17.3 {
753 SELECT 10+sum(a) OVER (ORDER BY a)
754 FROM t8
755 ORDER BY 10+sum(a) OVER (ORDER BY a) DESC;
756} {16 13 11}
757
dan9e244392019-03-12 09:49:10 +0000758
dandb7d8952019-03-13 17:31:20 +0000759#-------------------------------------------------------------------------
dane7c9ca42019-02-16 17:27:51 +0000760# Test error cases from chaining window definitions.
761#
762reset_db
dan4e72e622019-03-04 21:08:53 +0000763do_execsql_test 18.0 {
dane7c9ca42019-02-16 17:27:51 +0000764 DROP TABLE IF EXISTS t1;
765 CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d INTEGER);
766 INSERT INTO t1 VALUES(1, 'odd', 'one', 1);
767 INSERT INTO t1 VALUES(2, 'even', 'two', 2);
768 INSERT INTO t1 VALUES(3, 'odd', 'three', 3);
769 INSERT INTO t1 VALUES(4, 'even', 'four', 4);
770 INSERT INTO t1 VALUES(5, 'odd', 'five', 5);
771 INSERT INTO t1 VALUES(6, 'even', 'six', 6);
772}
773
774foreach {tn sql error} {
775 1 {
776 SELECT c, sum(d) OVER win2 FROM t1
777 WINDOW win1 AS (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING),
778 win2 AS (win1 ORDER BY b)
779 } {cannot override frame specification of window: win1}
780
781 2 {
782 SELECT c, sum(d) OVER win2 FROM t1
783 WINDOW win1 AS (),
784 win2 AS (win4 ORDER BY b)
785 } {no such window: win4}
786
787 3 {
788 SELECT c, sum(d) OVER win2 FROM t1
789 WINDOW win1 AS (),
790 win2 AS (win1 PARTITION BY d)
791 } {cannot override PARTITION clause of window: win1}
792
793 4 {
794 SELECT c, sum(d) OVER win2 FROM t1
795 WINDOW win1 AS (ORDER BY b),
796 win2 AS (win1 ORDER BY d)
797 } {cannot override ORDER BY clause of window: win1}
798} {
dan4e72e622019-03-04 21:08:53 +0000799 do_catchsql_test 18.1.$tn $sql [list 1 $error]
dane7c9ca42019-02-16 17:27:51 +0000800}
801
802foreach {tn sql error} {
803 1 {
804 SELECT c, sum(d) OVER (win1 ORDER BY b) FROM t1
805 WINDOW win1 AS (ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
806 } {cannot override frame specification of window: win1}
807
808 2 {
809 SELECT c, sum(d) OVER (win4 ORDER BY b) FROM t1
810 WINDOW win1 AS ()
811 } {no such window: win4}
812
813 3 {
814 SELECT c, sum(d) OVER (win1 PARTITION BY d) FROM t1
815 WINDOW win1 AS ()
816 } {cannot override PARTITION clause of window: win1}
817
818 4 {
819 SELECT c, sum(d) OVER (win1 ORDER BY d) FROM t1
820 WINDOW win1 AS (ORDER BY b)
821 } {cannot override ORDER BY clause of window: win1}
822} {
dan4e72e622019-03-04 21:08:53 +0000823 do_catchsql_test 18.2.$tn $sql [list 1 $error]
dane7c9ca42019-02-16 17:27:51 +0000824}
825
dan4e72e622019-03-04 21:08:53 +0000826do_execsql_test 18.3.1 {
dane7c9ca42019-02-16 17:27:51 +0000827 SELECT group_concat(c, '.') OVER (PARTITION BY b ORDER BY c)
828 FROM t1
829} {four four.six four.six.two five five.one five.one.three}
830
dan4e72e622019-03-04 21:08:53 +0000831do_execsql_test 18.3.2 {
dane7c9ca42019-02-16 17:27:51 +0000832 SELECT group_concat(c, '.') OVER (win1 ORDER BY c)
833 FROM t1
834 WINDOW win1 AS (PARTITION BY b)
835} {four four.six four.six.two five five.one five.one.three}
836
dan4e72e622019-03-04 21:08:53 +0000837do_execsql_test 18.3.3 {
dane7c9ca42019-02-16 17:27:51 +0000838 SELECT group_concat(c, '.') OVER win2
839 FROM t1
840 WINDOW win1 AS (PARTITION BY b),
841 win2 AS (win1 ORDER BY c)
842} {four four.six four.six.two five five.one five.one.three}
843
dan4e72e622019-03-04 21:08:53 +0000844do_execsql_test 18.3.4 {
dane7c9ca42019-02-16 17:27:51 +0000845 SELECT group_concat(c, '.') OVER (win2)
846 FROM t1
847 WINDOW win1 AS (PARTITION BY b),
848 win2 AS (win1 ORDER BY c)
849} {four four.six four.six.two five five.one five.one.three}
850
dan4e72e622019-03-04 21:08:53 +0000851do_execsql_test 18.3.5 {
dane7c9ca42019-02-16 17:27:51 +0000852 SELECT group_concat(c, '.') OVER win5
853 FROM t1
854 WINDOW win1 AS (PARTITION BY b),
855 win2 AS (win1),
856 win3 AS (win2),
857 win4 AS (win3),
858 win5 AS (win4 ORDER BY c)
859} {four four.six four.six.two five five.one five.one.three}
dand9995032019-01-23 16:59:24 +0000860
dan1e7cb192019-03-16 20:29:54 +0000861#-------------------------------------------------------------------------
862# Test RANGE <expr> PRECEDING/FOLLOWING when there are string, blob
863# and NULL values in the dataset.
864#
865reset_db
866do_execsql_test 19.0 {
867 CREATE TABLE t1(a, b);
868 INSERT INTO t1 VALUES
869 (1, 1), (2, 2), (3, 3), (4, 4), (5, 5),
870 ('a', 6), ('b', 7), ('c', 8), ('d', 9), ('e', 10);
871}
872do_execsql_test 19.1 {
873 SELECT a, sum(b) OVER (ORDER BY a) FROM t1;
874} {1 1 2 3 3 6 4 10 5 15 a 21 b 28 c 36 d 45 e 55}
875
876do_execsql_test 19.2.1 {
877 SELECT a, sum(b) OVER (
878 ORDER BY a RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
879 ) FROM t1;
880} {1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
881do_execsql_test 19.2.2 {
882 SELECT a, sum(b) OVER (
883 ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
884 ) FROM t1 ORDER BY a ASC;
885} {1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
886
887do_execsql_test 19.3.1 {
888 SELECT a, sum(b) OVER (
889 ORDER BY a RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING
890 ) FROM t1;
891} {1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
892do_execsql_test 19.3.2 {
893 SELECT a, sum(b) OVER (
894 ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 2 FOLLOWING
895 ) FROM t1 ORDER BY a ASC;
896} {1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
897
898
899reset_db
900do_execsql_test 20.0 {
901 CREATE TABLE t1(a, b);
902 INSERT INTO t1 VALUES
903 (NULL, 100), (NULL, 100),
904 (1, 1), (2, 2), (3, 3), (4, 4), (5, 5),
905 ('a', 6), ('b', 7), ('c', 8), ('d', 9), ('e', 10);
906}
907do_execsql_test 20.1 {
908 SELECT a, sum(b) OVER (ORDER BY a) FROM t1;
909} {
910 {} 200 {} 200 1 201 2 203 3 206 4 210 5 215
911 a 221 b 228 c 236 d 245 e 255
912}
913
914do_execsql_test 20.2.1 {
915 SELECT a, sum(b) OVER (
916 ORDER BY a RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
917 ) FROM t1;
918} {{} 200 {} 200 1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
919do_execsql_test 20.2.2 {
920 SELECT a, sum(b) OVER (
921 ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
922 ) FROM t1 ORDER BY a ASC;
923} {{} 200 {} 200 1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
924
925do_execsql_test 20.3.1 {
926 SELECT a, sum(b) OVER (
927 ORDER BY a RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING
928 ) FROM t1;
929} {{} 200 {} 200 1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
930do_execsql_test 20.3.2 {
931 SELECT a, sum(b) OVER (
932 ORDER BY a DESC RANGE BETWEEN 1 PRECEDING AND 2 FOLLOWING
933 ) FROM t1 ORDER BY a ASC;
934} {{} 200 {} 200 1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
935
danced89122019-03-19 06:40:29 +0000936#-------------------------------------------------------------------------
937do_execsql_test 21.0 {
938 CREATE TABLE keyword_tab(
939 current, exclude, filter, following, groups, no, others, over,
940 partition, preceding, range, ties, unbounded, window
941 );
942}
943do_execsql_test 21.1 {
944 SELECT
945 current, exclude, filter, following, groups, no, others, over,
946 partition, preceding, range, ties, unbounded, window
947 FROM keyword_tab
948}
949
dane5166e02019-03-19 11:56:39 +0000950#-------------------------------------------------------------------------
951foreach {tn expr err} {
952 1 4.5 0
953 2 NULL 1
954 3 0.0 0
955 4 0.1 0
956 5 -0.1 1
957 6 '' 1
958 7 '2.0' 0
959 8 '2.0x' 1
960 9 x'1234' 1
961 10 '1.2' 0
962} {
963 set res {0 1}
964 if {$err} {set res {1 {frame starting offset must be a non-negative number}} }
965 do_catchsql_test 22.$tn.1 "
966 WITH a(x, y) AS ( VALUES(1, 2) )
967 SELECT sum(x) OVER (
968 ORDER BY y RANGE BETWEEN $expr PRECEDING AND UNBOUNDED FOLLOWING
969 ) FROM a
970 " $res
971
972 set res {0 1}
973 if {$err} {set res {1 {frame ending offset must be a non-negative number}} }
974 do_catchsql_test 22.$tn.2 "
975 WITH a(x, y) AS ( VALUES(1, 2) )
976 SELECT sum(x) OVER (
977 ORDER BY y RANGE BETWEEN UNBOUNDED PRECEDING AND $expr FOLLOWING
978 ) FROM a
979 " $res
980}
981
dan8eff0cc2019-03-19 17:45:31 +0000982#-------------------------------------------------------------------------
983reset_db
984do_execsql_test 23.0 {
985 CREATE TABLE t5(a, b, c);
986 CREATE INDEX t5ab ON t5(a, b);
987}
988
989proc do_ordercount_test {tn sql nOrderBy} {
990 set plan [execsql "EXPLAIN QUERY PLAN $sql"]
991 uplevel [list do_test $tn [list regexp -all ORDER $plan] $nOrderBy]
992}
993
994do_ordercount_test 23.1 {
995 SELECT
996 sum(c) OVER (ORDER BY a, b),
997 sum(c) OVER (PARTITION BY a ORDER BY b)
998 FROM t5
999} 0
1000
1001do_ordercount_test 23.2 {
1002 SELECT
1003 sum(c) OVER (ORDER BY b, a),
1004 sum(c) OVER (PARTITION BY b ORDER BY a)
1005 FROM t5
1006} 1
1007
1008do_ordercount_test 23.3 {
1009 SELECT
1010 sum(c) OVER (ORDER BY b, a),
1011 sum(c) OVER (ORDER BY c, b)
1012 FROM t5
1013} 2
1014
1015do_ordercount_test 23.4 {
1016 SELECT
1017 sum(c) OVER (ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
1018 sum(c) OVER (ORDER BY b RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
1019 sum(c) OVER (ORDER BY b GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
1020 FROM t5
1021} 1
1022
1023do_ordercount_test 23.5 {
1024 SELECT
1025 sum(c) OVER (ORDER BY b+1 ROWS UNBOUNDED PRECEDING),
1026 sum(c) OVER (ORDER BY b+1 RANGE UNBOUNDED PRECEDING),
1027 sum(c) OVER (ORDER BY b+1 GROUPS UNBOUNDED PRECEDING)
1028 FROM t5
1029} 1
1030
1031do_ordercount_test 23.6 {
1032 SELECT
1033 sum(c) OVER (ORDER BY b+1 ROWS UNBOUNDED PRECEDING),
1034 sum(c) OVER (ORDER BY b+2 RANGE UNBOUNDED PRECEDING),
1035 sum(c) OVER (ORDER BY b+3 GROUPS UNBOUNDED PRECEDING)
1036 FROM t5
1037} 3
1038
danc7694a62019-03-21 13:51:09 +00001039do_execsql_test 24.1 {
1040 SELECT sum(44) OVER ()
1041} {44}
1042
1043do_execsql_test 24.2 {
1044 SELECT lead(44) OVER ()
1045} {{}}
1046
dan781b7ac2019-03-22 13:56:49 +00001047#-------------------------------------------------------------------------
1048#
1049reset_db
1050do_execsql_test 25.0 {
1051 CREATE TABLE t1 ( t1_id INTEGER PRIMARY KEY );
1052 CREATE TABLE t2 ( t2_id INTEGER PRIMARY KEY );
1053 CREATE TABLE t3 ( t3_id INTEGER PRIMARY KEY );
1054
1055 INSERT INTO t1 VALUES(1), (3), (5);
1056 INSERT INTO t2 VALUES (3), (5);
1057 INSERT INTO t3 VALUES(10), (11), (12);
1058}
1059
1060do_execsql_test 25.1 {
1061 SELECT t1.* FROM t1, t2 WHERE
1062 t1_id=t2_id AND t1_id IN (
1063 SELECT t1_id + row_number() OVER ( ORDER BY t1_id ) FROM t3
1064 )
1065}
1066
1067do_execsql_test 25.2 {
1068 SELECT t1.* FROM t1, t2 WHERE
1069 t1_id=t2_id AND t1_id IN (
1070 SELECT row_number() OVER ( ORDER BY t1_id ) FROM t3
1071 )
1072} {3}
1073
1074#-------------------------------------------------------------------------
1075reset_db
1076do_execsql_test 26.0 {
1077 CREATE TABLE t1(x);
1078 CREATE TABLE t2(c);
1079}
1080
1081do_execsql_test 26.1 {
1082 SELECT ( SELECT row_number() OVER () FROM ( SELECT c FROM t1 ) ) FROM t2
1083} {}
1084
1085do_execsql_test 26.2 {
1086 INSERT INTO t1 VALUES(1), (2), (3), (4);
1087 INSERT INTO t2 VALUES(2), (6), (8), (4);
1088 SELECT c, c IN (
1089 SELECT row_number() OVER () FROM ( SELECT c FROM t1 )
1090 ) FROM t2
1091} {2 1 6 0 8 0 4 1}
1092
1093do_execsql_test 26.3 {
1094 DELETE FROM t1;
1095 DELETE FROM t2;
1096
1097 INSERT INTO t2 VALUES(1), (2), (3), (4);
1098 INSERT INTO t1 VALUES(1), (1), (2), (3), (3), (3), (3), (4), (4);
1099
1100 SELECT c, c IN (
1101 SELECT row_number() OVER () FROM ( SELECT 1 FROM t1 WHERE x=c )
1102 ) FROM t2
1103} {1 1 2 0 3 1 4 0}
1104
danafb3f3c2019-04-01 18:43:09 +00001105#-------------------------------------------------------------------------
1106reset_db
1107do_execsql_test 27.0 {
1108 CREATE TABLE t1(x);
1109 INSERT INTO t1 VALUES(NULL), (1), (2), (3), (4), (5);
1110}
1111do_execsql_test 27.1 {
1112 SELECT min(x) FROM t1;
1113} {1}
1114do_execsql_test 27.2 {
1115 SELECT min(x) OVER win FROM t1
1116 WINDOW win AS (ORDER BY rowid ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING)
1117} {1 1 1 2 3 4}
dan781b7ac2019-03-22 13:56:49 +00001118
dan3f49c322019-04-03 16:27:44 +00001119#-------------------------------------------------------------------------
1120
1121reset_db
1122do_execsql_test 28.1.1 {
1123 CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), c CHAR(2), d ANY);
1124 INSERT INTO t1 VALUES (3, 'C', 'cc', 1.0);
1125 INSERT INTO t1 VALUES (13,'M', 'cc', NULL);
1126}
1127
1128do_execsql_test 28.1.2 {
1129 SELECT group_concat(b,'') OVER w1 FROM t1
1130 WINDOW w1 AS (ORDER BY a RANGE BETWEEN 3 PRECEDING AND 1 PRECEDING)
1131} {
1132 {} {}
1133}
1134
1135do_execsql_test 28.2.1 {
1136 CREATE TABLE t2(a TEXT, b INTEGER);
1137 INSERT INTO t2 VALUES('A', NULL);
1138 INSERT INTO t2 VALUES('B', NULL);
1139}
1140
1141do_execsql_test 28.2.1 {
1142 DROP TABLE IF EXISTS t1;
1143 CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), c CHAR(2), d ANY);
1144 INSERT INTO t1 VALUES
1145 (10,'J', 'cc', NULL),
1146 (11,'K', 'cc', 'xyz'),
1147 (13,'M', 'cc', NULL);
1148}
1149
1150do_execsql_test 28.2.2 {
1151 SELECT a, b, c, quote(d), group_concat(b,'') OVER w1, '|' FROM t1
1152 WINDOW w1 AS
1153 (ORDER BY d DESC RANGE BETWEEN 7.0 PRECEDING AND 2.5 PRECEDING)
1154 ORDER BY c, d, a;
1155} {
1156 10 J cc NULL JM |
1157 13 M cc NULL JM |
1158 11 K cc 'xyz' K |
1159}
1160
1161#-------------------------------------------------------------------------
1162reset_db
1163
1164do_execsql_test 29.1 {
1165 DROP TABLE IF EXISTS t1;
1166 CREATE TABLE t1(a INTEGER PRIMARY KEY, b CHAR(1), c CHAR(2), d ANY);
1167 INSERT INTO t1 VALUES
1168 (1, 'A', 'aa', 2.5),
1169 (2, 'B', 'bb', 3.75),
1170 (3, 'C', 'cc', 1.0),
1171 (4, 'D', 'cc', 8.25),
1172 (5, 'E', 'bb', 6.5),
1173 (6, 'F', 'aa', 6.5),
1174 (7, 'G', 'aa', 6.0),
1175 (8, 'H', 'bb', 9.0),
1176 (9, 'I', 'aa', 3.75),
1177 (10,'J', 'cc', NULL),
1178 (11,'K', 'cc', 'xyz'),
1179 (12,'L', 'cc', 'xyZ'),
1180 (13,'M', 'cc', NULL);
1181}
1182
1183do_execsql_test 29.2 {
1184 SELECT a, b, c, quote(d), group_concat(b,'') OVER w1, '|' FROM t1
1185 WINDOW w1 AS
1186 (PARTITION BY c ORDER BY d DESC
1187 RANGE BETWEEN 7.0 PRECEDING AND 2.5 PRECEDING)
1188 ORDER BY c, d, a;
1189} {
1190 1 A aa 2.5 FG |
1191 9 I aa 3.75 F |
1192 7 G aa 6 {} |
1193 6 F aa 6.5 {} |
1194 2 B bb 3.75 HE |
1195 5 E bb 6.5 H |
1196 8 H bb 9 {} |
1197 10 J cc NULL JM |
1198 13 M cc NULL JM |
1199 3 C cc 1 {} |
1200 4 D cc 8.25 {} |
1201 12 L cc 'xyZ' L |
1202 11 K cc 'xyz' K |
1203}
danc7694a62019-03-21 13:51:09 +00001204
drhb555b082019-07-19 01:11:27 +00001205# 2019-07-18
1206# Check-in [7ef7b23cbb1b9ace] (which was itself a fix for ticket
1207# https://www.sqlite.org/src/info/1be72aab9) introduced a new problem
1208# if the LHS of a BETWEEN operator is a WINDOW function. The problem
1209# was found by (the recently enhanced) dbsqlfuzz.
1210#
1211do_execsql_test 30.0 {
1212 DROP TABLE IF EXISTS t1;
1213 CREATE TABLE t1(a, b, c);
1214 INSERT INTO t1 VALUES('BB','aa',399);
1215 SELECT
1216 count () OVER win1 NOT BETWEEN 'a' AND 'mmm',
1217 count () OVER win3
1218 FROM t1
1219 WINDOW win1 AS (ORDER BY a GROUPS BETWEEN 4 PRECEDING AND 1 FOLLOWING
1220 EXCLUDE CURRENT ROW),
1221 win2 AS (PARTITION BY b ORDER BY a),
1222 win3 AS (win2 RANGE BETWEEN 5.2 PRECEDING AND true PRECEDING );
1223} {1 1}
1224
dan3703edf2019-10-10 15:17:09 +00001225#-------------------------------------------------------------------------
1226reset_db
1227do_execsql_test 31.1 {
1228 CREATE TABLE t1(a, b);
1229 CREATE TABLE t2(c, d);
1230 CREATE TABLE t3(e, f);
1231
1232 INSERT INTO t1 VALUES(1, 1);
1233 INSERT INTO t2 VALUES(1, 1);
1234 INSERT INTO t3 VALUES(1, 1);
1235}
1236
1237do_execsql_test 31.2 {
1238 SELECT d IN (SELECT sum(c) OVER (ORDER BY e+c) FROM t3) FROM (
1239 SELECT * FROM t2
1240 );
1241} {1}
1242
1243do_execsql_test 31.3 {
1244 SELECT d IN (SELECT sum(c) OVER (PARTITION BY d ORDER BY e+c) FROM t3) FROM (
1245 SELECT * FROM t2
1246 );
1247} {1}
1248
1249do_catchsql_test 31.3 {
1250 SELECT d IN (
1251 SELECT sum(c) OVER ( ROWS BETWEEN d FOLLOWING AND UNBOUNDED FOLLOWING)
1252 FROM t3
1253 )
1254 FROM (
1255 SELECT * FROM t2
1256 );
1257} {1 {frame starting offset must be a non-negative integer}}
1258
1259do_catchsql_test 31.3 {
1260 SELECT d IN (
1261 SELECT sum(c) OVER ( ROWS BETWEEN CURRENT ROW AND c FOLLOWING)
1262 FROM t3
1263 )
1264 FROM (
1265 SELECT * FROM t2
1266 );
1267} {1 {frame ending offset must be a non-negative integer}}
1268
drh47bcc342019-11-16 11:33:39 +00001269# 2019-11-16 chromium issue 1025467
1270db close
1271sqlite3 db :memory:
1272do_catchsql_test 32.10 {
1273 CREATE VIEW a AS SELECT NULL INTERSECT SELECT NULL ORDER BY s() OVER R;
1274 CREATE TABLE a0 AS SELECT 0;
1275 ALTER TABLE a0 RENAME TO S;
1276} {1 {error in view a: 1st ORDER BY term does not match any column in the result set}}
1277
dane59c5622019-11-22 10:14:01 +00001278reset_db
1279do_execsql_test 33.1 {
1280 CREATE TABLE t1(aa, bb);
1281 INSERT INTO t1 VALUES(1, 2);
1282 INSERT INTO t1 VALUES(5, 6);
1283 CREATE TABLE t2(x);
1284 INSERT INTO t2 VALUES(1);
1285}
1286do_execsql_test 33.2 {
1287 SELECT (SELECT DISTINCT sum(aa) OVER() FROM t1 ORDER BY 1), x FROM t2
1288 ORDER BY 1;
1289} {6 1}
1290
dan62be2dc2019-11-23 15:10:28 +00001291reset_db
1292do_execsql_test 34.1 {
1293 CREATE TABLE t1(a,b,c);
1294}
1295do_execsql_test 34.2 {
1296 SELECT avg(a) OVER (
1297 ORDER BY (SELECT sum(b) OVER ()
1298 FROM t1 ORDER BY (
1299 SELECT total(d) OVER (ORDER BY c)
1300 FROM (SELECT 1 AS d) ORDER BY 1
1301 )
1302 )
1303 )
1304 FROM t1;
1305}
1306
danfcc057d2019-12-04 01:42:07 +00001307#-------------------------------------------------------------------------
1308reset_db
1309do_catchsql_test 35.0 {
1310 SELECT * WINDOW f AS () ORDER BY name COLLATE nocase;
1311} {1 {no tables specified}}
1312
1313do_catchsql_test 35.1 {
1314 VALUES(1) INTERSECT SELECT * WINDOW f AS () ORDER BY x COLLATE nocase;
1315} {1 {no tables specified}}
1316
1317do_execsql_test 35.2 {
1318 CREATE TABLE t1(x);
1319 INSERT INTO t1 VALUES(1), (2), (3);
1320 VALUES(1) INTERSECT
1321 SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
1322} {1}
1323
1324do_execsql_test 35.3 {
1325 VALUES(8) EXCEPT
1326 SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
1327} {8}
1328
1329do_execsql_test 35.4 {
1330 VALUES(1) UNION
1331 SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
1332} {1 3 6}
1333
drh29cdbad2019-12-07 13:42:47 +00001334# 2019-12-07 gramfuzz find
1335#
1336do_execsql_test 36.10 {
1337 VALUES(count(*)OVER());
1338} {1}
1339do_execsql_test 36.20 {
1340 VALUES(count(*)OVER()),(2);
1341} {1 2}
1342do_execsql_test 36.30 {
1343 VALUES(2),(count(*)OVER());
1344} {2 1}
1345do_execsql_test 36.40 {
1346 VALUES(2),(3),(count(*)OVER()),(4),(5);
1347} {2 3 1 4 5}
1348
drh8c72afa2019-12-18 09:17:55 +00001349# 2019-12-17 crash test case found by Yongheng and Rui
1350# See check-in 1ca0bd982ab1183b
1351#
1352reset_db
1353do_execsql_test 37.10 {
1354 CREATE TABLE t0(a UNIQUE, b PRIMARY KEY);
1355 CREATE VIEW v0(c) AS SELECT max((SELECT count(a)OVER(ORDER BY 1))) FROM t0;
1356 SELECT c FROM v0 WHERE c BETWEEN 10 AND 20;
1357} {}
1358do_execsql_test 37.20 {
1359 DROP VIEW v0;
1360 CREATE VIEW v0(c) AS SELECT max((SELECT count(a)OVER(ORDER BY 1234))) FROM t0;
1361 SELECT c FROM v0 WHERE c BETWEEN -10 AND 20;
1362} {}
1363
drha9ebfe22019-12-25 23:54:21 +00001364# 2019-12-20 mrigger reported problem with a FILTER clause on an aggregate
drh8cc8fea2019-12-20 15:35:56 +00001365# in a join.
1366#
1367reset_db
dan5e484cb2019-12-27 08:57:08 +00001368do_catchsql_test 38.10 {
drh8cc8fea2019-12-20 15:35:56 +00001369 CREATE TABLE t0(c0);
1370 CREATE TABLE t1(c0, c1 UNIQUE);
1371 INSERT INTO t0(c0) VALUES(1);
1372 INSERT INTO t1(c0,c1) VALUES(2,3);
1373 SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(0) FILTER(WHERE t1.c1));
dan5e484cb2019-12-27 08:57:08 +00001374} {1 {misuse of aggregate: AVG()}}
drh8cc8fea2019-12-20 15:35:56 +00001375do_execsql_test 38.20 {
1376 SELECT COUNT(*), AVG(1) FILTER(WHERE t1.c1) FROM t0, t1;
1377} {1 1.0}
dan5e484cb2019-12-27 08:57:08 +00001378do_catchsql_test 38.30 {
drh8cc8fea2019-12-20 15:35:56 +00001379 SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(1) FILTER(WHERE t1.c1));
dan5e484cb2019-12-27 08:57:08 +00001380} {1 {misuse of aggregate: AVG()}}
drh29cdbad2019-12-07 13:42:47 +00001381
dan2811ea62019-12-23 14:20:46 +00001382reset_db
1383do_execsql_test 39.1 {
1384 CREATE TABLE t0(c0 UNIQUE);
1385}
1386do_execsql_test 39.2 {
1387 SELECT FIRST_VALUE(0) OVER();
1388} {0}
1389do_execsql_test 39.3 {
1390 SELECT * FROM t0 WHERE(c0, 0) IN(SELECT FIRST_VALUE(0) OVER(), 0);
1391}
dan1d24a532019-12-23 15:17:11 +00001392do_execsql_test 39.4 {
1393 SELECT * FROM t0 WHERE (t0.c0, 1) IN(SELECT NTILE(1) OVER(), 0 FROM t0);
1394}
1395
drh6473ba92019-12-27 18:15:04 +00001396ifcapable rtree {
1397 # 2019-12-25 ticket d87336c81c7d0873
1398 #
1399 reset_db
1400 do_catchsql_test 40.1 {
1401 CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2);
1402 SELECT * FROM t0
1403 WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0);
1404 } {0 {}}
1405}
drha9ebfe22019-12-25 23:54:21 +00001406
dand8d2fb92019-12-27 15:31:47 +00001407#-------------------------------------------------------------------------
1408reset_db
1409do_execsql_test 41.1 {
1410 CREATE TABLE t1(a, b, c);
1411 INSERT INTO t1 VALUES(NULL,'bb',355);
1412 INSERT INTO t1 VALUES('CC','aa',158);
1413 INSERT INTO t1 VALUES('GG','bb',929);
1414 INSERT INTO t1 VALUES('FF','Rb',574);
1415}
1416
1417do_execsql_test 41.2 {
1418 SELECT min(c) OVER (
1419 ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
1420 ) FROM t1
1421} {355 158 574 929}
1422
1423do_execsql_test 41.2 {
1424 SELECT min(c) OVER (
1425 ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
1426 ) << 100 FROM t1
1427} {0 0 0 0}
1428
1429do_execsql_test 41.3 {
1430 SELECT
1431 min(c) OVER win3 << first_value(c) OVER win3,
1432 min(c) OVER win3 << first_value(c) OVER win3
1433 FROM t1
1434 WINDOW win3 AS (
1435 PARTITION BY 6 ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
1436 );
1437} {0 0 0 0 0 0 0 0}
dan2811ea62019-12-23 14:20:46 +00001438
dan43170432019-12-27 16:25:56 +00001439#-------------------------------------------------------------------------
1440reset_db
1441do_execsql_test 42.1 {
1442 CREATE TABLE t1(a, b, c);
1443 INSERT INTO t1 VALUES(1, 1, 1);
1444 INSERT INTO t1 VALUES(2, 2, 2);
1445}
1446do_execsql_test 42.2 {
1447 SELECT * FROM t1 WHERE (0, 0) IN ( SELECT count(*), 0 FROM t1 )
1448} {}
1449do_execsql_test 42.3 {
1450 SELECT * FROM t1 WHERE (2, 0) IN ( SELECT count(*), 0 FROM t1 )
1451} {1 1 1 2 2 2}
1452
1453do_execsql_test 42.3 {
1454 SELECT count(*), max(a) OVER () FROM t1 GROUP BY c;
1455} {1 2 1 2}
1456
1457do_execsql_test 42.4 {
1458 SELECT sum(a), max(b) OVER () FROM t1;
1459} {3 1}
1460
1461do_execsql_test 42.5 {
1462 CREATE TABLE t2(a, b);
1463 INSERT INTO t2 VALUES('a', 1);
1464 INSERT INTO t2 VALUES('a', 2);
1465 INSERT INTO t2 VALUES('a', 3);
1466 INSERT INTO t2 VALUES('b', 4);
1467 INSERT INTO t2 VALUES('b', 5);
1468 INSERT INTO t2 VALUES('b', 6);
1469}
1470
1471do_execsql_test 42.6 {
1472 SELECT a, sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2 GROUP BY a;
1473} {a 6 6 b 15 21}
1474
1475do_execsql_test 42.7 {
1476 SELECT sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2;
1477} {21 21}
1478
dane3735bf2019-12-27 19:46:07 +00001479#-------------------------------------------------------------------------
1480reset_db
1481do_execsql_test 43.1.1 {
1482 CREATE TABLE t1(x INTEGER PRIMARY KEY);
1483 INSERT INTO t1 VALUES (10);
1484}
1485do_catchsql_test 43.1.2 {
1486 SELECT count() OVER() AS m FROM t1 ORDER BY (SELECT m);
1487} {1 {misuse of aliased window function m}}
1488
1489reset_db
1490do_execsql_test 43.2.1 {
1491 CREATE TABLE t1(a INTEGER PRIMARY KEY, b INTEGER);
1492 INSERT INTO t1(a, b) VALUES(1, 10); -- 10
1493 INSERT INTO t1(a, b) VALUES(2, 15); -- 25
1494 INSERT INTO t1(a, b) VALUES(3, -5); -- 20
1495 INSERT INTO t1(a, b) VALUES(4, -5); -- 15
1496 INSERT INTO t1(a, b) VALUES(5, 20); -- 35
1497 INSERT INTO t1(a, b) VALUES(6, -11); -- 24
1498}
1499
1500do_execsql_test 43.2.2 {
1501 SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY 2
1502} {
1503 1 10 4 15 3 20 6 24 2 25 5 35
1504}
1505
1506do_execsql_test 43.2.3 {
1507 SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY abc
1508} {
1509 1 10 4 15 3 20 6 24 2 25 5 35
1510}
1511
1512do_execsql_test 43.2.4 {
1513 SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY abc+5
1514} {
1515 1 10 4 15 3 20 6 24 2 25 5 35
1516}
1517
1518do_catchsql_test 43.2.5 {
1519 SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY (SELECT abc)
1520} {1 {misuse of aliased window function abc}}
1521
1522do_catchsql_test 43.2.6 {
1523 SELECT a, 1+sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY (SELECT abc)
1524} {1 {misuse of aliased window function abc}}
1525
danb4b36302019-12-27 20:06:32 +00001526#-------------------------------------------------------------------------
1527reset_db
1528do_execsql_test 44.1 {
1529 CREATE TABLE t0(c0);
1530}
1531
1532do_catchsql_test 44.2.1 {
1533 SELECT ntile(0) OVER ();
1534} {1 {argument of ntile must be a positive integer}}
1535do_catchsql_test 44.2.2 {
1536 SELECT (0, 0) IN(SELECT MIN(c0), NTILE(0) OVER()) FROM t0;
1537} {1 {argument of ntile must be a positive integer}}
1538
1539do_execsql_test 44.3.1 {
1540 SELECT ntile(1) OVER ();
1541} {1}
1542do_execsql_test 44.3.2 {
1543 SELECT (0, 0) IN(SELECT MIN(c0), NTILE(1) OVER()) FROM t0;
1544} {0}
1545
1546do_execsql_test 44.4.2 {
1547 INSERT INTO t0 VALUES(2), (1), (0);
1548 SELECT (0, 1) IN(SELECT MIN(c0), NTILE(1) OVER()) FROM t0;
1549} {1}
1550
dan997d7432019-12-28 18:25:51 +00001551#-------------------------------------------------------------------------
1552reset_db
1553do_execsql_test 45.1 {
1554 CREATE TABLE t0(x);
1555 CREATE TABLE t1(a);
1556 INSERT INTO t1 VALUES(1000);
1557 INSERT INTO t1 VALUES(1000);
1558 INSERT INTO t0 VALUES(10000);
1559}
1560do_execsql_test 45.2 {
1561 SELECT * FROM (
1562 SELECT sum (a) OVER() FROM t1 UNION ALL SELECT x FROM t0
1563 );
1564} {2000 2000 10000}
1565
dan4ea562e2020-01-01 20:17:15 +00001566#-------------------------------------------------------------------------
1567reset_db
1568do_execsql_test 46.1 {
1569 CREATE TABLE t1 (a);
1570 CREATE INDEX i1 ON t1(a);
1571
1572 INSERT INTO t1 VALUES (10);
1573}
1574
1575do_execsql_test 46.2 {
1576 SELECT (SELECT sum(a) OVER(ORDER BY a)) FROM t1
1577} 10
1578
1579do_execsql_test 46.3 {
1580 SELECT * FROM t1 WHERE (SELECT sum(a) OVER(ORDER BY a));
1581} 10
1582
1583do_execsql_test 46.4 {
1584 SELECT * FROM t1 NATURAL JOIN t1
1585 WHERE a=1
1586 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)
1587} 10
1588
danaa328b62020-01-03 13:55:14 +00001589#-------------------------------------------------------------------------
1590reset_db
1591do_execsql_test 47.0 {
1592 CREATE TABLE t1(
1593 a,
1594 e,
1595 f,
1596 g UNIQUE,
1597 h UNIQUE
1598 );
1599}
1600
1601do_execsql_test 47.1 {
1602 CREATE VIEW t2(k) AS
1603 SELECT e FROM t1 WHERE g = 'abc' OR h BETWEEN 10 AND f;
1604}
1605
1606do_catchsql_test 47.2 {
1607 SELECT 234 FROM t2
1608 WHERE k=1
1609 OR (SELECT k FROM t2 WHERE (SELECT sum(a) OVER() FROM t1 GROUP BY 1));
1610} {1 {misuse of window function sum()}}
1611
danfbb6e9f2020-01-09 20:11:29 +00001612#-------------------------------------------------------------------------
1613reset_db
1614do_execsql_test 48.0 {
1615 CREATE TABLE t1(a);
1616 INSERT INTO t1 VALUES(1);
1617 INSERT INTO t1 VALUES(2);
1618 INSERT INTO t1 VALUES(3);
1619 SELECT (SELECT max(x)OVER(ORDER BY x) + min(x)OVER(ORDER BY x))
1620 FROM (SELECT (SELECT sum(a) FROM t1) AS x FROM t1);
1621} {12 12 12}
1622
1623do_execsql_test 48.1 {
1624 SELECT (SELECT max(x)OVER(ORDER BY x) + min(x)OVER(ORDER BY x))
1625 FROM (SELECT (SELECT sum(a) FROM t1 GROUP BY a) AS x FROM t1);
1626} {2 2 2}
1627
dan0a21ea92020-02-29 17:19:42 +00001628#-------------------------------------------------------------------------
1629reset_db
1630do_execsql_test 49.1 {
1631 CREATE TABLE t1 (a PRIMARY KEY);
1632 INSERT INTO t1 VALUES(1);
1633}
1634
1635do_execsql_test 49.2 {
1636 SELECT b AS c FROM (
1637 SELECT a AS b FROM (
1638 SELECT a FROM t1 WHERE a=1 OR (SELECT sum(a) OVER ())
1639 )
1640 WHERE b=1 OR b<10
1641 )
1642 WHERE c=1 OR c>=10;
1643} {1}
1644
1645
1646#-------------------------------------------------------------------------
1647reset_db
1648do_execsql_test 50.0 {
1649 CREATE TABLE t1 (a DOUBLE PRIMARY KEY);
1650 INSERT INTO t1 VALUES(10.0);
1651}
1652
1653do_execsql_test 50.1 {
1654 SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
1655} {10.0}
1656
1657do_execsql_test 50.2 {
1658 SELECT * FROM (
1659 SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
1660 )
1661 WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 )
1662} {10.0}
1663
1664do_execsql_test 50.3 {
1665 SELECT a FROM (
1666 SELECT * FROM (
1667 SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
1668 )
1669 WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 )
1670 )
1671 WHERE a=1 OR a=10.0
1672} {10.0}
1673
1674do_execsql_test 50.4 {
1675 SELECT a FROM (
1676 SELECT * FROM (
1677 SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
1678 )
1679 WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 )
1680 )
1681 WHERE a=1 OR ((SELECT sum(a) OVER(ORDER BY a%8)) AND 10<=a)
1682} {10.0}
1683
1684do_execsql_test 50.5 {
1685SELECT * FROM (SELECT * FROM t1 NATURAL JOIN t1 WHERE a%1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)) NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum((SELECT * FROM (SELECT * FROM (SELECT * FROM t1 NATURAL JOIN t1 WHERE a%1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)) NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum((SELECT * FROM t1 NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)))OVER(ORDER BY a% 1 )) AND a<=10)) NATURAL JOIN t1 WHERE a=1 OR ((SELECT sum(a)OVER(ORDER BY a)) AND 10<=a)))OVER(ORDER BY a%5)) AND a<=10);
1686} {10.0}
danfbb6e9f2020-01-09 20:11:29 +00001687
drhc415d912020-04-03 13:19:03 +00001688# 2020-04-03 ticket af4556bb5c285c08
1689#
1690reset_db
1691do_catchsql_test 51.1 {
1692 CREATE TABLE a(b, c);
1693 SELECT c FROM a GROUP BY c
1694 HAVING(SELECT(sum(b) OVER(ORDER BY b),
1695 sum(b) OVER(PARTITION BY min(DISTINCT c), c ORDER BY b)));
1696} {1 {row value misused}}
1697
danefa78882020-05-11 10:55:24 +00001698#-------------------------------------------------------------------------
1699reset_db
1700do_execsql_test 52.1 {
1701 CREATE TABLE t1(a, b, c);
1702 INSERT INTO t1 VALUES('AA','bb',356);
1703 INSERT INTO t1 VALUES('CC','aa',158);
1704 INSERT INTO t1 VALUES('BB','aa',399);
1705 INSERT INTO t1 VALUES('FF','bb',938);
1706}
1707
1708do_execsql_test 52.2 {
1709 SELECT
1710 count() OVER win1,
1711 sum(c) OVER win2,
1712 first_value(c) OVER win2,
1713 count(a) OVER (ORDER BY b)
1714 FROM t1
1715 WINDOW
1716 win1 AS (ORDER BY a),
1717 win2 AS (PARTITION BY 6 ORDER BY a
1718 RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
1719} {
1720 1 356 356 4
1721 2 399 399 2
1722 3 158 158 2
1723 4 938 938 4
1724}
1725
1726do_execsql_test 52.3 {
1727SELECT
1728 count() OVER (),
1729 sum(c) OVER win2,
1730 first_value(c) OVER win2,
1731 count(a) OVER (ORDER BY b)
1732FROM t1
1733WINDOW
1734 win1 AS (ORDER BY a),
1735 win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a
1736 RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
1737} {
1738 4 356 356 4
1739 4 399 399 2
1740 4 158 158 2
1741 4 938 938 4
1742}
1743
1744do_execsql_test 52.4 {
1745 SELECT
1746 count() OVER win1,
1747 sum(c) OVER win2,
1748 first_value(c) OVER win2,
1749 count(a) OVER (ORDER BY b)
1750 FROM t1
1751 WINDOW
1752 win1 AS (ORDER BY a),
1753 win2 AS (PARTITION BY 6 COLLATE binary ORDER BY a
1754 RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
1755} {
1756 1 356 356 4
1757 2 399 399 2
1758 3 158 158 2
1759 4 938 938 4
1760}
1761
drhc37577b2020-05-24 03:38:37 +00001762# 2020-05-23
1763# ticket 7a5279a25c57adf1
1764#
1765reset_db
1766do_execsql_test 53.0 {
1767 CREATE TABLE a(c UNIQUE);
1768 INSERT INTO a VALUES(4),(0),(9),(-9);
1769 SELECT a.c
1770 FROM a
1771 JOIN a AS b ON a.c=4
1772 JOIN a AS e ON a.c=e.c
1773 WHERE a.c=(SELECT (SELECT coalesce(lead(2) OVER(),0) + sum(d.c))
1774 FROM a AS d
1775 WHERE a.c);
1776} {4 4 4 4}
1777
drh89636622020-06-07 17:33:18 +00001778#-------------------------------------------------------------------------
1779reset_db
1780do_execsql_test 54.1 {
1781 CREATE TABLE t1(a VARCHAR(20), b FLOAT);
1782 INSERT INTO t1 VALUES('1',10.0);
1783}
1784
1785do_catchsql_test 54.2 {
1786 SELECT * FROM (
1787 SELECT sum(b) OVER() AS c FROM t1
1788 UNION
1789 SELECT b AS c FROM t1
1790 ) WHERE c>10;
danf65e3792020-06-10 10:58:15 +00001791} {0 {}}
drh89636622020-06-07 17:33:18 +00001792
1793do_execsql_test 54.3 {
1794 INSERT INTO t1 VALUES('2',5.0);
1795 INSERT INTO t1 VALUES('3',15.0);
1796}
1797
1798do_catchsql_test 54.4 {
1799 SELECT * FROM (
1800 SELECT sum(b) OVER() AS c FROM t1
1801 UNION
1802 SELECT b AS c FROM t1
1803 ) WHERE c>10;
danf65e3792020-06-10 10:58:15 +00001804} {0 {15.0 30.0}}
drh89636622020-06-07 17:33:18 +00001805
1806# 2020-06-05 ticket c8d3b9f0a750a529
1807reset_db
1808do_execsql_test 55.1 {
1809 CREATE TABLE a(b);
1810 SELECT
1811 (SELECT b FROM a
1812 GROUP BY b
1813 HAVING (SELECT COUNT()OVER() + lead(b)OVER(ORDER BY SUM(DISTINCT b) + b))
1814 )
1815 FROM a
1816 UNION
1817 SELECT 99
1818 ORDER BY 1;
1819} {99}
1820
1821#------------------------------------------------------------------------
1822reset_db
1823do_execsql_test 56.1 {
1824 CREATE TABLE t1(a, b INTEGER);
1825 CREATE TABLE t2(c, d);
1826}
1827do_catchsql_test 56.2 {
1828 SELECT avg(b) FROM t1
1829 UNION ALL
1830 SELECT min(c) OVER () FROM t2
1831 ORDER BY nosuchcolumn;
1832} {1 {1st ORDER BY term does not match any column in the result set}}
1833
1834reset_db
1835do_execsql_test 57.1 {
1836 CREATE TABLE t4(a, b, c, d, e);
1837}
1838
1839do_catchsql_test 57.2 {
1840 SELECT b FROM t4
1841 UNION
1842 SELECT a FROM t4
1843 ORDER BY (
1844 SELECT sum(x) OVER() FROM (
1845 SELECT c AS x FROM t4
1846 UNION
1847 SELECT d FROM t4
1848 ORDER BY (SELECT e FROM t4)
1849 )
1850 );
1851} {1 {1st ORDER BY term does not match any column in the result set}}
1852
1853# 2020-06-06 various dbsqlfuzz finds and
1854# ticket 0899cf62f597d7e7
1855#
1856reset_db
1857do_execsql_test 57.1 {
1858 CREATE TABLE t1(a, b, c);
1859 INSERT INTO t1 VALUES(NULL,NULL,NULL);
1860 SELECT
1861 sum(a),
1862 min(b) OVER (),
1863 count(c) OVER (ORDER BY b)
1864 FROM t1;
1865} {{} {} 0}
1866do_execsql_test 57.2 {
1867 CREATE TABLE v0 ( v1 INTEGER PRIMARY KEY ) ;
1868 INSERT INTO v0 VALUES ( 10 ) ;
1869 SELECT DISTINCT v1, lead(v1) OVER() FROM v0 GROUP BY v1 ORDER BY 2;
1870} {10 {}}
1871do_catchsql_test 57.3 {
1872 DROP TABLE t1;
1873 CREATE TABLE t1(a);
1874 INSERT INTO t1(a) VALUES(22);
1875 CREATE TABLE t3(y);
1876 INSERT INTO t3(y) VALUES(5),(11),(-9);
1877 SELECT (
1878 SELECT max(y) OVER( ORDER BY (SELECT x FROM (SELECT sum(y) AS x FROM t1)))
1879 )
1880 FROM t3;
1881} {1 {misuse of aggregate: sum()}}
1882
1883# 2020-06-06 ticket 1f6f353b684fc708
1884reset_db
1885do_execsql_test 58.1 {
1886 CREATE TABLE a(a, b, c);
1887 INSERT INTO a VALUES(1, 2, 3);
1888 INSERT INTO a VALUES(4, 5, 6);
1889 SELECT sum(345+b) OVER (ORDER BY b),
1890 sum(avg(678)) OVER (ORDER BY c) FROM a;
1891} {347 678.0}
1892
1893# 2020-06-06 ticket e5504e987e419fb0
1894do_catchsql_test 59.1 {
1895 DROP TABLE IF EXISTS t1;
1896 CREATE TABLE t1(x INTEGER PRIMARY KEY);
1897 INSERT INTO t1 VALUES (123);
1898 SELECT
1899 ntile( (SELECT sum(x)) ) OVER(ORDER BY x),
1900 min(x) OVER(ORDER BY x)
1901 FROM t1;
1902} {1 {misuse of aggregate: sum()}}
1903
1904# 2020-06-07 ticket f7d890858f361402
1905do_execsql_test 60.1 {
1906 DROP TABLE IF EXISTS t1;
1907 CREATE TABLE t1 (x INTEGER PRIMARY KEY);
1908 INSERT INTO t1 VALUES (99);
1909 SELECT EXISTS(SELECT count(*) OVER() FROM t1 ORDER BY sum(x) OVER());
1910} {1}
1911
drhbf790972020-06-07 20:18:07 +00001912# 2020-06-07 test case generated by dbsqlfuzz showing how an AggInfo
1913# object might be referenced after the sqlite3Select() call that created
1914# it returns. This proves the need to persist all AggInfo objects until
1915# the Parse object is destroyed.
1916#
drh89636622020-06-07 17:33:18 +00001917reset_db
drh4752bbd2021-05-07 15:46:36 +00001918do_catchsql_test 61.1 {
drhbf790972020-06-07 20:18:07 +00001919CREATE TABLE t1(a);
1920INSERT INTO t1 VALUES(5),(NULL),('seventeen');
1921SELECT (SELECT max(x)OVER(ORDER BY x) % min(x)OVER(ORDER BY CASE x WHEN 889 THEN x WHEN x THEN x END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST((SELECT (SELECT max(x)OVER(ORDER BY x) / min(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN -true THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x) & sum ( a )OVER(ORDER BY CASE x WHEN -8 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a AS )) FROM t1) AS x FROM t1)) AS t1 )) FROM t1) AS x FROM t1)) AS x )) FROM t1) AS x FROM t1)) AS real)) FROM t1) AS x FROM t1);
dan3d691fd2021-05-19 14:49:51 +00001922} {0 {{} {} {}}}
1923
1924foreach tn {1 2} {
1925 if {$tn==2} { optimization_control db query-flattener 0 }
1926 do_catchsql_test 61.2.$tn {
1927 SELECT
1928 (SELECT max(x)OVER(ORDER BY x) / min(x) OVER() )
1929 FROM (
1930 SELECT (SELECT sum(a) FROM t1 ) AS x FROM t1
1931 )
1932
1933 } {0 {1.0 1.0 1.0}}
1934}
1935
1936reset_db
1937optimization_control db all 0
1938do_execsql_test 61.3.0 {
1939 CREATE TABLE t1(a);
1940 CREATE TABLE t2(y);
1941}
1942
1943do_execsql_test 61.3.1 {
1944 SELECT (
1945 SELECT count(a) OVER ( ORDER BY (SELECT sum(y) FROM t2) )
1946 + total(a) OVER()
1947 )
1948 FROM t1
1949} {}
1950do_execsql_test 61.4.2 {
1951 SELECT (
1952 SELECT count(a) OVER ( ORDER BY sum(a) )
1953 + total(a) OVER()
1954 )
1955 FROM t1
1956} {0.0}
1957
1958do_catchsql_test 61.4.3 {
1959 SELECT
1960 sum(a) OVER ( ORDER BY a )
1961 FROM t1
1962 ORDER BY (SELECT sum(a) FROM t2)
drh4752bbd2021-05-07 15:46:36 +00001963} {1 {misuse of aggregate: sum()}}
dan3d691fd2021-05-19 14:49:51 +00001964do_execsql_test 61.4.4 {
1965 SELECT
1966 sum(a) OVER ( ORDER BY a )
1967 FROM t1
1968 ORDER BY (SELECT sum(y) FROM t2)
1969}
1970
danefa78882020-05-11 10:55:24 +00001971
danf65e3792020-06-10 10:58:15 +00001972#-------------------------------------------------------------------------
1973reset_db
1974do_execsql_test 62.1 {
1975 CREATE TABLE t1(a VARCHAR(20), b FLOAT);
1976 INSERT INTO t1 VALUES('1',10.0);
1977}
1978
1979do_execsql_test 62.2 {
1980 SELECT * FROM (
1981 SELECT sum(b) OVER() AS c FROM t1
1982 UNION
1983 SELECT b AS c FROM t1
1984 ) WHERE c>10;
1985}
1986
1987do_execsql_test 62.3 {
1988 INSERT INTO t1 VALUES('2',5.0);
1989 INSERT INTO t1 VALUES('3',15.0);
1990}
1991
1992do_execsql_test 62.4 {
1993 SELECT * FROM (
1994 SELECT sum(b) OVER() AS c FROM t1
1995 UNION
1996 SELECT b AS c FROM t1
1997 ) WHERE c>10;
1998} {15.0 30.0}
1999
dan46daa992020-06-11 15:53:54 +00002000#-------------------------------------------------------------------------
2001reset_db
2002do_execsql_test 63.1 {
2003 CREATE TABLE t1(b, x);
2004 CREATE TABLE t2(c, d);
2005 CREATE TABLE t3(e, f);
2006}
2007
2008do_execsql_test 63.2 {
2009 SELECT max(b) OVER(
2010 ORDER BY SUM(
2011 (SELECT c FROM t2 UNION SELECT x ORDER BY c)
2012 )
2013 ) FROM t1;
2014} {{}}
2015
2016do_execsql_test 63.3 {
2017 SELECT sum(b) over(
2018 ORDER BY (
2019 SELECT max(b) OVER(
2020 ORDER BY sum(
2021 (SELECT x AS c UNION SELECT 1234 ORDER BY c)
2022 )
2023 ) AS e
2024 ORDER BY e
2025 )
2026 )
2027 FROM t1;
2028} {{}}
2029
dan27da9072020-07-13 15:20:27 +00002030#-------------------------------------------------------------------------
2031reset_db
2032do_execsql_test 64.1 {
2033 CREATE TABLE t1(a INTEGER PRIMARY KEY, b);
2034 INSERT INTO t1 VALUES(1, 'abcd');
2035 INSERT INTO t1 VALUES(2, 'BCDE');
2036 INSERT INTO t1 VALUES(3, 'cdef');
2037 INSERT INTO t1 VALUES(4, 'DEFG');
2038}
2039
2040do_execsql_test 64.2 {
2041 SELECT rowid, max(b COLLATE nocase)||''
2042 FROM t1
2043 GROUP BY rowid
2044 ORDER BY max(b COLLATE nocase)||'';
2045} {1 abcd 2 BCDE 3 cdef 4 DEFG}
2046
2047do_execsql_test 64.3 {
2048 SELECT count() OVER (), rowid, max(b COLLATE nocase)||''
2049 FROM t1
2050 GROUP BY rowid
2051 ORDER BY max(b COLLATE nocase)||'';
2052} {4 1 abcd 4 2 BCDE 4 3 cdef 4 4 DEFG}
2053
2054do_execsql_test 64.4 {
2055 SELECT count() OVER (), rowid, max(b COLLATE nocase)
2056 FROM t1
2057 GROUP BY rowid
2058 ORDER BY max(b COLLATE nocase);
2059} {4 1 abcd 4 2 BCDE 4 3 cdef 4 4 DEFG}
2060
2061#-------------------------------------------------------------------------
2062reset_db
2063do_execsql_test 65.1 {
2064 CREATE TABLE t1(c1);
2065 INSERT INTO t1 VALUES('abcd');
2066}
2067do_execsql_test 65.2 {
2068 SELECT max(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1;
2069} {1}
2070
2071do_execsql_test 65.3 {
2072 SELECT
2073 count() OVER (),
2074 group_concat(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1;
2075} {1 1}
2076
2077do_execsql_test 65.4 {
2078 SELECT COUNT() OVER () LIKE lead(102030) OVER(
2079 ORDER BY sum('abcdef' COLLATE nocase) IN (SELECT 54321)
2080 )
2081 FROM t1;
2082} {{}}
2083
dan6b6ec402021-04-05 19:05:18 +00002084#-------------------------------------------------------------------------
2085reset_db
2086
2087do_execsql_test 66.1 {
2088 CREATE TABLE t1(a INTEGER);
2089 INSERT INTO t1 VALUES(3578824042033200656);
2090 INSERT INTO t1 VALUES(3029012920382354029);
2091}
2092
2093foreach {tn spec} {
2094 1 "ORDER BY a RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING"
2095 2 "ORDER BY a RANGE BETWEEN 0.3 PRECEDING AND 0.1 PRECEDING"
2096 3 "ORDER BY a RANGE BETWEEN 0.3 FOLLOWING AND 10 FOLLOWING"
2097 4 "ORDER BY a DESC RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING"
2098 5 "ORDER BY a NULLS LAST RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING"
2099 6 "ORDER BY a RANGE BETWEEN 1.0 PRECEDING AND 2.0 PRECEDING"
2100} {
2101 do_execsql_test 66.2.$tn "
2102 SELECT total(a) OVER ( $spec ) FROM t1 ORDER BY a
2103 " {
2104 3.02901292038235e+18 3.5788240420332e+18
2105 }
2106}
2107
2108
2109do_execsql_test 66.3 {
2110 CREATE TABLE t2(a INTEGER);
2111 INSERT INTO t2 VALUES(45);
2112 INSERT INTO t2 VALUES(30);
2113}
2114
2115foreach {tn spec res} {
2116 1 "ORDER BY a RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING" {30.0 45.0}
2117 2 "ORDER BY a RANGE BETWEEN 0.3 PRECEDING AND 0.1 PRECEDING" {0.0 0.0}
2118 3 "ORDER BY a RANGE BETWEEN 0.3 FOLLOWING AND 10 FOLLOWING" {0.0 0.0}
2119 4 "ORDER BY a DESC RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING" {30.0 45.0}
2120 5 "ORDER BY a NULLS LAST RANGE BETWEEN 0.3 PRECEDING AND 10 FOLLOWING" {30.0 45.0}
2121 6 "ORDER BY a RANGE BETWEEN 1.0 PRECEDING AND 2.0 PRECEDING" {0.0 0.0}
2122} {
2123 do_execsql_test 66.2.$tn "
2124 SELECT total(a) OVER ( $spec ) FROM t2 ORDER BY a
2125 " $res
2126}
2127
dand487e372021-04-12 16:59:28 +00002128
2129#-------------------------------------------------------------------------
2130reset_db
2131do_execsql_test 67.0 {
2132 CREATE TABLE t1(a, b, c);
2133 CREATE TABLE t2(a, b, c);
2134}
2135
2136do_catchsql_test 67.1 {
2137 SELECT a,c,b FROM t1 INTERSECT SELECT a,b,c FROM t1 ORDER BY (
2138 SELECT nth_value(a,2) OVER w1
2139 WINDOW w1 AS ( ORDER BY ((SELECT 1 FROM v1)) )
2140 )
danbe120832021-05-17 16:20:41 +00002141} {1 {no such table: v1}}
2142
2143do_catchsql_test 67.2 {
2144 SELECT a,c,b FROM t1 INTERSECT SELECT a,b,c FROM t1 ORDER BY (
2145 SELECT nth_value(a,2) OVER w1
2146 WINDOW w1 AS ( ORDER BY ((SELECT 1 FROM t2)) )
2147 )
dand487e372021-04-12 16:59:28 +00002148} {1 {1st ORDER BY term does not match any column in the result set}}
2149
drh4752bbd2021-05-07 15:46:36 +00002150# 2021-05-07
2151# Do not allow aggregate functions in the ORDER BY clause even if
2152# there are window functions in the result set.
2153# Forum: /forumpost/540fdfef77
2154#
2155reset_db
2156do_catchsql_test 68.0 {
2157 CREATE TABLE t1(a,b);
2158 INSERT INTO t1(a,b) VALUES(0,0),(1,1),(2,4),(3,9),(4,99);
2159 SELECT rowid, a, b, sum(a)OVER() FROM t1 ORDER BY count(b);
2160} {1 {misuse of aggregate: count()}}
2161
drh5e1a7de2021-05-22 11:23:20 +00002162# 2021-05-22
2163# Forum https://sqlite.org/forum/forumpost/7e484e225c
2164#
2165reset_db
2166do_catchsql_test 69.0 {
2167 CREATE TABLE t1(a,b);
2168 CREATE INDEX t1ba ON t1(b,a);
drh05428122021-05-24 00:17:04 +00002169 SELECT * FROM t1 WHERE b = (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a));
2170} {1 {misuse of aggregate: sum()}}
2171do_catchsql_test 69.1 {
2172 SELECT * FROM t1 WHERE b >= (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a));
2173} {1 {misuse of aggregate: sum()}}
2174do_catchsql_test 69.2 {
2175 SELECT * FROM t1 WHERE b <= (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a));
2176} {1 {misuse of aggregate: sum()}}
2177
dana261c022021-06-23 11:12:48 +00002178# 2021-06-23
2179# Forum https://sqlite.org/forum/forumpost/31e0432608
2180#
2181reset_db
2182do_execsql_test 70.0 {
2183 CREATE TABLE t1(a);
2184}
2185do_execsql_test 70.1 {
2186 SELECT substr(a,4,lag(a,7) OVER(PARTITION BY 'cf23' ORDER BY 2)) AS ca0 FROM t1 ORDER BY ca0;
2187}
2188do_execsql_test 70.2 {
2189 SELECT substr(a,4,lag(a,7) OVER(PARTITION BY 'cf23' ORDER BY likely(2))) AS ca0 FROM t1 ORDER BY ca0;
2190}
2191
drh5e1a7de2021-05-22 11:23:20 +00002192
drhd4cb09e2018-09-17 15:19:13 +00002193finish_test