blob: a8333f19071e8819435bb782e395e2039730674d [file] [log] [blame]
dan0d86a9b2019-03-08 20:57:05 +00001# 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
13source [file join [file dirname $argv0] pg_common.tcl]
14
15#=========================================================================
16
17start_test window8 "2019 March 01"
18ifcapable !windowfunc
19
20execsql_test 1.0 {
21 DROP TABLE IF EXISTS t3;
22 CREATE TABLE t3(a TEXT, b TEXT, c INTEGER);
23 INSERT INTO t3 VALUES
24 ('HH', 'bb', 355), ('CC', 'aa', 158), ('BB', 'aa', 399),
25 ('FF', 'bb', 938), ('HH', 'aa', 480), ('FF', 'bb', 870),
26 ('JJ', 'aa', 768), ('JJ', 'aa', 899), ('GG', 'bb', 929),
27 ('II', 'bb', 421), ('GG', 'bb', 844), ('FF', 'bb', 574),
28 ('CC', 'bb', 822), ('GG', 'bb', 938), ('BB', 'aa', 660),
29 ('HH', 'aa', 979), ('BB', 'bb', 792), ('DD', 'aa', 845),
30 ('JJ', 'bb', 354), ('FF', 'bb', 295), ('JJ', 'aa', 234),
31 ('BB', 'bb', 840), ('AA', 'aa', 934), ('EE', 'aa', 113),
32 ('AA', 'bb', 309), ('BB', 'aa', 412), ('AA', 'aa', 911),
33 ('AA', 'bb', 572), ('II', 'aa', 398), ('II', 'bb', 250),
34 ('II', 'aa', 652), ('BB', 'bb', 633), ('AA', 'aa', 239),
35 ('FF', 'aa', 670), ('BB', 'bb', 705), ('HH', 'bb', 963),
36 ('CC', 'bb', 346), ('II', 'bb', 671), ('BB', 'aa', 247),
37 ('AA', 'aa', 223), ('GG', 'aa', 480), ('HH', 'aa', 790),
38 ('FF', 'aa', 208), ('BB', 'bb', 711), ('EE', 'aa', 777),
39 ('DD', 'bb', 716), ('CC', 'aa', 759), ('CC', 'aa', 430),
40 ('CC', 'aa', 607), ('DD', 'bb', 794), ('GG', 'aa', 148),
41 ('GG', 'aa', 634), ('JJ', 'bb', 257), ('DD', 'bb', 959),
42 ('FF', 'bb', 726), ('BB', 'aa', 762), ('JJ', 'bb', 336),
43 ('GG', 'aa', 335), ('HH', 'bb', 330), ('GG', 'bb', 160),
44 ('JJ', 'bb', 839), ('FF', 'aa', 618), ('BB', 'aa', 393),
45 ('EE', 'bb', 629), ('FF', 'aa', 667), ('AA', 'bb', 870),
46 ('FF', 'bb', 102), ('JJ', 'aa', 113), ('DD', 'aa', 224),
47 ('AA', 'bb', 627), ('HH', 'bb', 730), ('II', 'bb', 443),
48 ('HH', 'bb', 133), ('EE', 'bb', 252), ('II', 'bb', 805),
49 ('BB', 'bb', 786), ('EE', 'bb', 768), ('HH', 'bb', 683),
50 ('DD', 'bb', 238), ('DD', 'aa', 256);
51}
52
53foreach {tn frame} {
54 1 { GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING }
55 2 { GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW }
56 3 { GROUPS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING }
57 4 { GROUPS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING }
58 5 { GROUPS BETWEEN 1 PRECEDING AND 2 PRECEDING }
59 6 { GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING }
60 7 { GROUPS BETWEEN 3 PRECEDING AND 1 PRECEDING }
61 8 { GROUPS BETWEEN 3 PRECEDING AND 0 PRECEDING }
62 9 { GROUPS BETWEEN 2 PRECEDING AND CURRENT ROW }
63 10 { GROUPS BETWEEN 3 PRECEDING AND 0 FOLLOWING }
64 11 { GROUPS BETWEEN 2 PRECEDING AND UNBOUNDED FOLLOWING }
65 12 { GROUPS BETWEEN CURRENT ROW AND 0 FOLLOWING }
66 13 { GROUPS BETWEEN CURRENT ROW AND 1 FOLLOWING }
67 14 { GROUPS BETWEEN CURRENT ROW AND 100 FOLLOWING }
68 15 { GROUPS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
69 16 { GROUPS BETWEEN 0 FOLLOWING AND 0 FOLLOWING }
70 17 { GROUPS BETWEEN 1 FOLLOWING AND 0 FOLLOWING }
71 18 { GROUPS BETWEEN 1 FOLLOWING AND 5 FOLLOWING }
72 19 { GROUPS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING }
73
74} {
75 execsql_test 1.$tn.1 "
76 SELECT a, b, sum(c) OVER (ORDER BY a $frame) FROM t3 ORDER BY 1, 2, 3;
77 "
78 execsql_test 1.$tn.2 "
79 SELECT a, b, sum(c) OVER (ORDER BY a,b $frame) FROM t3 ORDER BY 1, 2, 3;
80 "
81 execsql_test 1.$tn.3 "
82 SELECT a, b, rank() OVER (ORDER BY a $frame) FROM t3 ORDER BY 1, 2, 3;
83 "
84 execsql_test 1.$tn.4 "
85 SELECT a, b, max(c) OVER (ORDER BY a,b $frame) FROM t3 ORDER BY 1, 2, 3;
86 "
87 execsql_test 1.$tn.5 "
88 SELECT a, b, min(c) OVER (ORDER BY a,b $frame) FROM t3 ORDER BY 1, 2, 3;
89 "
danc782a812019-03-15 20:46:19 +000090
91 set f2 "$frame EXCLUDE CURRENT ROW"
92
93 execsql_test 1.$tn.6 "
94 SELECT a, b, sum(c) OVER (ORDER BY a $f2) FROM t3 ORDER BY 1, 2, 3;
95 "
96 execsql_test 1.$tn.7 "
97 SELECT a, b, sum(c) OVER (ORDER BY a,b $f2) FROM t3 ORDER BY 1, 2, 3;
98 "
dand430c2e2019-03-19 11:17:28 +000099
100 execsql_test 1.$tn.8 "
101 SELECT a, b,
102 sum(c) OVER (ORDER BY a $f2),
103 sum(c) OVER (ORDER BY a $frame),
104 sum(c) OVER (ORDER BY a,b $f2),
105 sum(c) OVER (ORDER BY a,b $frame)
106 FROM t3 ORDER BY 1, 2, 3;
107 "
dan0d86a9b2019-03-08 20:57:05 +0000108}
109
dana0f6b832019-03-14 16:36:20 +0000110
111foreach {tn ex} {
112 1 { EXCLUDE NO OTHERS }
113 2 { EXCLUDE CURRENT ROW }
114 3 { EXCLUDE GROUP }
115 4 { EXCLUDE TIES }
116} {
117 execsql_test 2.$tn.1 "
118 SELECT row_number() OVER win
119 FROM t3
120 WINDOW win AS (
121 ORDER BY c, b, a
122 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING $ex
123 )
124 "
125
126 execsql_test 2.$tn.2 "
127 SELECT nth_value(c, 14) OVER win
128 FROM t3
danc782a812019-03-15 20:46:19 +0000129 WINDOW win AS (
130 ORDER BY c, b, a
131 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING $ex
132 )
dana0f6b832019-03-14 16:36:20 +0000133 "
dan1e7cb192019-03-16 20:29:54 +0000134
135 execsql_test 2.$tn.3 "
136 SELECT min(c) OVER win, max(c) OVER win, sum(c) OVER win FROM t3
137 WINDOW win AS (
138 ORDER BY c, b, a
139 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW $ex
140 ) ORDER BY a, b, c;
141 "
dana0f6b832019-03-14 16:36:20 +0000142}
143
dan72b9fdc2019-03-09 20:49:17 +0000144==========
145
dana0f6b832019-03-14 16:36:20 +0000146execsql_test 3.0 {
dan72b9fdc2019-03-09 20:49:17 +0000147 DROP TABLE IF EXISTS t1;
danbb407272019-03-12 18:28:51 +0000148 CREATE TABLE t1(a REAL, b INTEGER);
dan72b9fdc2019-03-09 20:49:17 +0000149 INSERT INTO t1 VALUES
dan71fddaf2019-03-11 11:12:34 +0000150 (5, 10), (10, 20), (13, 26), (13, 26),
151 (15, 30), (20, 40), (22,80), (30, 90);
dan72b9fdc2019-03-09 20:49:17 +0000152}
153
154foreach {tn frame} {
155 1 { ORDER BY a RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
156 2 { ORDER BY a RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
157 3 { ORDER BY a RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING }
dan71fddaf2019-03-11 11:12:34 +0000158 4 { ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING }
159 5 { ORDER BY a DESC RANGE BETWEEN 10 PRECEDING AND 5 PRECEDING }
160 6 { ORDER BY a DESC RANGE BETWEEN 2 FOLLOWING AND 3 FOLLOWING }
danbb407272019-03-12 18:28:51 +0000161
162 7 { ORDER BY a RANGE BETWEEN 5.1 PRECEDING AND 5.3 FOLLOWING }
163 8 { ORDER BY a RANGE BETWEEN 10.2 PRECEDING AND 5.4 PRECEDING }
164 9 { ORDER BY a RANGE BETWEEN 2.6 FOLLOWING AND 3.5 FOLLOWING }
165 10 { ORDER BY a DESC RANGE BETWEEN 5.7 PRECEDING AND 5.8 FOLLOWING }
166 11 { ORDER BY a DESC RANGE BETWEEN UNBOUNDED PRECEDING AND 5.9 PRECEDING }
167 12 { ORDER BY a DESC RANGE BETWEEN 2.1 FOLLOWING AND UNBOUNDED FOLLOWING }
dan8eff0cc2019-03-19 17:45:31 +0000168 13 { ORDER BY a RANGE 5.1 PRECEDING }
dan72b9fdc2019-03-09 20:49:17 +0000169} {
dana0f6b832019-03-14 16:36:20 +0000170 execsql_test 3.$tn "
danbb407272019-03-12 18:28:51 +0000171 SELECT CAST(a AS INTEGER), sum(b) OVER win FROM t1 WINDOW win AS ($frame)
172 "
dan72b9fdc2019-03-09 20:49:17 +0000173}
174
dan1e7cb192019-03-16 20:29:54 +0000175==========
176
177execsql_test 4.0 {
178 DROP TABLE IF EXISTS t1;
179 CREATE TABLE t1(a INTEGER, b INTEGER);
180 INSERT INTO t1 VALUES
181 (NULL, 1), (NULL, 2), (NULL, 3), (10, 4), (10, 5);
182}
183
danbdabe742019-03-18 16:51:24 +0000184execsql_test 4.1.1 {
dan1e7cb192019-03-16 20:29:54 +0000185 SELECT sum(b) OVER (
186 ORDER BY a RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING
187 ) FROM t1 ORDER BY 1;
188}
danbdabe742019-03-18 16:51:24 +0000189execsql_test 4.1.2 {
190 SELECT sum(b) OVER (
191 ORDER BY a DESC RANGE BETWEEN 5 PRECEDING AND 10 FOLLOWING
192 ) FROM t1 ORDER BY 1;
193}
dan72b9fdc2019-03-09 20:49:17 +0000194
danbdabe742019-03-18 16:51:24 +0000195execsql_test 4.2.1 {
196 SELECT sum(b) OVER (
197 ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
198 ) FROM t1 ORDER BY 1 NULLS FIRST;
199}
danbdabe742019-03-18 16:51:24 +0000200execsql_test 4.2.2 {
201 SELECT sum(b) OVER (
danae8e45c2019-08-19 19:59:50 +0000202 ORDER BY a RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
203 ) FROM t1 ORDER BY 1 NULLS LAST;
204}
205
206execsql_test 4.2.3 {
207 SELECT sum(b) OVER (
danbdabe742019-03-18 16:51:24 +0000208 ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
209 ) FROM t1 ORDER BY 1 NULLS FIRST;
210}
danae8e45c2019-08-19 19:59:50 +0000211execsql_test 4.2.4 {
212 SELECT sum(b) OVER (
213 ORDER BY a DESC RANGE BETWEEN 5 FOLLOWING AND 10 FOLLOWING
214 ) FROM t1 ORDER BY 1 NULLS LAST;
215}
danbdabe742019-03-18 16:51:24 +0000216
217execsql_test 4.3.1 {
218 SELECT sum(b) OVER (
219 ORDER BY a NULLS FIRST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
220 ) FROM t1 ORDER BY 1 NULLS FIRST;
221}
danae8e45c2019-08-19 19:59:50 +0000222execsql_test 4.3.2 {
223 SELECT sum(b) OVER (
224 ORDER BY a NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
225 ) FROM t1 ORDER BY 1 NULLS LAST;
226}
danbdabe742019-03-18 16:51:24 +0000227
228execsql_test 4.4.1 {
229 SELECT sum(b) OVER (
230 ORDER BY a NULLS FIRST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
231 ) FROM t1 ORDER BY 1 NULLS FIRST;
232}
danbdabe742019-03-18 16:51:24 +0000233execsql_test 4.4.2 {
234 SELECT sum(b) OVER (
danae8e45c2019-08-19 19:59:50 +0000235 ORDER BY a NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
236 ) FROM t1 ORDER BY 1 NULLS LAST;
237}
238
239execsql_test 4.4.3 {
240 SELECT sum(b) OVER (
danbdabe742019-03-18 16:51:24 +0000241 ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
242 ) FROM t1 ORDER BY 1 NULLS FIRST;
243}
danae8e45c2019-08-19 19:59:50 +0000244execsql_test 4.4.4 {
245 SELECT sum(b) OVER (
246 ORDER BY a DESC NULLS LAST ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
247 ) FROM t1 ORDER BY 1 NULLS LAST;
248}
dan66033422019-03-19 19:19:53 +0000249
dan8b47f522019-08-30 16:14:58 +0000250execsql_test 4.5.1 {
251 SELECT sum(b) OVER (
252 ORDER BY a ASC NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
253 ) FROM t1 ORDER BY 1 NULLS LAST;
254}
255execsql_test 4.5.2 {
256 SELECT sum(b) OVER (
257 ORDER BY a DESC NULLS FIRST RANGE
258 BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING
259 ) FROM t1 ORDER BY 1 NULLS LAST;
260}
261
dan66033422019-03-19 19:19:53 +0000262==========
263
264execsql_test 5.0 {
265 INSERT INTO t3 VALUES
266 (NULL, 'bb', 355), (NULL, 'cc', 158), (NULL, 'aa', 399),
267 ('JJ', NULL, 839), ('FF', NULL, 618), ('BB', NULL, 393),
268 (NULL, 'bb', 629), (NULL, NULL, 667), (NULL, NULL, 870);
269}
270
271foreach {tn ex} {
272 1 { EXCLUDE NO OTHERS }
273 2 { EXCLUDE CURRENT ROW }
274 3 { EXCLUDE GROUP }
275 4 { EXCLUDE TIES }
276} {
277 foreach {tn2 frame} {
278 1 { RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
279 2 { ORDER BY a NULLS FIRST
280 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
281 3 { PARTITION BY coalesce(a, '')
282 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
283 4 { ORDER BY a NULLS FIRST GROUPS 6 PRECEDING }
284 5 { ORDER BY c NULLS FIRST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING }
dan78694ea2019-03-19 19:39:42 +0000285 6 { ORDER BY c NULLS FIRST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING }
286 7 { ORDER BY c NULLS FIRST, b NULLS FIRST, a NULLS FIRST
287 ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING }
danae8e45c2019-08-19 19:59:50 +0000288
289 8 { RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
290 9 { ORDER BY a NULLS LAST
291 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
292 10 { PARTITION BY coalesce(a, '')
293 RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING }
294 11 { ORDER BY a NULLS LAST GROUPS 6 PRECEDING }
295 12 { ORDER BY c NULLS LAST RANGE BETWEEN 6 PRECEDING AND 7 FOLLOWING }
296 13 { ORDER BY c NULLS LAST RANGE BETWEEN 0 PRECEDING AND 0 FOLLOWING }
297 14 { ORDER BY c NULLS LAST, b NULLS LAST, a NULLS LAST
298 ROWS BETWEEN 6 PRECEDING AND UNBOUNDED FOLLOWING }
dan66033422019-03-19 19:19:53 +0000299 } {
300 execsql_test 5.$tn.$tn2.1 "
301 SELECT max(c) OVER win,
dan78694ea2019-03-19 19:39:42 +0000302 min(c) OVER win,
303 count(a) OVER win
dan66033422019-03-19 19:19:53 +0000304 FROM t3
305 WINDOW win AS ( $frame $ex )
dan78694ea2019-03-19 19:39:42 +0000306 ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
dan66033422019-03-19 19:19:53 +0000307 "
308
309 execsql_test 5.$tn.$tn2.2 "
310 SELECT sum(c) FILTER (WHERE (c%2)!=0) OVER win,
dan78694ea2019-03-19 19:39:42 +0000311 rank() OVER win,
312 dense_rank() OVER win
dan66033422019-03-19 19:19:53 +0000313 FROM t3
314 WINDOW win AS ( $frame $ex )
dan78694ea2019-03-19 19:39:42 +0000315 ORDER BY 1 NULLS FIRST, 2 NULLS FIRST, 3 NULLS FIRST
dan66033422019-03-19 19:19:53 +0000316 "
317 }
318}
319
dan3f49c322019-04-03 16:27:44 +0000320==========
321
322execsql_test 6.0 {
323 DROP TABLE IF EXISTS t2;
324 CREATE TABLE t2(a TEXT, b INTEGER);
325 INSERT INTO t2 VALUES('A', NULL);
326 INSERT INTO t2 VALUES('B', NULL);
327 INSERT INTO t2 VALUES('C', 1);
328}
329
330execsql_test 6.1 {
331 SELECT string_agg(a, '.') OVER (
332 ORDER BY b NULLS FIRST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
333 )
334 FROM t2
335}
336
337execsql_test 6.2 {
338 SELECT string_agg(a, '.') OVER (
339 ORDER BY b DESC NULLS LAST RANGE BETWEEN 7 PRECEDING AND 2 PRECEDING
340 )
341 FROM t2
342}
343
dan8b47f522019-08-30 16:14:58 +0000344==========
dan3f49c322019-04-03 16:27:44 +0000345
dan9889ede2019-08-30 19:45:03 +0000346execsql_test 7.0 {
347 DROP TABLE IF EXISTS t2;
348 CREATE TABLE t2(a INTEGER, b INTEGER);
349
350 INSERT INTO t2 VALUES(1, 65);
351 INSERT INTO t2 VALUES(2, NULL);
352 INSERT INTO t2 VALUES(3, NULL);
353 INSERT INTO t2 VALUES(4, NULL);
dan1a97c412019-09-04 06:56:43 +0000354 INSERT INTO t2 VALUES(5, 66);
355 INSERT INTO t2 VALUES(6, 67);
dan9889ede2019-08-30 19:45:03 +0000356}
357
dan1a97c412019-09-04 06:56:43 +0000358foreach {tn f ex} {
359 1 sum ""
360 2 min ""
361 3 sum "EXCLUDE CURRENT ROW"
362 4 max "EXCLUDE CURRENT ROW"
363} {
364execsql_test 7.$tn.1 "
365 SELECT $f (a) OVER win FROM t2
dan9889ede2019-08-30 19:45:03 +0000366 WINDOW win AS (
367 ORDER BY b NULLS LAST RANGE BETWEEN 6 FOLLOWING AND UNBOUNDED FOLLOWING
368 );
dan1a97c412019-09-04 06:56:43 +0000369"
370execsql_test 7.$tn.2 "
371 SELECT $f (a) OVER win FROM t2
372 WINDOW win AS (
373 ORDER BY b NULLS LAST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
374 );
375"
376execsql_test 7.$tn.3 "
377 SELECT $f (a) OVER win FROM t2
378 WINDOW win AS (
379 ORDER BY b NULLS LAST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
380 );
381"
382execsql_test 7.$tn.4 "
383 SELECT $f (a) OVER win FROM t2
384 WINDOW win AS (
385 ORDER BY b NULLS FIRST RANGE BETWEEN 1 PRECEDING AND 2 PRECEDING
386 );
387"
388execsql_test 7.$tn.5 "
389 SELECT $f (a) OVER win FROM t2
390 WINDOW win AS (
391 ORDER BY b NULLS FIRST RANGE BETWEEN 2 FOLLOWING AND 1 FOLLOWING
392 );
393"
394
395execsql_test 7.$tn.6 "
396 SELECT $f (a) OVER win FROM t2
397 WINDOW win AS (
398 ORDER BY b NULLS LAST RANGE BETWEEN 1000 PRECEDING AND 2 PRECEDING
399 );
400"
401execsql_test 7.$tn.7 "
402 SELECT $f (a) OVER win FROM t2
403 WINDOW win AS (
404 ORDER BY b NULLS LAST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
405 );
406"
407execsql_test 7.$tn.8 "
408 SELECT $f (a) OVER win FROM t2
409 WINDOW win AS (
410 ORDER BY b NULLS FIRST RANGE BETWEEN 1000 PRECEDING AND 2000 PRECEDING
411 );
412"
413execsql_test 7.$tn.9 "
414 SELECT $f (a) OVER win FROM t2
415 WINDOW win AS (
416 ORDER BY b NULLS FIRST RANGE BETWEEN 2000 FOLLOWING AND 1000 FOLLOWING
417 );
418"
dan9889ede2019-08-30 19:45:03 +0000419}
danae8e45c2019-08-19 19:59:50 +0000420
dan1a97c412019-09-04 06:56:43 +0000421
422
dan0d86a9b2019-03-08 20:57:05 +0000423finish_test
424
425