update version
[sqlcipher.git] / test / window1.test
blob886bf468ff4ac3bab96974bcd4a7f613b36b683f
1 # 2018 May 8
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 {
19   finish_test
20   return
23 do_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);
30 do_execsql_test 1.1 {
31   SELECT sum(b) OVER () FROM t1
32 } {18 18 18}
34 do_execsql_test 1.2 {
35   SELECT a, sum(b) OVER () FROM t1
36 } {1 18 5 18 9 18}
38 do_execsql_test 1.3 {
39   SELECT a, 4 + sum(b) OVER () FROM t1
40 } {1 22 5 22 9 22}
42 do_execsql_test 1.4 {
43   SELECT a + 4 + sum(b) OVER () FROM t1
44 } {23 27 31}
46 do_execsql_test 1.5 {
47   SELECT a, sum(b) OVER (PARTITION BY c) FROM t1
48 } {1 2 5 6 9 10}
50 foreach {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
67 foreach {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()}}
75 do_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);
86 do_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 
92 do_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   
98 do_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   
104 do_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
110 do_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
116 do_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
122 do_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
128 do_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
143 do_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
158 do_execsql_test 4.10.1 {
159   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
173 do_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
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;
200 } {}
202 #-------------------------------------------------------------------------
203 reset_db
204 do_execsql_test 6.1 {
205   CREATE TABLE t1(x);
206   INSERT INTO t1 VALUES(7), (6), (5), (4), (3), (2), (1);
208   CREATE TABLE t2(x);
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);
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
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.
229 reset_db
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 {
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
275 do_execsql_test 7.3 {
276   SELECT row_number() OVER (ORDER BY x) FROM t1
277 } {1 2 3 4 5}
279 do_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 {}}
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)
300   FROM t3;
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);
310 do_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}
313 do_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}
317 db close
318 sqlite3 db test.db
319 do_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}
322 do_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}
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
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;
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)
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}
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)
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}
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
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}}
390 do_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}}
399 do_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}}
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 (
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
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)
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
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)
458   LIMIT 5
459 } {
460   Horace East       1  
461   Brad North       22 
462   Alice North      56 
463   Charles North   101 
464   Darrell South     8 
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)
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 
479 do_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
496 do_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 
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;
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
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
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
544 #-------------------------------------------------------------------------
545 # Check that it is not possible to use a window function in a CREATE INDEX
546 # statement.
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 
576     FROM t1 WHERE id>1
577    ORDER BY b LIMIT 1;
578 } {2 B two}
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
583     FROM t1 WHERE id>1
584    ORDER BY b LIMIT 2;
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;
599 } {
600   1 1   2 2   2 1   1 2
602 do_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
609 do_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  
617 do_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 
625 do_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;
629 } {}
631 # 2018-12-06
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.
640 sqlite3 db :memory:
641 do_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}
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 (
652     SELECT c IN (
653       SELECT (row_number() OVER()) FROM t1
654     ) AS y FROM t2
655   );
656 } {1 2 3}
658 # 2018-12-31
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)
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}}
688 do_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}
703 do_execsql_test 15.2 {
704   SELECT(
705     WITH c AS(
706       VALUES(1)
707     ) SELECT '' FROM c,c
708   ) x WHERE x+x;
709 } {}
711 #-------------------------------------------------------------------------
713 do_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);
721 do_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
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));
732 } {
733   2 10
734   1 101
735   3 101
738 #-------------------------------------------------------------------------
739 do_execsql_test 17.0 {
740   CREATE TABLE t8(a);
741   INSERT INTO t8 VALUES(1), (2), (3);
744 do_execsql_test 17.1 {
745   SELECT +sum(0) OVER () ORDER BY +sum(0) OVER ();
746 } {0}
748 do_execsql_test 17.2 {
749   select +sum(a) OVER () FROM t8 ORDER BY +sum(a) OVER () DESC;
750 } {6 6 6}
752 do_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}
759 #-------------------------------------------------------------------------
760 # Test error cases from chaining window definitions.
762 reset_db
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} {
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}
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}
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}
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 } {
799   do_catchsql_test 18.1.$tn $sql [list 1 $error]
802 foreach {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}
808   2 {
809     SELECT c, sum(d) OVER (win4 ORDER BY b) FROM t1
810       WINDOW win1 AS ()
811   } {no such window: win4}
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}
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 } {
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)
828   FROM t1
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)
833   FROM t1
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
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}
844 do_execsql_test 18.3.4 {
845   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}
851 do_execsql_test 18.3.5 {
852   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}
861 #-------------------------------------------------------------------------
862 # Test RANGE <expr> PRECEDING/FOLLOWING when there are string, blob
863 # and NULL values in the dataset.
865 reset_db
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
879   ) FROM t1;
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
890   ) FROM t1;
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}
899 reset_db
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;
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
914 do_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}
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
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}
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
941   );
943 do_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
950 #-------------------------------------------------------------------------
951 foreach {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
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
982 #-------------------------------------------------------------------------
983 reset_db
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 {
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
1001 do_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
1008 do_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
1015 do_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
1023 do_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
1031 do_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
1039 do_execsql_test 24.1 {
1040   SELECT sum(44) OVER ()
1041 } {44}
1043 do_execsql_test 24.2 {
1044   SELECT lead(44) OVER ()
1045 } {{}}
1047 #-------------------------------------------------------------------------
1049 reset_db
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
1064     )
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
1071     )
1072 } {3}
1074 #-------------------------------------------------------------------------
1075 reset_db
1076 do_execsql_test 26.0 {
1077   CREATE TABLE t1(x);
1078   CREATE TABLE t2(c);
1081 do_execsql_test 26.1 {
1082   SELECT ( SELECT row_number() OVER () FROM ( SELECT c FROM t1 ) ) FROM t2
1083 } {}
1085 do_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}
1093 do_execsql_test 26.3 {
1094   DELETE FROM t1;
1095   DELETE FROM t2;
1097   INSERT INTO t2 VALUES(1), (2), (3), (4);
1098   INSERT INTO t1 VALUES(1), (1), (2), (3), (3), (3), (3), (4), (4);
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}
1105 #-------------------------------------------------------------------------
1106 reset_db
1107 do_execsql_test 27.0 {
1108   CREATE TABLE t1(x);
1109   INSERT INTO t1 VALUES(NULL), (1), (2), (3), (4), (5);
1111 do_execsql_test 27.1 {
1112   SELECT min(x) FROM t1;
1113 } {1}
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)
1117 } {1 1 1 2 3 4}
1119 #-------------------------------------------------------------------------
1121 reset_db
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)
1131 } {
1132   {} {}
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
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 |
1161 #-------------------------------------------------------------------------
1162 reset_db
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
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 |
1205 # 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.
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);
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}
1225 #-------------------------------------------------------------------------
1226 reset_db
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 (
1239     SELECT * FROM t2
1240   );
1241 } {1}
1243 do_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}
1249 do_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}}
1259 do_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}}
1269 # 2019-11-16 chromium issue 1025467
1270 db close
1271 sqlite3 db :memory:
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}}
1278 reset_db
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);
1283   CREATE TABLE t2(x);
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 
1288   ORDER BY 1;
1289 } {6 1}
1291 reset_db
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 ()
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;
1307 #-------------------------------------------------------------------------
1308 reset_db
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 {
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}
1324 do_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}
1329 do_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}
1334 # 2019-12-07 gramfuzz find
1336 do_execsql_test 36.10 {
1337   VALUES(count(*)OVER());
1338 } {1}
1339 do_execsql_test 36.20 {
1340   VALUES(count(*)OVER()),(2);
1341 } {1 2}
1342 do_execsql_test 36.30 {
1343   VALUES(2),(count(*)OVER());
1344 } {2 1}
1345 do_execsql_test 36.40 {
1346   VALUES(2),(3),(count(*)OVER()),(4),(5);
1347 } {2 3 1 4 5}
1349 # 2019-12-17 crash test case found by Yongheng and Rui
1350 # See check-in 1ca0bd982ab1183b
1352 reset_db
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;
1357 } {}
1358 do_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 } {}
1364 # 2019-12-20 mrigger reported problem with a FILTER clause on an aggregate
1365 # in a join.
1367 reset_db
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;
1377 } {1 1.0}
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()}}
1382 reset_db
1383 do_execsql_test 39.1 {
1384   CREATE TABLE t0(c0 UNIQUE);
1386 do_execsql_test 39.2 {
1387   SELECT FIRST_VALUE(0) OVER();
1388 } {0}
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);
1396 ifcapable 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 {}}
1407 #-------------------------------------------------------------------------
1408 reset_db
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
1420   ) FROM t1
1421 } {355 158 574 929}
1423 do_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}
1429 do_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}
1439 #-------------------------------------------------------------------------
1440 reset_db
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 )
1448 } {}
1449 do_execsql_test 42.3 {
1450   SELECT * FROM t1 WHERE (2, 0) IN ( SELECT count(*), 0 FROM t1 )
1451 } {1 1 1 2 2 2}
1453 do_execsql_test 42.3 {
1454   SELECT count(*), max(a) OVER () FROM t1 GROUP BY c; 
1455 } {1 2 1 2}
1457 do_execsql_test 42.4 {
1458   SELECT sum(a), max(b) OVER () FROM t1;
1459 } {3 1}
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;
1473 } {a 6 6   b 15 21}
1475 do_execsql_test 42.7 {
1476   SELECT sum(b), sum( sum(b) ) OVER (ORDER BY a) FROM t2;
1477 } {21 21}
1479 #-------------------------------------------------------------------------
1480 reset_db
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}}
1489 reset_db
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
1502 } {
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
1508 } {
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
1514 } {
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 #-------------------------------------------------------------------------
1527 reset_db
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 ();
1541 } {1}
1542 do_execsql_test 44.3.2 {
1543   SELECT (0, 0) IN(SELECT MIN(c0), NTILE(1) OVER()) FROM t0;
1544 } {0}
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;
1549 } {1}
1551 #-------------------------------------------------------------------------
1552 reset_db
1553 do_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);
1560 do_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}
1566 #-------------------------------------------------------------------------
1567 reset_db
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
1577 } 10
1579 do_execsql_test 46.3 {
1580   SELECT * FROM t1 WHERE (SELECT sum(a) OVER(ORDER BY a));
1581 } 10
1583 do_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
1589 #-------------------------------------------------------------------------
1590 reset_db
1591 do_execsql_test 47.0 {
1592   CREATE TABLE t1(
1593       a,
1594       e,
1595       f,
1596       g UNIQUE,
1597       h UNIQUE
1598   );
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 {
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()}}
1612 #-------------------------------------------------------------------------
1613 reset_db
1614 do_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}
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);
1626 } {2 2 2}
1628 #-------------------------------------------------------------------------
1629 reset_db
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 ())
1639     ) 
1640     WHERE b=1 OR b<10
1641   ) 
1642   WHERE c=1 OR c>=10;
1643 } {1}
1646 #-------------------------------------------------------------------------
1647 reset_db
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))
1655 } {10.0}
1657 do_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}
1664 do_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}
1674 do_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}
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);
1686 } {10.0}
1688 # 2020-04-03 ticket af4556bb5c285c08
1690 reset_db
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 #-------------------------------------------------------------------------
1699 reset_db
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 {
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
1726 do_execsql_test 52.3 {
1727 SELECT
1728   count() OVER (),
1729   sum(c) OVER win2, 
1730   first_value(c) OVER win2,
1731   count(a) OVER (ORDER BY b)
1732 FROM t1
1733 WINDOW
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
1744 do_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
1762 # 2020-05-23
1763 # ticket 7a5279a25c57adf1
1765 reset_db
1766 do_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}
1778 #-------------------------------------------------------------------------
1779 reset_db
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 {
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;
1791 } {0 {}}
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 {
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;
1804 } {0 {15.0 30.0}}
1806 # 2020-06-05 ticket c8d3b9f0a750a529
1807 reset_db
1808 do_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}
1821 #------------------------------------------------------------------------
1822 reset_db
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 
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}}
1834 reset_db
1835 do_execsql_test 57.1 {
1836   CREATE TABLE t4(a, b, c, d, e);
1839 do_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}}
1853 # 2020-06-06 various dbsqlfuzz finds and
1854 # ticket 0899cf62f597d7e7
1856 reset_db
1857 do_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}
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;
1870 } {10 {}}
1871 do_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()}}
1883 # 2020-06-06 ticket 1f6f353b684fc708
1884 reset_db
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;
1891 } {347 678.0}
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);
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()}}
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());
1910 } {1}
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.
1917 reset_db
1918 do_catchsql_test 61.1 {
1919 CREATE TABLE t1(a);
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);
1922 } {0 {{} {} {}}}
1924 foreach 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     )
1933   } {0 {1.0 1.0 1.0}}
1936 reset_db
1937 optimization_control db all 0 
1938 do_execsql_test 61.3.0 {
1939   CREATE TABLE t1(a);
1940   CREATE TABLE t2(y);
1943 do_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 } {}
1950 do_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}
1958 do_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)
1963 } {1 {misuse of aggregate: sum()}}
1964 do_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)
1972 #-------------------------------------------------------------------------
1973 reset_db
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 {
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;
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 {
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}
2000 #-------------------------------------------------------------------------
2001 reset_db
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 {
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 } {{}}
2016 do_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 } {{}}
2030 #-------------------------------------------------------------------------
2031 reset_db 
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)||'' 
2042   FROM t1 
2043   GROUP BY rowid
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)||'' 
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}
2054 do_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}
2061 #-------------------------------------------------------------------------
2062 reset_db 
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;
2069 } {1}
2071 do_execsql_test 65.3 {
2072   SELECT 
2073      count() OVER (), 
2074      group_concat(c1 COLLATE nocase) IN (SELECT 'aBCd') FROM t1;
2075 } {1 1}
2077 do_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 } {{}}
2084 #-------------------------------------------------------------------------
2085 reset_db
2087 do_execsql_test 66.1 {
2088   CREATE TABLE t1(a INTEGER);
2089   INSERT INTO t1 VALUES(3578824042033200656);
2090   INSERT INTO t1 VALUES(3029012920382354029);
2093 foreach {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   }
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}
2122 } {
2123   do_execsql_test 66.2.$tn "
2124     SELECT total(a) OVER ( $spec ) FROM t2 ORDER BY a
2125   " $res
2129 #-------------------------------------------------------------------------
2130 reset_db
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)) )
2140   )
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)) )
2147   )
2148 } {1 {1st ORDER BY term does not match any column in the result set}}
2150 # 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
2155 reset_db
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()}}
2162 # 2021-05-22
2163 # Forum https://sqlite.org/forum/forumpost/7e484e225c
2165 reset_db
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()}}
2179 finish_test