dan | 86fb6e1 | 2018-05-16 20:58:07 +0000 | [diff] [blame^] | 1 | # 2018 May 8 |
| 2 | # |
| 3 | # The author disclaims copyright to this source code. In place of |
| 4 | # a legal notice, here is a blessing: |
| 5 | # |
| 6 | # May you do good and not evil. |
| 7 | # May you find forgiveness for yourself and forgive others. |
| 8 | # May you share freely, never taking more than you give. |
| 9 | # |
| 10 | #*********************************************************************** |
| 11 | # This file implements regression tests for SQLite library. |
| 12 | # |
| 13 | |
| 14 | set testdir [file dirname $argv0] |
| 15 | source $testdir/tester.tcl |
| 16 | set testprefix window1 |
| 17 | |
| 18 | |
| 19 | do_execsql_test 1.0 { |
| 20 | CREATE TABLE t1(a, b, c, d); |
| 21 | INSERT INTO t1 VALUES(1, 2, 3, 4); |
| 22 | INSERT INTO t1 VALUES(5, 6, 7, 8); |
| 23 | INSERT INTO t1 VALUES(9, 10, 11, 12); |
| 24 | } |
| 25 | |
| 26 | do_execsql_test 1.1 { |
| 27 | SELECT sum(b) OVER () FROM t1 |
| 28 | } {18 18 18} |
| 29 | |
| 30 | do_execsql_test 1.2 { |
| 31 | SELECT a, sum(b) OVER () FROM t1 |
| 32 | } {1 18 5 18 9 18} |
| 33 | |
| 34 | do_execsql_test 1.3 { |
| 35 | SELECT a, 4 + sum(b) OVER () FROM t1 |
| 36 | } {1 22 5 22 9 22} |
| 37 | |
| 38 | do_execsql_test 1.4 { |
| 39 | SELECT a + 4 + sum(b) OVER () FROM t1 |
| 40 | } {23 27 31} |
| 41 | |
| 42 | do_execsql_test 1.5 { |
| 43 | SELECT a, sum(b) OVER (PARTITION BY c) FROM t1 |
| 44 | } {1 2 5 6 9 10} |
| 45 | |
| 46 | foreach {tn sql} { |
| 47 | 1 "SELECT sum(b) OVER () FROM t1" |
| 48 | 2 "SELECT sum(b) OVER (PARTITION BY c) FROM t1" |
| 49 | 3 "SELECT sum(b) OVER (ORDER BY c) FROM t1" |
| 50 | 4 "SELECT sum(b) OVER (PARTITION BY d ORDER BY c) FROM t1" |
| 51 | 5 "SELECT sum(b) FILTER (WHERE a>0) OVER (PARTITION BY d ORDER BY c) FROM t1" |
| 52 | 6 "SELECT sum(b) OVER (ORDER BY c RANGE UNBOUNDED PRECEDING) FROM t1" |
| 53 | 7 "SELECT sum(b) OVER (ORDER BY c ROWS 45 PRECEDING) FROM t1" |
| 54 | 8 "SELECT sum(b) OVER (ORDER BY c RANGE CURRENT ROW) FROM t1" |
| 55 | 9 "SELECT sum(b) OVER (ORDER BY c RANGE BETWEEN UNBOUNDED PRECEDING |
| 56 | AND CURRENT ROW) FROM t1" |
| 57 | 10 "SELECT sum(b) OVER (ORDER BY c ROWS BETWEEN UNBOUNDED PRECEDING |
| 58 | AND UNBOUNDED FOLLOWING) FROM t1" |
| 59 | } { |
| 60 | do_test 2.$tn { lindex [catchsql $sql] 0 } 0 |
| 61 | } |
| 62 | |
| 63 | foreach {tn sql} { |
| 64 | 1 "SELECT * FROM t1 WHERE sum(b) OVER ()" |
| 65 | 2 "SELECT * FROM t1 GROUP BY sum(b) OVER ()" |
| 66 | 3 "SELECT * FROM t1 GROUP BY a HAVING sum(b) OVER ()" |
| 67 | } { |
| 68 | do_catchsql_test 3.$tn $sql {1 {misuse of window function sum()}} |
| 69 | } |
| 70 | |
| 71 | do_execsql_test 4.0 { |
| 72 | CREATE TABLE t2(a, b, c); |
| 73 | INSERT INTO t2 VALUES(0, 0, 0); |
| 74 | INSERT INTO t2 VALUES(1, 1, 1); |
| 75 | INSERT INTO t2 VALUES(2, 0, 2); |
| 76 | INSERT INTO t2 VALUES(3, 1, 0); |
| 77 | INSERT INTO t2 VALUES(4, 0, 1); |
| 78 | INSERT INTO t2 VALUES(5, 1, 2); |
| 79 | INSERT INTO t2 VALUES(6, 0, 0); |
| 80 | } |
| 81 | |
| 82 | do_execsql_test 4.1 { |
| 83 | SELECT a, sum(a) OVER (PARTITION BY b) FROM t2; |
| 84 | } { |
| 85 | 0 12 2 12 4 12 6 12 1 9 3 9 5 9 |
| 86 | } |
| 87 | |
| 88 | do_execsql_test 4.2 { |
| 89 | SELECT a, sum(a) OVER (PARTITION BY b) FROM t2 ORDER BY a; |
| 90 | } { |
| 91 | 0 12 1 9 2 12 3 9 4 12 5 9 6 12 |
| 92 | } |
| 93 | |
| 94 | do_execsql_test 4.3 { |
| 95 | SELECT a, sum(a) OVER () FROM t2 ORDER BY a; |
| 96 | } { |
| 97 | 0 21 1 21 2 21 3 21 4 21 5 21 6 21 |
| 98 | } |
| 99 | |
| 100 | do_execsql_test 4.4 { |
| 101 | SELECT a, sum(a) OVER (ORDER BY a) FROM t2; |
| 102 | } { |
| 103 | 0 0 1 1 2 3 3 6 4 10 5 15 6 21 |
| 104 | } |
| 105 | |
| 106 | do_execsql_test 4.5 { |
| 107 | SELECT a, sum(a) OVER (PARTITION BY b ORDER BY a) FROM t2 ORDER BY a |
| 108 | } { |
| 109 | 0 0 1 1 2 2 3 4 4 6 5 9 6 12 |
| 110 | } |
| 111 | |
| 112 | finish_test |