xref: /sqlite-3.40.0/test/window2.tcl (revision d6f784ef)
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