3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
14 set testdir [file dirname $argv0]
15 source $testdir/tester.tcl
16 set testprefix window1
18 ifcapable !windowfunc {
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);
31 SELECT sum(b) OVER () FROM t1
35 SELECT a, sum(b) OVER () FROM t1
39 SELECT a, 4 + sum(b) OVER () FROM t1
43 SELECT a + 4 + sum(b) OVER () FROM t1
47 SELECT a, sum(b) OVER (PARTITION BY c) FROM t1
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"
64 do_test 2.$tn { lindex [catchsql $sql] 0 } 0
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 ()"
72 do_catchsql_test 3.$tn $sql {1 {misuse of window function sum()}}
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);
87 SELECT a, sum(a) OVER (PARTITION BY b) FROM t2;
89 0 12 2 12 4 12 6 12 1 9 3 9 5 9
93 SELECT a, sum(a) OVER (PARTITION BY b) FROM t2 ORDER BY a;
95 0 12 1 9 2 12 3 9 4 12 5 9 6 12
99 SELECT a, sum(a) OVER () FROM t2 ORDER BY a;
101 0 21 1 21 2 21 3 21 4 21 5 21 6 21
104 do_execsql_test 4.4 {
105 SELECT a, sum(a) OVER (ORDER BY a) FROM t2;
107 0 0 1 1 2 3 3 6 4 10 5 15 6 21
110 do_execsql_test 4.5 {
111 SELECT a, sum(a) OVER (PARTITION BY b ORDER BY a) FROM t2 ORDER BY a
113 0 0 1 1 2 2 3 4 4 6 5 9 6 12
116 do_execsql_test 4.6 {
117 SELECT a, sum(a) OVER (PARTITION BY c ORDER BY a) FROM t2 ORDER BY a
119 0 0 1 1 2 2 3 3 4 5 5 7 6 9
122 do_execsql_test 4.7 {
123 SELECT a, sum(a) OVER (PARTITION BY b ORDER BY a DESC) FROM t2 ORDER BY a
125 0 12 1 9 2 12 3 8 4 10 5 5 6 6
128 do_execsql_test 4.8 {
130 sum(a) OVER (PARTITION BY b ORDER BY a DESC),
131 sum(a) OVER (PARTITION BY c ORDER BY a)
143 do_execsql_test 4.9 {
145 sum(a) OVER (ORDER BY a),
146 avg(a) OVER (ORDER BY a)
158 do_execsql_test 4.10.1 {
160 count() OVER (ORDER BY a DESC),
161 group_concat(a, '.') OVER (ORDER BY a DESC)
162 FROM t2 ORDER BY a DESC
173 do_execsql_test 4.10.2 {
175 count(*) OVER (ORDER BY a DESC),
176 group_concat(a, '.') OVER (ORDER BY a DESC)
177 FROM t2 ORDER BY a DESC
188 do_catchsql_test 5.1 {
189 SELECT ntile(0) OVER (ORDER BY a) FROM t2;
190 } {1 {argument of ntile must be a positive integer}}
191 do_catchsql_test 5.2 {
192 SELECT ntile(-1) OVER (ORDER BY a) FROM t2;
193 } {1 {argument of ntile must be a positive integer}}
194 do_catchsql_test 5.3 {
195 SELECT ntile('zbc') OVER (ORDER BY a) FROM t2;
196 } {1 {argument of ntile must be a positive integer}}
197 do_execsql_test 5.4 {
198 CREATE TABLE t4(a, b);
199 SELECT ntile(1) OVER (ORDER BY a) FROM t4;
202 #-------------------------------------------------------------------------
204 do_execsql_test 6.1 {
206 INSERT INTO t1 VALUES(7), (6), (5), (4), (3), (2), (1);
209 INSERT INTO t2 VALUES('b'), ('a');
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}
214 do_execsql_test 6.2 {
215 SELECT * FROM t2, (SELECT x, count(*) OVER (ORDER BY x) FROM t1);
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
221 do_catchsql_test 6.3 {
222 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}}
226 #-------------------------------------------------------------------------
227 # Attempt to use a window function as an aggregate. And other errors.
230 do_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);
239 do_catchsql_test 7.1.1 {
240 SELECT nth_value(x, 1) FROM t1;
241 } {1 {misuse of window function nth_value()}}
242 do_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()}}
245 do_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()}}
248 do_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()}}
251 do_catchsql_test 7.1.5 {
252 SELECT count(*) FROM t1 LIMIT nth_value(x, 1) OVER ();
253 } {1 {no such column: x}}
254 do_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}}
257 do_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}}
260 do_catchsql_test 7.1.8 {
261 SELECT row_number(x) OVER () FROM t1
262 } {1 {wrong number of arguments to function row_number()}}
264 do_execsql_test 7.2 {
268 lead(y, 3, 'default') OVER win
270 WINDOW win AS (ORDER BY x)
272 4 6 8 6 8 10 8 10 default 10 {} default {} {} default
275 do_execsql_test 7.3 {
276 SELECT row_number() OVER (ORDER BY x) FROM t1
279 do_execsql_test 7.4 {
281 row_number() OVER win,
284 WINDOW win AS (ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
285 } {1 3 2 5 3 7 4 9 5 {}}
287 #-------------------------------------------------------------------------
288 # Attempt to use a window function in a view.
290 do_execsql_test 8.0 {
291 CREATE TABLE t3(a, b, c);
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;
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)
302 CREATE VIEW v2 AS SELECT
307 WINDOW win AS (ORDER BY c);
310 do_execsql_test 8.1.1 {
312 } {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
313 do_execsql_test 8.1.2 {
315 } {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
319 do_execsql_test 8.2.1 {
321 } {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
322 do_execsql_test 8.2.2 {
324 } {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
326 #-------------------------------------------------------------------------
327 # Attempt to use a window function in a trigger.
329 do_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');
337 CREATE TABLE t5(x, y, m);
338 CREATE TRIGGER t4i AFTER INSERT ON t4 BEGIN
341 SELECT x, y, max(y) OVER xyz FROM t4
342 WINDOW xyz AS (PARTITION BY (x%2) ORDER BY x);
346 do_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}
351 do_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}
357 do_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}
361 do_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)
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}
369 do_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)
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}
377 do_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
385 SELECT a, max(d) OVER w1 FROM t1
386 WINDOW w1 AS (PARTITION BY EXISTS(SELECT 1 FROM t1 WHERE c=?1) );
388 } {1 {trigger cannot use variables}}
390 do_catchsql_test 9.4.2 {
391 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
393 SELECT a, max(d) OVER w1 FROM t1
395 ORDER BY a ROWS BETWEEN ? PRECEDING AND UNBOUNDED FOLLOWING
398 } {1 {trigger cannot use variables}}
399 do_catchsql_test 9.4.3 {
400 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
402 SELECT a, max(d) OVER w1 FROM t1
404 ORDER BY a ROWS BETWEEN UNBOUNDED PRECEDING AND ? FOLLOWING
407 } {1 {trigger cannot use variables}}
409 #-------------------------------------------------------------------------
411 do_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);
424 # Best two salespeople from each region
426 do_execsql_test 10.1 {
427 SELECT emp, region, total FROM (
430 row_number() OVER (PARTITION BY region ORDER BY total DESC) AS rank
432 ) WHERE rank<=2 ORDER BY region, total DESC
441 do_execsql_test 10.2 {
442 SELECT emp, region, sum(total) OVER win FROM sales
443 WINDOW win AS (PARTITION BY region ORDER BY total)
455 do_execsql_test 10.3 {
456 SELECT emp, region, sum(total) OVER win FROM sales
457 WINDOW win AS (PARTITION BY region ORDER BY total)
467 do_execsql_test 10.4 {
468 SELECT emp, region, sum(total) OVER win FROM sales
469 WINDOW win AS (PARTITION BY region ORDER BY total)
479 do_execsql_test 10.5 {
480 SELECT emp, region, sum(total) OVER win FROM sales
482 PARTITION BY region ORDER BY total
483 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
496 do_execsql_test 10.6 {
497 SELECT emp, region, sum(total) OVER win FROM sales
499 PARTITION BY region ORDER BY total
500 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
510 do_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;
519 Charles North 254Charles
520 Darrell South 254Darrell
523 Elizabeth South 254Elizabeth
524 Horace East 254Horace
527 do_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
532 ) FROM sales AS outer;
544 #-------------------------------------------------------------------------
545 # Check that it is not possible to use a window function in a CREATE INDEX
548 do_execsql_test 11.0 { CREATE TABLE t6(a, b, c); }
550 do_catchsql_test 11.1 {
551 CREATE INDEX t6i ON t6(a) WHERE sum(b) OVER ();
552 } {1 {misuse of window function sum()}}
553 do_catchsql_test 11.2 {
554 CREATE INDEX t6i ON t6(a) WHERE lead(b) OVER ();
555 } {1 {misuse of window function lead()}}
557 do_catchsql_test 11.3 {
558 CREATE INDEX t6i ON t6(sum(b) OVER ());
559 } {1 {misuse of window function sum()}}
560 do_catchsql_test 11.4 {
561 CREATE INDEX t6i ON t6(lead(b) OVER ());
562 } {1 {misuse of window function lead()}}
564 # 2018-09-17 ticket 510cde277783b5fb5de628393959849dff377eb3
565 # Endless loop on a query with window functions and a limit
567 do_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
579 do_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
585 } {2 B two 3 C three}
587 #-------------------------------------------------------------------------
589 do_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);
596 do_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;
602 do_execsql_test 13.2.2 {
603 SELECT a, rank() OVER(ORDER BY b) FROM t1
605 SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
609 do_execsql_test 13.3 {
610 SELECT a, rank() OVER(ORDER BY b) FROM t1
612 SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
617 do_execsql_test 13.4 {
618 SELECT a, rank() OVER(ORDER BY b) FROM t1
620 SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
625 do_execsql_test 13.5 {
626 SELECT a, rank() OVER(ORDER BY b) FROM t1
628 SELECT a, rank() OVER(ORDER BY b DESC) FROM t1;
632 # https://www.sqlite.org/src/info/f09fcd17810f65f7
633 # Assertion fault when window functions are used.
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.
641 do_execsql_test 14.0 {
643 SELECT * FROM (SELECT 1 AS c) WHERE c IN (
644 SELECT (row_number() OVER()) FROM (VALUES (0))
648 do_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 (
653 SELECT (row_number() OVER()) FROM t1
659 # https://www.sqlite.org/src/info/d0866b26f83e9c55
660 # Window function in correlated subquery causes assertion fault
662 do_catchsql_test 15.0 {
663 WITH t(id, parent) AS (
664 SELECT CAST(1 AS INT), CAST(NULL AS INT)
676 SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn
680 SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn
687 } {1 {cannot use window functions in recursive queries}}
688 do_execsql_test 15.1 {
689 DROP TABLE IF EXISTS t1;
690 DROP TABLE IF EXISTS t2;
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);
697 OVER (PARTITION BY a ROWS BETWEEN UNBOUNDED PRECEDING
698 AND UNBOUNDED FOLLOWING)
703 do_execsql_test 15.2 {
711 #-------------------------------------------------------------------------
713 do_execsql_test 16.0 {
714 CREATE TABLE t7(a,b);
715 INSERT INTO t7(rowid, a, b) VALUES
721 do_execsql_test 16.1 {
722 SELECT rowid, sum(a) OVER (PARTITION BY b IN (SELECT rowid FROM t7)) FROM t7;
729 do_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));
738 #-------------------------------------------------------------------------
739 do_execsql_test 17.0 {
741 INSERT INTO t8 VALUES(1), (2), (3);
744 do_execsql_test 17.1 {
745 SELECT +sum(0) OVER () ORDER BY +sum(0) OVER ();
748 do_execsql_test 17.2 {
749 select +sum(a) OVER () FROM t8 ORDER BY +sum(a) OVER () DESC;
752 do_execsql_test 17.3 {
753 SELECT 10+sum(a) OVER (ORDER BY a)
755 ORDER BY 10+sum(a) OVER (ORDER BY a) DESC;
759 #-------------------------------------------------------------------------
760 # Test error cases from chaining window definitions.
763 do_execsql_test 18.0 {
764 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);
774 foreach {tn sql error} {
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}
782 SELECT c, sum(d) OVER win2 FROM t1
784 win2 AS (win4 ORDER BY b)
785 } {no such window: win4}
788 SELECT c, sum(d) OVER win2 FROM t1
790 win2 AS (win1 PARTITION BY d)
791 } {cannot override PARTITION clause of window: win1}
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}
799 do_catchsql_test 18.1.$tn $sql [list 1 $error]
802 foreach {tn sql error} {
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}
809 SELECT c, sum(d) OVER (win4 ORDER BY b) FROM t1
811 } {no such window: win4}
814 SELECT c, sum(d) OVER (win1 PARTITION BY d) FROM t1
816 } {cannot override PARTITION clause of window: win1}
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}
823 do_catchsql_test 18.2.$tn $sql [list 1 $error]
826 do_execsql_test 18.3.1 {
827 SELECT group_concat(c, '.') OVER (PARTITION BY b ORDER BY c)
829 } {four four.six four.six.two five five.one five.one.three}
831 do_execsql_test 18.3.2 {
832 SELECT group_concat(c, '.') OVER (win1 ORDER BY c)
834 WINDOW win1 AS (PARTITION BY b)
835 } {four four.six four.six.two five five.one five.one.three}
837 do_execsql_test 18.3.3 {
838 SELECT group_concat(c, '.') OVER win2
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}
844 do_execsql_test 18.3.4 {
845 SELECT group_concat(c, '.') OVER (win2)
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}
851 do_execsql_test 18.3.5 {
852 SELECT group_concat(c, '.') OVER win5
854 WINDOW win1 AS (PARTITION BY b),
858 win5 AS (win4 ORDER BY c)
859 } {four four.six four.six.two five five.one five.one.three}
861 #-------------------------------------------------------------------------
862 # Test RANGE <expr> PRECEDING/FOLLOWING when there are string, blob
863 # and NULL values in the dataset.
866 do_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);
872 do_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}
876 do_execsql_test 19.2.1 {
877 SELECT a, sum(b) OVER (
878 ORDER BY a RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
880 } {1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
881 do_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}
887 do_execsql_test 19.3.1 {
888 SELECT a, sum(b) OVER (
889 ORDER BY a RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING
891 } {1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
892 do_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}
900 do_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);
907 do_execsql_test 20.1 {
908 SELECT a, sum(b) OVER (ORDER BY a) FROM t1;
910 {} 200 {} 200 1 201 2 203 3 206 4 210 5 215
911 a 221 b 228 c 236 d 245 e 255
914 do_execsql_test 20.2.1 {
915 SELECT a, sum(b) OVER (
916 ORDER BY a RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING
918 } {{} 200 {} 200 1 3 2 6 3 9 4 12 5 9 a 6 b 7 c 8 d 9 e 10}
919 do_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}
925 do_execsql_test 20.3.1 {
926 SELECT a, sum(b) OVER (
927 ORDER BY a RANGE BETWEEN 2 PRECEDING AND 1 FOLLOWING
929 } {{} 200 {} 200 1 3 2 6 3 10 4 14 5 12 a 6 b 7 c 8 d 9 e 10}
930 do_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}
936 #-------------------------------------------------------------------------
937 do_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
943 do_execsql_test 21.1 {
945 current, exclude, filter, following, groups, no, others, over,
946 partition, preceding, range, ties, unbounded, window
950 #-------------------------------------------------------------------------
951 foreach {tn expr err} {
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) )
968 ORDER BY y RANGE BETWEEN $expr PRECEDING AND UNBOUNDED FOLLOWING
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) )
977 ORDER BY y RANGE BETWEEN UNBOUNDED PRECEDING AND $expr FOLLOWING
982 #-------------------------------------------------------------------------
984 do_execsql_test 23.0 {
985 CREATE TABLE t5(a, b, c);
986 CREATE INDEX t5ab ON t5(a, b);
989 proc 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]
994 do_ordercount_test 23.1 {
996 sum(c) OVER (ORDER BY a, b),
997 sum(c) OVER (PARTITION BY a ORDER BY b)
1001 do_ordercount_test 23.2 {
1003 sum(c) OVER (ORDER BY b, a),
1004 sum(c) OVER (PARTITION BY b ORDER BY a)
1008 do_ordercount_test 23.3 {
1010 sum(c) OVER (ORDER BY b, a),
1011 sum(c) OVER (ORDER BY c, b)
1015 do_ordercount_test 23.4 {
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)
1023 do_ordercount_test 23.5 {
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)
1031 do_ordercount_test 23.6 {
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)
1039 do_execsql_test 24.1 {
1040 SELECT sum(44) OVER ()
1043 do_execsql_test 24.2 {
1044 SELECT lead(44) OVER ()
1047 #-------------------------------------------------------------------------
1050 do_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 );
1055 INSERT INTO t1 VALUES(1), (3), (5);
1056 INSERT INTO t2 VALUES (3), (5);
1057 INSERT INTO t3 VALUES(10), (11), (12);
1060 do_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
1067 do_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
1074 #-------------------------------------------------------------------------
1076 do_execsql_test 26.0 {
1081 do_execsql_test 26.1 {
1082 SELECT ( SELECT row_number() OVER () FROM ( SELECT c FROM t1 ) ) FROM t2
1085 do_execsql_test 26.2 {
1086 INSERT INTO t1 VALUES(1), (2), (3), (4);
1087 INSERT INTO t2 VALUES(2), (6), (8), (4);
1089 SELECT row_number() OVER () FROM ( SELECT c FROM t1 )
1093 do_execsql_test 26.3 {
1097 INSERT INTO t2 VALUES(1), (2), (3), (4);
1098 INSERT INTO t1 VALUES(1), (1), (2), (3), (3), (3), (3), (4), (4);
1101 SELECT row_number() OVER () FROM ( SELECT 1 FROM t1 WHERE x=c )
1105 #-------------------------------------------------------------------------
1107 do_execsql_test 27.0 {
1109 INSERT INTO t1 VALUES(NULL), (1), (2), (3), (4), (5);
1111 do_execsql_test 27.1 {
1112 SELECT min(x) FROM t1;
1114 do_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)
1119 #-------------------------------------------------------------------------
1122 do_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);
1128 do_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)
1135 do_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);
1141 do_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);
1150 do_execsql_test 28.2.2 {
1151 SELECT a, b, c, quote(d), group_concat(b,'') OVER w1, '|' FROM t1
1153 (ORDER BY d DESC RANGE BETWEEN 7.0 PRECEDING AND 2.5 PRECEDING)
1161 #-------------------------------------------------------------------------
1164 do_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);
1183 do_execsql_test 29.2 {
1184 SELECT a, b, c, quote(d), group_concat(b,'') OVER w1, '|' FROM t1
1186 (PARTITION BY c ORDER BY d DESC
1187 RANGE BETWEEN 7.0 PRECEDING AND 2.5 PRECEDING)
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.
1211 do_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);
1216 count () OVER win1 NOT BETWEEN 'a' AND 'mmm',
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 );
1225 #-------------------------------------------------------------------------
1227 do_execsql_test 31.1 {
1228 CREATE TABLE t1(a, b);
1229 CREATE TABLE t2(c, d);
1230 CREATE TABLE t3(e, f);
1232 INSERT INTO t1 VALUES(1, 1);
1233 INSERT INTO t2 VALUES(1, 1);
1234 INSERT INTO t3 VALUES(1, 1);
1237 do_execsql_test 31.2 {
1238 SELECT d IN (SELECT sum(c) OVER (ORDER BY e+c) FROM t3) FROM (
1243 do_execsql_test 31.3 {
1244 SELECT d IN (SELECT sum(c) OVER (PARTITION BY d ORDER BY e+c) FROM t3) FROM (
1249 do_catchsql_test 31.3 {
1251 SELECT sum(c) OVER ( ROWS BETWEEN d FOLLOWING AND UNBOUNDED FOLLOWING)
1257 } {1 {frame starting offset must be a non-negative integer}}
1259 do_catchsql_test 31.3 {
1261 SELECT sum(c) OVER ( ROWS BETWEEN CURRENT ROW AND c FOLLOWING)
1267 } {1 {frame ending offset must be a non-negative integer}}
1269 # 2019-11-16 chromium issue 1025467
1272 do_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}}
1279 do_execsql_test 33.1 {
1280 CREATE TABLE t1(aa, bb);
1281 INSERT INTO t1 VALUES(1, 2);
1282 INSERT INTO t1 VALUES(5, 6);
1284 INSERT INTO t2 VALUES(1);
1286 do_execsql_test 33.2 {
1287 SELECT (SELECT DISTINCT sum(aa) OVER() FROM t1 ORDER BY 1), x FROM t2
1292 do_execsql_test 34.1 {
1293 CREATE TABLE t1(a,b,c);
1295 do_execsql_test 34.2 {
1296 SELECT avg(a) OVER (
1297 ORDER BY (SELECT sum(b) OVER ()
1299 SELECT total(d) OVER (ORDER BY c)
1300 FROM (SELECT 1 AS d) ORDER BY 1
1307 #-------------------------------------------------------------------------
1309 do_catchsql_test 35.0 {
1310 SELECT * WINDOW f AS () ORDER BY name COLLATE nocase;
1311 } {1 {no tables specified}}
1313 do_catchsql_test 35.1 {
1314 VALUES(1) INTERSECT SELECT * WINDOW f AS () ORDER BY x COLLATE nocase;
1315 } {1 {no tables specified}}
1317 do_execsql_test 35.2 {
1319 INSERT INTO t1 VALUES(1), (2), (3);
1321 SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
1324 do_execsql_test 35.3 {
1326 SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
1329 do_execsql_test 35.4 {
1331 SELECT sum(x) OVER f FROM t1 WINDOW f AS (ORDER BY x) ORDER BY 1;
1334 # 2019-12-07 gramfuzz find
1336 do_execsql_test 36.10 {
1337 VALUES(count(*)OVER());
1339 do_execsql_test 36.20 {
1340 VALUES(count(*)OVER()),(2);
1342 do_execsql_test 36.30 {
1343 VALUES(2),(count(*)OVER());
1345 do_execsql_test 36.40 {
1346 VALUES(2),(3),(count(*)OVER()),(4),(5);
1349 # 2019-12-17 crash test case found by Yongheng and Rui
1350 # See check-in 1ca0bd982ab1183b
1353 do_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;
1358 do_execsql_test 37.20 {
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;
1364 # 2019-12-20 mrigger reported problem with a FILTER clause on an aggregate
1368 do_catchsql_test 38.10 {
1369 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));
1374 } {1 {misuse of aggregate: AVG()}}
1375 do_execsql_test 38.20 {
1376 SELECT COUNT(*), AVG(1) FILTER(WHERE t1.c1) FROM t0, t1;
1378 do_catchsql_test 38.30 {
1379 SELECT COUNT(*) FROM t0, t1 WHERE (SELECT AVG(1) FILTER(WHERE t1.c1));
1380 } {1 {misuse of aggregate: AVG()}}
1383 do_execsql_test 39.1 {
1384 CREATE TABLE t0(c0 UNIQUE);
1386 do_execsql_test 39.2 {
1387 SELECT FIRST_VALUE(0) OVER();
1389 do_execsql_test 39.3 {
1390 SELECT * FROM t0 WHERE(c0, 0) IN(SELECT FIRST_VALUE(0) OVER(), 0);
1392 do_execsql_test 39.4 {
1393 SELECT * FROM t0 WHERE (t0.c0, 1) IN(SELECT NTILE(1) OVER(), 0 FROM t0);
1397 # 2019-12-25 ticket d87336c81c7d0873
1400 do_catchsql_test 40.1 {
1401 CREATE VIRTUAL TABLE t0 USING rtree(c0, c1, c2);
1403 WHERE ((0,0) IN (SELECT COUNT(*),LAG(5)OVER(PARTITION BY 0) FROM t0),0)<=(c1,0);
1407 #-------------------------------------------------------------------------
1409 do_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);
1417 do_execsql_test 41.2 {
1418 SELECT min(c) OVER (
1419 ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
1423 do_execsql_test 41.2 {
1424 SELECT min(c) OVER (
1425 ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
1429 do_execsql_test 41.3 {
1431 min(c) OVER win3 << first_value(c) OVER win3,
1432 min(c) OVER win3 << first_value(c) OVER win3
1435 PARTITION BY 6 ORDER BY a RANGE BETWEEN 5.2 PRECEDING AND 0.1 PRECEDING
1439 #-------------------------------------------------------------------------
1441 do_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);
1446 do_execsql_test 42.2 {
1447 SELECT * FROM t1 WHERE (0, 0) IN ( SELECT count(*), 0 FROM t1 )
1449 do_execsql_test 42.3 {
1450 SELECT * FROM t1 WHERE (2, 0) IN ( SELECT count(*), 0 FROM t1 )
1453 do_execsql_test 42.3 {
1454 SELECT count(*), max(a) OVER () FROM t1 GROUP BY c;
1457 do_execsql_test 42.4 {
1458 SELECT sum(a), max(b) OVER () FROM t1;
1461 do_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);
1471 do_execsql_test 42.6 {
1472 SELECT a, sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2 GROUP BY a;
1475 do_execsql_test 42.7 {
1476 SELECT sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2;
1479 #-------------------------------------------------------------------------
1481 do_execsql_test 43.1.1 {
1482 CREATE TABLE t1(x INTEGER PRIMARY KEY);
1483 INSERT INTO t1 VALUES (10);
1485 do_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}}
1490 do_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
1500 do_execsql_test 43.2.2 {
1501 SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY 2
1503 1 10 4 15 3 20 6 24 2 25 5 35
1506 do_execsql_test 43.2.3 {
1507 SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY abc
1509 1 10 4 15 3 20 6 24 2 25 5 35
1512 do_execsql_test 43.2.4 {
1513 SELECT a, sum(b) OVER (ORDER BY a) AS abc FROM t1 ORDER BY abc+5
1515 1 10 4 15 3 20 6 24 2 25 5 35
1518 do_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}}
1522 do_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}}
1526 #-------------------------------------------------------------------------
1528 do_execsql_test 44.1 {
1529 CREATE TABLE t0(c0);
1532 do_catchsql_test 44.2.1 {
1533 SELECT ntile(0) OVER ();
1534 } {1 {argument of ntile must be a positive integer}}
1535 do_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}}
1539 do_execsql_test 44.3.1 {
1540 SELECT ntile(1) OVER ();
1542 do_execsql_test 44.3.2 {
1543 SELECT (0, 0) IN(SELECT MIN(c0), NTILE(1) OVER()) FROM t0;
1546 do_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;
1551 #-------------------------------------------------------------------------
1553 do_execsql_test 45.1 {
1556 INSERT INTO t1 VALUES(1000);
1557 INSERT INTO t1 VALUES(1000);
1558 INSERT INTO t0 VALUES(10000);
1560 do_execsql_test 45.2 {
1562 SELECT sum (a) OVER() FROM t1 UNION ALL SELECT x FROM t0
1566 #-------------------------------------------------------------------------
1568 do_execsql_test 46.1 {
1569 CREATE TABLE t1 (a);
1570 CREATE INDEX i1 ON t1(a);
1572 INSERT INTO t1 VALUES (10);
1575 do_execsql_test 46.2 {
1576 SELECT (SELECT sum(a) OVER(ORDER BY a)) FROM t1
1579 do_execsql_test 46.3 {
1580 SELECT * FROM t1 WHERE (SELECT sum(a) OVER(ORDER BY a));
1583 do_execsql_test 46.4 {
1584 SELECT * FROM t1 NATURAL JOIN t1
1586 OR ((SELECT sum(a)OVER(ORDER BY a)) AND a<=10)
1589 #-------------------------------------------------------------------------
1591 do_execsql_test 47.0 {
1601 do_execsql_test 47.1 {
1602 CREATE VIEW t2(k) AS
1603 SELECT e FROM t1 WHERE g = 'abc' OR h BETWEEN 10 AND f;
1606 do_catchsql_test 47.2 {
1609 OR (SELECT k FROM t2 WHERE (SELECT sum(a) OVER() FROM t1 GROUP BY 1));
1610 } {1 {misuse of window function sum()}}
1612 #-------------------------------------------------------------------------
1614 do_execsql_test 48.0 {
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);
1623 do_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);
1628 #-------------------------------------------------------------------------
1630 do_execsql_test 49.1 {
1631 CREATE TABLE t1 (a PRIMARY KEY);
1632 INSERT INTO t1 VALUES(1);
1635 do_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 ())
1646 #-------------------------------------------------------------------------
1648 do_execsql_test 50.0 {
1649 CREATE TABLE t1 (a DOUBLE PRIMARY KEY);
1650 INSERT INTO t1 VALUES(10.0);
1653 do_execsql_test 50.1 {
1654 SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
1657 do_execsql_test 50.2 {
1659 SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
1661 WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 )
1664 do_execsql_test 50.3 {
1667 SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
1669 WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 )
1674 do_execsql_test 50.4 {
1677 SELECT * FROM t1 WHERE a%1 OR (SELECT sum(a) OVER (ORDER BY a%2))
1679 WHERE a=1 OR ( (SELECT sum(a) OVER (ORDER BY a%4)) AND a<=10 )
1681 WHERE a=1 OR ((SELECT sum(a) OVER(ORDER BY a%8)) AND 10<=a)
1684 do_execsql_test 50.5 {
1685 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 (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);
1688 # 2020-04-03 ticket af4556bb5c285c08
1691 do_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}}
1698 #-------------------------------------------------------------------------
1700 do_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);
1708 do_execsql_test 52.2 {
1712 first_value(c) OVER win2,
1713 count(a) OVER (ORDER BY b)
1716 win1 AS (ORDER BY a),
1717 win2 AS (PARTITION BY 6 ORDER BY a
1718 RANGE BETWEEN 5 PRECEDING AND 0 PRECEDING );
1726 do_execsql_test 52.3 {
1730 first_value(c) OVER win2,
1731 count(a) OVER (ORDER BY b)
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 );
1744 do_execsql_test 52.4 {
1748 first_value(c) OVER win2,
1749 count(a) OVER (ORDER BY b)
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 );
1763 # ticket 7a5279a25c57adf1
1766 do_execsql_test 53.0 {
1767 CREATE TABLE a(c UNIQUE);
1768 INSERT INTO a VALUES(4),(0),(9),(-9);
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))
1778 #-------------------------------------------------------------------------
1780 do_execsql_test 54.1 {
1781 CREATE TABLE t1(a VARCHAR(20), b FLOAT);
1782 INSERT INTO t1 VALUES('1',10.0);
1785 do_catchsql_test 54.2 {
1787 SELECT sum(b) OVER() AS c FROM t1
1789 SELECT b AS c FROM t1
1793 do_execsql_test 54.3 {
1794 INSERT INTO t1 VALUES('2',5.0);
1795 INSERT INTO t1 VALUES('3',15.0);
1798 do_catchsql_test 54.4 {
1800 SELECT sum(b) OVER() AS c FROM t1
1802 SELECT b AS c FROM t1
1806 # 2020-06-05 ticket c8d3b9f0a750a529
1808 do_execsql_test 55.1 {
1813 HAVING (SELECT COUNT()OVER() + lead(b)OVER(ORDER BY SUM(DISTINCT b) + b))
1821 #------------------------------------------------------------------------
1823 do_execsql_test 56.1 {
1824 CREATE TABLE t1(a, b INTEGER);
1825 CREATE TABLE t2(c, d);
1827 do_catchsql_test 56.2 {
1828 SELECT avg(b) FROM t1
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}}
1835 do_execsql_test 57.1 {
1836 CREATE TABLE t4(a, b, c, d, e);
1839 do_catchsql_test 57.2 {
1844 SELECT sum(x) OVER() FROM (
1845 SELECT c AS x FROM t4
1848 ORDER BY (SELECT e FROM t4)
1851 } {1 {1st ORDER BY term does not match any column in the result set}}
1853 # 2020-06-06 various dbsqlfuzz finds and
1854 # ticket 0899cf62f597d7e7
1857 do_execsql_test 57.1 {
1858 CREATE TABLE t1(a, b, c);
1859 INSERT INTO t1 VALUES(NULL,NULL,NULL);
1863 count(c) OVER (ORDER BY b)
1866 do_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;
1871 do_catchsql_test 57.3 {
1874 INSERT INTO t1(a) VALUES(22);
1876 INSERT INTO t3(y) VALUES(5),(11),(-9);
1878 SELECT max(y) OVER( ORDER BY (SELECT x FROM (SELECT sum(y) AS x FROM t1)))
1881 } {1 {misuse of aggregate: sum()}}
1883 # 2020-06-06 ticket 1f6f353b684fc708
1885 do_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;
1893 # 2020-06-06 ticket e5504e987e419fb0
1894 do_catchsql_test 59.1 {
1895 DROP TABLE IF EXISTS t1;
1896 CREATE TABLE t1(x INTEGER PRIMARY KEY);
1897 INSERT INTO t1 VALUES (123);
1899 ntile( (SELECT sum(x)) ) OVER(ORDER BY x),
1900 min(x) OVER(ORDER BY x)
1902 } {1 {misuse of aggregate: sum()}}
1904 # 2020-06-07 ticket f7d890858f361402
1905 do_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());
1912 # 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.
1918 do_catchsql_test 61.1 {
1920 INSERT INTO t1 VALUES(5),(NULL),('seventeen');
1921 SELECT (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);
1925 if {$tn==2} { optimization_control db query-flattener 0 }
1926 do_catchsql_test 61.2.$tn {
1928 (SELECT max(x)OVER(ORDER BY x) / min(x) OVER() )
1930 SELECT (SELECT sum(a) FROM t1 ) AS x FROM t1
1937 optimization_control db all 0
1938 do_execsql_test 61.3.0 {
1943 do_execsql_test 61.3.1 {
1945 SELECT count(a) OVER ( ORDER BY (SELECT sum(y) FROM t2) )
1950 do_execsql_test 61.4.2 {
1952 SELECT count(a) OVER ( ORDER BY sum(a) )
1958 do_catchsql_test 61.4.3 {
1960 sum(a) OVER ( ORDER BY a )
1962 ORDER BY (SELECT sum(a) FROM t2)
1963 } {1 {misuse of aggregate: sum()}}
1964 do_execsql_test 61.4.4 {
1966 sum(a) OVER ( ORDER BY a )
1968 ORDER BY (SELECT sum(y) FROM t2)
1972 #-------------------------------------------------------------------------
1974 do_execsql_test 62.1 {
1975 CREATE TABLE t1(a VARCHAR(20), b FLOAT);
1976 INSERT INTO t1 VALUES('1',10.0);
1979 do_execsql_test 62.2 {
1981 SELECT sum(b) OVER() AS c FROM t1
1983 SELECT b AS c FROM t1
1987 do_execsql_test 62.3 {
1988 INSERT INTO t1 VALUES('2',5.0);
1989 INSERT INTO t1 VALUES('3',15.0);
1992 do_execsql_test 62.4 {
1994 SELECT sum(b) OVER() AS c FROM t1
1996 SELECT b AS c FROM t1
2000 #-------------------------------------------------------------------------
2002 do_execsql_test 63.1 {
2003 CREATE TABLE t1(b, x);
2004 CREATE TABLE t2(c, d);
2005 CREATE TABLE t3(e, f);
2008 do_execsql_test 63.2 {
2011 (SELECT c FROM t2 UNION SELECT x ORDER BY c)
2016 do_execsql_test 63.3 {
2021 (SELECT x AS c UNION SELECT 1234 ORDER BY c)
2030 #-------------------------------------------------------------------------
2032 do_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');
2040 do_execsql_test 64.2 {
2041 SELECT rowid, max(b COLLATE nocase)||''
2044 ORDER BY max(b COLLATE nocase)||'';
2045 } {1 abcd 2 BCDE 3 cdef 4 DEFG}
2047 do_execsql_test 64.3 {
2048 SELECT count() OVER (), rowid, max(b COLLATE nocase)||''
2051 ORDER BY max(b COLLATE nocase)||'';
2052 } {4 1 abcd 4 2 BCDE 4 3 cdef 4 4 DEFG}
2054 do_execsql_test 64.4 {
2055 SELECT count() OVER (), rowid, max(b COLLATE nocase)
2058 ORDER BY max(b COLLATE nocase);
2059 } {4 1 abcd 4 2 BCDE 4 3 cdef 4 4 DEFG}
2061 #-------------------------------------------------------------------------
2063 do_execsql_test 65.1 {
2064 CREATE TABLE t1(c1);
2065 INSERT INTO t1 VALUES('abcd');
2067 do_execsql_test 65.2 {
2068 SELECT max(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1;
2071 do_execsql_test 65.3 {
2074 group_concat(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1;
2077 do_execsql_test 65.4 {
2078 SELECT COUNT() OVER () LIKE lead(102030) OVER(
2079 ORDER BY sum('abcdef' COLLATE nocase) IN (SELECT 54321)
2084 #-------------------------------------------------------------------------
2087 do_execsql_test 66.1 {
2088 CREATE TABLE t1(a INTEGER);
2089 INSERT INTO t1 VALUES(3578824042033200656);
2090 INSERT INTO t1 VALUES(3029012920382354029);
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"
2101 do_execsql_test 66.2.$tn "
2102 SELECT total(a) OVER ( $spec ) FROM t1 ORDER BY a
2104 3.02901292038235e+18 3.5788240420332e+18
2109 do_execsql_test 66.3 {
2110 CREATE TABLE t2(a INTEGER);
2111 INSERT INTO t2 VALUES(45);
2112 INSERT INTO t2 VALUES(30);
2115 foreach {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}
2123 do_execsql_test 66.2.$tn "
2124 SELECT total(a) OVER ( $spec ) FROM t2 ORDER BY a
2129 #-------------------------------------------------------------------------
2131 do_execsql_test 67.0 {
2132 CREATE TABLE t1(a, b, c);
2133 CREATE TABLE t2(a, b, c);
2136 do_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)) )
2141 } {1 {no such table: v1}}
2143 do_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)) )
2148 } {1 {1st ORDER BY term does not match any column in the result set}}
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
2156 do_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()}}
2163 # Forum https://sqlite.org/forum/forumpost/7e484e225c
2166 do_catchsql_test 69.0 {
2167 CREATE TABLE t1(a,b);
2168 CREATE INDEX t1ba ON t1(b,a);
2169 SELECT * FROM t1 WHERE b = (SELECT b FROM t1 ORDER BY lead(b) OVER () AND sum(a));
2170 } {1 {misuse of aggregate: sum()}}
2171 do_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()}}
2174 do_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()}}