1# 2019 June 8 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. 12# 13 14set testdir [file dirname $argv0] 15source $testdir/tester.tcl 16set testprefix window9 17 18ifcapable !windowfunc { 19 finish_test 20 return 21} 22 23do_execsql_test 1.0 { 24 CREATE TABLE fruits( 25 name TEXT COLLATE NOCASE, 26 color TEXT COLLATE NOCASE 27 ); 28} 29 30do_execsql_test 1.1 { 31 INSERT INTO fruits (name, color) VALUES ('apple', 'RED'); 32 INSERT INTO fruits (name, color) VALUES ('APPLE', 'yellow'); 33 INSERT INTO fruits (name, color) VALUES ('pear', 'YELLOW'); 34 INSERT INTO fruits (name, color) VALUES ('PEAR', 'green'); 35} 36 37do_execsql_test 1.2 { 38 SELECT name, color, dense_rank() OVER (ORDER BY name) FROM fruits; 39} { 40 apple RED 1 41 APPLE yellow 1 42 pear YELLOW 2 43 PEAR green 2 44} 45 46do_execsql_test 1.3 { 47 SELECT name, color, 48 dense_rank() OVER (PARTITION BY name ORDER BY color) 49 FROM fruits; 50} { 51 apple RED 1 52 APPLE yellow 2 53 PEAR green 1 54 pear YELLOW 2 55} 56 57do_execsql_test 1.4 { 58 SELECT name, color, 59 dense_rank() OVER (ORDER BY name), 60 dense_rank() OVER (PARTITION BY name ORDER BY color) 61 FROM fruits; 62} { 63 apple RED 1 1 64 APPLE yellow 1 2 65 PEAR green 2 1 66 pear YELLOW 2 2 67} 68 69do_execsql_test 1.5 { 70 SELECT name, color, 71 dense_rank() OVER (ORDER BY name), 72 dense_rank() OVER (PARTITION BY name ORDER BY color) 73 FROM fruits ORDER BY color; 74} { 75 PEAR green 2 1 76 apple RED 1 1 77 APPLE yellow 1 2 78 pear YELLOW 2 2 79} 80 81do_execsql_test 2.0 { 82 CREATE TABLE t1(a BLOB, b INTEGER, c COLLATE nocase); 83 INSERT INTO t1 VALUES(1, 2, 'abc'); 84 INSERT INTO t1 VALUES(3, 4, 'ABC'); 85} 86 87do_execsql_test 2.1.1 { 88 SELECT c=='Abc' FROM t1 89} {1 1} 90do_execsql_test 2.1.2 { 91 SELECT c=='Abc', rank() OVER (ORDER BY b) FROM t1 92} {1 1 1 2} 93 94do_execsql_test 2.2.1 { 95 SELECT b=='2' FROM t1 96} {1 0} 97do_execsql_test 2.2.2 { 98 SELECT b=='2', rank() OVER (ORDER BY a) FROM t1 99} {1 1 0 2} 100 101#------------------------------------------------------------------------- 102reset_db 103do_execsql_test 3.0 { 104 CREATE TABLE t1(a); 105 CREATE TABLE t2(a,b,c); 106} 107 108do_execsql_test 3.1 { 109 SELECT EXISTS(SELECT 1 FROM t1 ORDER BY sum(a) OVER ()) FROM t1; 110} 111 112do_execsql_test 3.2 { 113 SELECT sum(a) OVER () FROM t2 114 ORDER BY EXISTS(SELECT 1 FROM t2 ORDER BY sum(a) OVER ()); 115} 116 117do_catchsql_test 3.3 { 118 SELECT a, sum(a) OVER (ORDER BY a DESC) FROM t2 119 ORDER BY EXISTS( 120 SELECT 1 FROM t2 ORDER BY sum(a) OVER (ORDER BY a) 121 ) OVER (ORDER BY a); 122} {1 {near "OVER": syntax error}} 123 124do_catchsql_test 3.4 { 125 SELECT y, y+1, y+2 FROM ( 126 SELECT c IN ( 127 SELECT min(a) OVER (), 128 (abs(row_number() OVER())+22)/19, 129 max(a) OVER () FROM t1 130 ) AS y FROM t2 131 ); 132} {1 {sub-select returns 3 columns - expected 1}} 133 134#------------------------------------------------------------------------- 135reset_db 136do_execsql_test 4.0 { 137 CREATE TABLE t1(a, b TEXT); 138 INSERT INTO t1 VALUES('A', 1), ('A', 2), ('2', 1), ('2', 2); 139} 140 141do_execsql_test 4.1.1 { 142 SELECT b, b=count(*), '1,2' FROM t1 GROUP BY b; 143} {1 0 1,2 2 1 1,2} 144do_execsql_test 4.1.2 { 145 SELECT b, b=count(*), group_concat(b) OVER () FROM t1 GROUP BY b; 146} {1 0 1,2 2 1 1,2} 147 148#-------------------------------------------------------------------------- 149reset_db 150do_execsql_test 5.0 { 151 CREATE TABLE t1(a, b, c, d, e); 152 CREATE INDEX i1 ON t1(a, b, c, d, e); 153} 154 155foreach {tn sql} { 156 1 { 157 SELECT 158 sum(e) OVER (), 159 sum(e) OVER (ORDER BY a), 160 sum(e) OVER (PARTITION BY a ORDER BY b), 161 sum(e) OVER (PARTITION BY a, b ORDER BY c), 162 sum(e) OVER (PARTITION BY a, b, c ORDER BY d) 163 FROM t1; 164 } 165 2 { 166 SELECT sum(e) OVER (PARTITION BY a ORDER BY b) FROM t1 ORDER BY a; 167 } 168} { 169 do_test 5.1.$tn { 170 execsql "EXPLAIN QUERY PLAN $sql" 171 } {~/ORDER/} 172} 173 174#------------------------------------------------------------------------- 175reset_db 176do_execsql_test 6.0 { 177 CREATE TABLE t0(c0); 178 INSERT INTO t0(c0) VALUES (0); 179} 180 181do_execsql_test 6.1 { 182 SELECT * FROM t0 WHERE 183 EXISTS ( 184 SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0 185 ) >=1 AND 186 EXISTS ( 187 SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0 188 ) <=1; 189} {0} 190 191do_execsql_test 6.2 { 192 SELECT * FROM t0 WHERE EXISTS ( 193 SELECT MIN(c0) OVER (), CUME_DIST() OVER () FROM t0 194 ) 195 BETWEEN 1 AND 1; 196} {0} 197 198#------------------------------------------------------------------------- 199reset_db 200do_execsql_test 7.0 { 201 DROP TABLE IF EXISTS t1; 202 CREATE TABLE t1(x, y); 203 INSERT INTO t1 VALUES(10, 1); 204 INSERT INTO t1 VALUES(20, 2); 205 INSERT INTO t1 VALUES(3, 3); 206 INSERT INTO t1 VALUES(2, 4); 207 INSERT INTO t1 VALUES(1, 5); 208} {} 209 210 211do_execsql_test 7.1 { 212 SELECT avg(x) OVER (ORDER BY y) AS z FROM t1 ORDER BY z 213} { 214 7.2 8.75 10.0 11.0 15.0 215} 216 217do_execsql_test 7.2 { 218 SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (z IS y); 219} { 220 10.0 15.0 11.0 8.75 7.2 221} 222 223do_execsql_test 7.3 { 224 SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY (y IS z); 225} { 226 10.0 15.0 11.0 8.75 7.2 227} 228 229do_execsql_test 7.4 { 230 SELECT avg(x) OVER (ORDER BY y) z FROM t1 ORDER BY z + 0.0; 231} { 232 7.2 8.75 10.0 11.0 15.0 233} 234 235#------------------------------------------------------------------------- 236reset_db 237do_execsql_test 8.1.1 { 238 CREATE TABLE t1(a, b); 239 INSERT INTO t1 VALUES(1, 2), (3, 4); 240 SELECT min( sum(a) ) OVER () FROM t1; 241} {4} 242 243do_execsql_test 8.1.2 { 244 SELECT min( sum(a) ) OVER () FROM t1 GROUP BY a; 245} {1 1} 246 247do_execsql_test 8.2 { 248 CREATE VIEW v1 AS 249 SELECT 0 AS x 250 UNION 251 SELECT count() OVER() FROM (SELECT 0) 252 ORDER BY 1 253 ; 254} 255 256do_catchsql_test 8.3 { 257 SELECT min( max((SELECT x FROM v1)) ) OVER() 258} {0 0} 259 260do_execsql_test 8.4 { 261 SELECT( 262 SELECT x UNION 263 SELECT sum( avg((SELECT x FROM v1)) ) OVER() 264 ) 265 FROM v1; 266} {0.0 0.0} 267 268#-------------------------------------------------------------------------- 269reset_db 270do_execsql_test 9.0 { 271 CREATE TABLE t1(a, b, c); 272 INSERT INTO t1 VALUES(NULL,'bb',356); 273 INSERT INTO t1 VALUES('CB','aa',158); 274 INSERT INTO t1 VALUES('BB','aa',399); 275 INSERT INTO t1 VALUES('FF','bb',938); 276} 277 278do_catchsql_test 9.1 { 279 SELECT sum(c) OVER ( 280 ORDER BY c RANGE BETWEEN 0 PRECEDING AND '-700' PRECEDING 281 ) 282 FROM t1 283} {1 {frame ending offset must be a non-negative number}} 284 285finish_test 286