1# 2018 May 19 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# 12 13package require sqlite3 14package require Pgtcl 15 16set db [pg_connect -conninfo "dbname=postgres user=postgres password=postgres"] 17sqlite3 sqlite "" 18 19proc execsql {sql} { 20 21 set lSql [list] 22 set frag "" 23 while {[string length $sql]>0} { 24 set i [string first ";" $sql] 25 if {$i>=0} { 26 append frag [string range $sql 0 $i] 27 set sql [string range $sql $i+1 end] 28 if {[sqlite complete $frag]} { 29 lappend lSql $frag 30 set frag "" 31 } 32 } else { 33 set frag $sql 34 set sql "" 35 } 36 } 37 if {$frag != ""} { 38 lappend lSql $frag 39 } 40 #puts $lSql 41 42 set ret "" 43 foreach stmt $lSql { 44 set res [pg_exec $::db $stmt] 45 set err [pg_result $res -error] 46 if {$err!=""} { error $err } 47 for {set i 0} {$i < [pg_result $res -numTuples]} {incr i} { 48 if {$i==0} { 49 set ret [pg_result $res -getTuple 0] 50 } else { 51 append ret " [pg_result $res -getTuple $i]" 52 } 53 # lappend ret {*}[pg_result $res -getTuple $i] 54 } 55 pg_result $res -clear 56 } 57 58 set ret 59} 60 61proc execsql_test {tn sql} { 62 set res [execsql $sql] 63 puts $::fd "do_execsql_test $tn {" 64 puts $::fd " [string trim $sql]" 65 puts $::fd "} {$res}" 66 puts $::fd "" 67} 68 69proc start_test {name date} { 70 set dir [file dirname $::argv0] 71 set output [file join $dir $name.test] 72 set ::fd [open $output w] 73puts $::fd [string trimleft " 74# $date 75# 76# The author disclaims copyright to this source code. In place of 77# a legal notice, here is a blessing: 78# 79# May you do good and not evil. 80# May you find forgiveness for yourself and forgive others. 81# May you share freely, never taking more than you give. 82# 83#*********************************************************************** 84# This file implements regression tests for SQLite library. 85# 86 87#################################################### 88# DO NOT EDIT! THIS FILE IS AUTOMATICALLY GENERATED! 89#################################################### 90"] 91 puts $::fd {set testdir [file dirname $argv0]} 92 puts $::fd {source $testdir/tester.tcl} 93 puts $::fd "set testprefix $name" 94 puts $::fd "" 95} 96 97proc -- {args} { 98 puts $::fd "# $args" 99} 100 101proc ========== {args} { 102 puts $::fd "#[string repeat = 74]" 103 puts $::fd "" 104} 105 106proc finish_test {} { 107 puts $::fd finish_test 108 close $::fd 109} 110 111#========================================================================= 112 113 114start_test window2 "2018 May 19" 115 116execsql_test 1.0 { 117 DROP TABLE IF EXISTS t1; 118 CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT, c TEXT, d INTEGER); 119 INSERT INTO t1 VALUES(1, 'odd', 'one', 1); 120 INSERT INTO t1 VALUES(2, 'even', 'two', 2); 121 INSERT INTO t1 VALUES(3, 'odd', 'three', 3); 122 INSERT INTO t1 VALUES(4, 'even', 'four', 4); 123 INSERT INTO t1 VALUES(5, 'odd', 'five', 5); 124 INSERT INTO t1 VALUES(6, 'even', 'six', 6); 125} 126 127execsql_test 1.1 { 128 SELECT c, sum(d) OVER (PARTITION BY b ORDER BY c) FROM t1; 129} 130 131execsql_test 1.2 { 132 SELECT sum(d) OVER () FROM t1; 133} 134 135execsql_test 1.3 { 136 SELECT sum(d) OVER (PARTITION BY b) FROM t1; 137} 138 139========== 140execsql_test 2.1 { 141 SELECT a, sum(d) OVER ( 142 ORDER BY d 143 ROWS BETWEEN 1000 PRECEDING AND 1 FOLLOWING 144 ) FROM t1 145} 146execsql_test 2.2 { 147 SELECT a, sum(d) OVER ( 148 ORDER BY d 149 ROWS BETWEEN 1000 PRECEDING AND 1000 FOLLOWING 150 ) FROM t1 151} 152execsql_test 2.3 { 153 SELECT a, sum(d) OVER ( 154 ORDER BY d 155 ROWS BETWEEN 1 PRECEDING AND 1000 FOLLOWING 156 ) FROM t1 157} 158execsql_test 2.4 { 159 SELECT a, sum(d) OVER ( 160 ORDER BY d 161 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING 162 ) FROM t1 163} 164execsql_test 2.5 { 165 SELECT a, sum(d) OVER ( 166 ORDER BY d 167 ROWS BETWEEN 1 PRECEDING AND 0 FOLLOWING 168 ) FROM t1 169} 170 171execsql_test 2.6 { 172 SELECT a, sum(d) OVER ( 173 PARTITION BY b 174 ORDER BY d 175 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING 176 ) FROM t1 177} 178 179execsql_test 2.7 { 180 SELECT a, sum(d) OVER ( 181 PARTITION BY b 182 ORDER BY d 183 ROWS BETWEEN 0 PRECEDING AND 0 FOLLOWING 184 ) FROM t1 185} 186 187execsql_test 2.8 { 188 SELECT a, sum(d) OVER ( 189 ORDER BY d 190 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING 191 ) FROM t1 192} 193 194execsql_test 2.9 { 195 SELECT a, sum(d) OVER ( 196 ORDER BY d 197 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 FOLLOWING 198 ) FROM t1 199} 200 201execsql_test 2.10 { 202 SELECT a, sum(d) OVER ( 203 ORDER BY d 204 ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING 205 ) FROM t1 206} 207 208execsql_test 2.11 { 209 SELECT a, sum(d) OVER ( 210 ORDER BY d 211 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW 212 ) FROM t1 213} 214 215execsql_test 2.13 { 216 SELECT a, sum(d) OVER ( 217 ORDER BY d 218 ROWS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING 219 ) FROM t1 220} 221 222execsql_test 2.14 { 223 SELECT a, sum(d) OVER ( 224 ORDER BY d 225 ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING 226 ) FROM t1 227} 228 229execsql_test 2.15 { 230 SELECT a, sum(d) OVER ( 231 PARTITION BY b 232 ORDER BY d 233 ROWS BETWEEN 1 PRECEDING AND 0 PRECEDING 234 ) FROM t1 235} 236 237execsql_test 2.16 { 238 SELECT a, sum(d) OVER ( 239 PARTITION BY b 240 ORDER BY d 241 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING 242 ) FROM t1 243} 244 245execsql_test 2.17 { 246 SELECT a, sum(d) OVER ( 247 PARTITION BY b 248 ORDER BY d 249 ROWS BETWEEN 1 PRECEDING AND 2 PRECEDING 250 ) FROM t1 251} 252 253execsql_test 2.18 { 254 SELECT a, sum(d) OVER ( 255 PARTITION BY b 256 ORDER BY d 257 ROWS BETWEEN UNBOUNDED PRECEDING AND 2 PRECEDING 258 ) FROM t1 259} 260 261execsql_test 2.19 { 262 SELECT a, sum(d) OVER ( 263 PARTITION BY b 264 ORDER BY d 265 ROWS BETWEEN 1 FOLLOWING AND 3 FOLLOWING 266 ) FROM t1 267} 268 269execsql_test 2.20 { 270 SELECT a, sum(d) OVER ( 271 ORDER BY d 272 ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING 273 ) FROM t1 274} 275 276execsql_test 2.21 { 277 SELECT a, sum(d) OVER ( 278 ORDER BY d 279 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING 280 ) FROM t1 281} 282 283execsql_test 2.22 { 284 SELECT a, sum(d) OVER ( 285 PARTITION BY b 286 ORDER BY d 287 ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING 288 ) FROM t1 289} 290 291execsql_test 2.23 { 292 SELECT a, sum(d) OVER ( 293 ORDER BY d 294 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 295 ) FROM t1 296} 297 298execsql_test 2.24 { 299 SELECT a, sum(d) OVER ( 300 PARTITION BY a%2 301 ORDER BY d 302 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 303 ) FROM t1 304} 305 306execsql_test 2.25 { 307 SELECT a, sum(d) OVER ( 308 ORDER BY d 309 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 310 ) FROM t1 311} 312 313execsql_test 2.26 { 314 SELECT a, sum(d) OVER ( 315 PARTITION BY b 316 ORDER BY d 317 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 318 ) FROM t1 319} 320 321execsql_test 2.27 { 322 SELECT a, sum(d) OVER ( 323 ORDER BY d 324 ROWS BETWEEN CURRENT ROW AND CURRENT ROW 325 ) FROM t1 326} 327 328execsql_test 2.28 { 329 SELECT a, sum(d) OVER ( 330 PARTITION BY b 331 ORDER BY d 332 ROWS BETWEEN CURRENT ROW AND CURRENT ROW 333 ) FROM t1 334} 335 336execsql_test 2.29 { 337 SELECT a, sum(d) OVER ( 338 ORDER BY d 339 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 340 ) FROM t1 341} 342execsql_test 2.30 { 343 SELECT a, sum(d) OVER ( 344 ORDER BY b 345 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 346 ) FROM t1 347} 348 349execsql_test 3.1 { 350 SELECT a, sum(d) OVER ( 351 PARTITION BY b ORDER BY d 352 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 353 ) FROM t1 354} 355 356execsql_test 3.2 { 357 SELECT a, sum(d) OVER ( 358 ORDER BY b 359 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 360 ) FROM t1 361} 362 363execsql_test 3.3 { 364 SELECT a, sum(d) OVER ( 365 ORDER BY d 366 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 367 ) FROM t1 368} 369 370execsql_test 3.4 { 371 SELECT a, sum(d) OVER ( 372 ORDER BY d/2 373 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 374 ) FROM t1 375} 376 377#puts $::fd finish_test 378 379========== 380 381execsql_test 4.0 { 382 DROP TABLE IF EXISTS t2; 383 CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER); 384 INSERT INTO t2(a, b) VALUES 385 (1,0), (2,74), (3,41), (4,74), (5,23), (6,99), (7,26), (8,33), (9,2), 386 (10,89), (11,81), (12,96), (13,59), (14,38), (15,68), (16,39), (17,62), 387 (18,91), (19,46), (20,6), (21,99), (22,97), (23,27), (24,46), (25,78), 388 (26,54), (27,97), (28,8), (29,67), (30,29), (31,93), (32,84), (33,77), 389 (34,23), (35,16), (36,16), (37,93), (38,65), (39,35), (40,47), (41,7), 390 (42,86), (43,74), (44,61), (45,91), (46,85), (47,24), (48,85), (49,43), 391 (50,59), (51,12), (52,32), (53,56), (54,3), (55,91), (56,22), (57,90), 392 (58,55), (59,15), (60,28), (61,89), (62,25), (63,47), (64,1), (65,56), 393 (66,40), (67,43), (68,56), (69,16), (70,75), (71,36), (72,89), (73,98), 394 (74,76), (75,81), (76,4), (77,94), (78,42), (79,30), (80,78), (81,33), 395 (82,29), (83,53), (84,63), (85,2), (86,87), (87,37), (88,80), (89,84), 396 (90,72), (91,41), (92,9), (93,61), (94,73), (95,95), (96,65), (97,13), 397 (98,58), (99,96), (100,98), (101,1), (102,21), (103,74), (104,65), (105,35), 398 (106,5), (107,73), (108,11), (109,51), (110,87), (111,41), (112,12), (113,8), 399 (114,20), (115,31), (116,31), (117,15), (118,95), (119,22), (120,73), 400 (121,79), (122,88), (123,34), (124,8), (125,11), (126,49), (127,34), 401 (128,90), (129,59), (130,96), (131,60), (132,55), (133,75), (134,77), 402 (135,44), (136,2), (137,7), (138,85), (139,57), (140,74), (141,29), (142,70), 403 (143,59), (144,19), (145,39), (146,26), (147,26), (148,47), (149,80), 404 (150,90), (151,36), (152,58), (153,47), (154,9), (155,72), (156,72), (157,66), 405 (158,33), (159,93), (160,75), (161,64), (162,81), (163,9), (164,23), (165,37), 406 (166,13), (167,12), (168,14), (169,62), (170,91), (171,36), (172,91), 407 (173,33), (174,15), (175,34), (176,36), (177,99), (178,3), (179,95), (180,69), 408 (181,58), (182,52), (183,30), (184,50), (185,84), (186,10), (187,84), 409 (188,33), (189,21), (190,39), (191,44), (192,58), (193,30), (194,38), 410 (195,34), (196,83), (197,27), (198,82), (199,17), (200,7); 411} 412 413execsql_test 4.1 { 414 SELECT a, sum(b) OVER ( 415 PARTITION BY (b%10) 416 ORDER BY b 417 ) FROM t2 ORDER BY a; 418} 419 420execsql_test 4.2 { 421 SELECT a, sum(b) OVER ( 422 PARTITION BY (b%10) 423 ORDER BY b 424 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 425 ) FROM t2 ORDER BY a; 426} 427 428execsql_test 4.3 { 429 SELECT b, sum(b) OVER ( 430 ORDER BY b 431 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 432 ) FROM t2 ORDER BY b; 433} 434 435execsql_test 4.4 { 436 SELECT b, sum(b) OVER ( 437 ORDER BY b 438 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 439 ) FROM t2 ORDER BY b; 440} 441 442execsql_test 4.5 { 443 SELECT b, sum(b) OVER ( 444 ORDER BY b 445 RANGE BETWEEN CURRENT ROW AND CURRENT ROW 446 ) FROM t2 ORDER BY b; 447} 448 449execsql_test 4.6.1 { 450 SELECT b, sum(b) OVER ( 451 RANGE BETWEEN CURRENT ROW AND CURRENT ROW 452 ) FROM t2 ORDER BY b; 453} 454execsql_test 4.6.2 { 455 SELECT b, sum(b) OVER () FROM t2 ORDER BY b; 456} 457execsql_test 4.6.3 { 458 SELECT b, sum(b) OVER ( 459 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 460 ) FROM t2 ORDER BY b; 461} 462execsql_test 4.6.4 { 463 SELECT b, sum(b) OVER ( 464 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 465 ) FROM t2 ORDER BY b; 466} 467 468execsql_test 4.7.1 { 469 SELECT b, sum(b) OVER ( 470 ROWS BETWEEN CURRENT ROW AND CURRENT ROW 471 ) FROM t2 ORDER BY 1, 2; 472} 473execsql_test 4.7.2 { 474 SELECT b, sum(b) OVER ( 475 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 476 ) FROM t2 ORDER BY 1, 2; 477} 478execsql_test 4.7.3 { 479 SELECT b, sum(b) OVER ( 480 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 481 ) FROM t2 ORDER BY 1, 2; 482} 483execsql_test 4.7.4 { 484 SELECT b, sum(b) OVER ( 485 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 486 ) FROM t2 ORDER BY 1, 2; 487} 488 489execsql_test 4.8.1 { 490 SELECT b, sum(b) OVER ( 491 ORDER BY a 492 ROWS BETWEEN CURRENT ROW AND CURRENT ROW 493 ) FROM t2 ORDER BY 1, 2; 494} 495execsql_test 4.8.2 { 496 SELECT b, sum(b) OVER ( 497 ORDER BY a 498 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 499 ) FROM t2 ORDER BY 1, 2; 500} 501execsql_test 4.8.3 { 502 SELECT b, sum(b) OVER ( 503 ORDER BY a 504 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 505 ) FROM t2 ORDER BY 1, 2; 506} 507execsql_test 4.8.4 { 508 SELECT b, sum(b) OVER ( 509 ORDER BY a 510 ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING 511 ) FROM t2 ORDER BY 1, 2; 512} 513 514 515 516finish_test 517 518 519