/ Hex Artifact Content
Login

Artifact 97de3829e0e1aae2c3aaae41a55c54bc1b0751bbc80dfdd93020431b7a889dad:


0000: 23 20 32 30 31 38 20 4d 61 79 20 31 39 0a 23 0a  # 2018 May 19.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou give..#.#****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 0a 23 0a 0a 73 6f 75 72 63 65 20 5b 66  ***.#..source [f
0170: 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64  ile join [file d
0180: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 20 70  irname $argv0] p
0190: 67 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 5d 0a 0a 23  g_common.tcl]..#
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 73 74 61 72 74  =========..start
01f0: 5f 74 65 73 74 20 77 69 6e 64 6f 77 38 20 22 32  _test window8 "2
0200: 30 31 39 20 4d 61 72 63 68 20 30 31 22 0a 69 66  019 March 01".if
0210: 63 61 70 61 62 6c 65 20 21 77 69 6e 64 6f 77 66  capable !windowf
0220: 75 6e 63 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73  unc..execsql_tes
0230: 74 20 31 2e 30 20 7b 0a 20 20 44 52 4f 50 20 54  t 1.0 {.  DROP T
0240: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
0250: 33 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  3;.  CREATE TABL
0260: 45 20 74 33 28 61 20 54 45 58 54 2c 20 62 20 54  E t3(a TEXT, b T
0270: 45 58 54 2c 20 63 20 49 4e 54 45 47 45 52 29 3b  EXT, c INTEGER);
0280: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0290: 33 20 56 41 4c 55 45 53 0a 20 20 20 20 28 27 48  3 VALUES.    ('H
02a0: 48 27 2c 20 27 62 62 27 2c 20 33 35 35 29 2c 20  H', 'bb', 355), 
02b0: 28 27 43 43 27 2c 20 27 61 61 27 2c 20 31 35 38  ('CC', 'aa', 158
02c0: 29 2c 20 28 27 42 42 27 2c 20 27 61 61 27 2c 20  ), ('BB', 'aa', 
02d0: 33 39 39 29 2c 20 0a 20 20 20 20 28 27 46 46 27  399), .    ('FF'
02e0: 2c 20 27 62 62 27 2c 20 39 33 38 29 2c 20 28 27  , 'bb', 938), ('
02f0: 48 48 27 2c 20 27 61 61 27 2c 20 34 38 30 29 2c  HH', 'aa', 480),
0300: 20 28 27 46 46 27 2c 20 27 62 62 27 2c 20 38 37   ('FF', 'bb', 87
0310: 30 29 2c 20 0a 20 20 20 20 28 27 4a 4a 27 2c 20  0), .    ('JJ', 
0320: 27 61 61 27 2c 20 37 36 38 29 2c 20 28 27 4a 4a  'aa', 768), ('JJ
0330: 27 2c 20 27 61 61 27 2c 20 38 39 39 29 2c 20 28  ', 'aa', 899), (
0340: 27 47 47 27 2c 20 27 62 62 27 2c 20 39 32 39 29  'GG', 'bb', 929)
0350: 2c 20 0a 20 20 20 20 28 27 49 49 27 2c 20 27 62  , .    ('II', 'b
0360: 62 27 2c 20 34 32 31 29 2c 20 28 27 47 47 27 2c  b', 421), ('GG',
0370: 20 27 62 62 27 2c 20 38 34 34 29 2c 20 28 27 46   'bb', 844), ('F
0380: 46 27 2c 20 27 62 62 27 2c 20 35 37 34 29 2c 20  F', 'bb', 574), 
0390: 0a 20 20 20 20 28 27 43 43 27 2c 20 27 62 62 27  .    ('CC', 'bb'
03a0: 2c 20 38 32 32 29 2c 20 28 27 47 47 27 2c 20 27  , 822), ('GG', '
03b0: 62 62 27 2c 20 39 33 38 29 2c 20 28 27 42 42 27  bb', 938), ('BB'
03c0: 2c 20 27 61 61 27 2c 20 36 36 30 29 2c 20 0a 20  , 'aa', 660), . 
03d0: 20 20 20 28 27 48 48 27 2c 20 27 61 61 27 2c 20     ('HH', 'aa', 
03e0: 39 37 39 29 2c 20 28 27 42 42 27 2c 20 27 62 62  979), ('BB', 'bb
03f0: 27 2c 20 37 39 32 29 2c 20 28 27 44 44 27 2c 20  ', 792), ('DD', 
0400: 27 61 61 27 2c 20 38 34 35 29 2c 20 0a 20 20 20  'aa', 845), .   
0410: 20 28 27 4a 4a 27 2c 20 27 62 62 27 2c 20 33 35   ('JJ', 'bb', 35
0420: 34 29 2c 20 28 27 46 46 27 2c 20 27 62 62 27 2c  4), ('FF', 'bb',
0430: 20 32 39 35 29 2c 20 28 27 4a 4a 27 2c 20 27 61   295), ('JJ', 'a
0440: 61 27 2c 20 32 33 34 29 2c 20 0a 20 20 20 20 28  a', 234), .    (
0450: 27 42 42 27 2c 20 27 62 62 27 2c 20 38 34 30 29  'BB', 'bb', 840)
0460: 2c 20 28 27 41 41 27 2c 20 27 61 61 27 2c 20 39  , ('AA', 'aa', 9
0470: 33 34 29 2c 20 28 27 45 45 27 2c 20 27 61 61 27  34), ('EE', 'aa'
0480: 2c 20 31 31 33 29 2c 20 0a 20 20 20 20 28 27 41  , 113), .    ('A
0490: 41 27 2c 20 27 62 62 27 2c 20 33 30 39 29 2c 20  A', 'bb', 309), 
04a0: 28 27 42 42 27 2c 20 27 61 61 27 2c 20 34 31 32  ('BB', 'aa', 412
04b0: 29 2c 20 28 27 41 41 27 2c 20 27 61 61 27 2c 20  ), ('AA', 'aa', 
04c0: 39 31 31 29 2c 20 0a 20 20 20 20 28 27 41 41 27  911), .    ('AA'
04d0: 2c 20 27 62 62 27 2c 20 35 37 32 29 2c 20 28 27  , 'bb', 572), ('
04e0: 49 49 27 2c 20 27 61 61 27 2c 20 33 39 38 29 2c  II', 'aa', 398),
04f0: 20 28 27 49 49 27 2c 20 27 62 62 27 2c 20 32 35   ('II', 'bb', 25
0500: 30 29 2c 20 0a 20 20 20 20 28 27 49 49 27 2c 20  0), .    ('II', 
0510: 27 61 61 27 2c 20 36 35 32 29 2c 20 28 27 42 42  'aa', 652), ('BB
0520: 27 2c 20 27 62 62 27 2c 20 36 33 33 29 2c 20 28  ', 'bb', 633), (
0530: 27 41 41 27 2c 20 27 61 61 27 2c 20 32 33 39 29  'AA', 'aa', 239)
0540: 2c 20 0a 20 20 20 20 28 27 46 46 27 2c 20 27 61  , .    ('FF', 'a
0550: 61 27 2c 20 36 37 30 29 2c 20 28 27 42 42 27 2c  a', 670), ('BB',
0560: 20 27 62 62 27 2c 20 37 30 35 29 2c 20 28 27 48   'bb', 705), ('H
0570: 48 27 2c 20 27 62 62 27 2c 20 39 36 33 29 2c 20  H', 'bb', 963), 
0580: 0a 20 20 20 20 28 27 43 43 27 2c 20 27 62 62 27  .    ('CC', 'bb'
0590: 2c 20 33 34 36 29 2c 20 28 27 49 49 27 2c 20 27  , 346), ('II', '
05a0: 62 62 27 2c 20 36 37 31 29 2c 20 28 27 42 42 27  bb', 671), ('BB'
05b0: 2c 20 27 61 61 27 2c 20 32 34 37 29 2c 20 0a 20  , 'aa', 247), . 
05c0: 20 20 20 28 27 41 41 27 2c 20 27 61 61 27 2c 20     ('AA', 'aa', 
05d0: 32 32 33 29 2c 20 28 27 47 47 27 2c 20 27 61 61  223), ('GG', 'aa
05e0: 27 2c 20 34 38 30 29 2c 20 28 27 48 48 27 2c 20  ', 480), ('HH', 
05f0: 27 61 61 27 2c 20 37 39 30 29 2c 20 0a 20 20 20  'aa', 790), .   
0600: 20 28 27 46 46 27 2c 20 27 61 61 27 2c 20 32 30   ('FF', 'aa', 20
0610: 38 29 2c 20 28 27 42 42 27 2c 20 27 62 62 27 2c  8), ('BB', 'bb',
0620: 20 37 31 31 29 2c 20 28 27 45 45 27 2c 20 27 61   711), ('EE', 'a
0630: 61 27 2c 20 37 37 37 29 2c 20 0a 20 20 20 20 28  a', 777), .    (
0640: 27 44 44 27 2c 20 27 62 62 27 2c 20 37 31 36 29  'DD', 'bb', 716)
0650: 2c 20 28 27 43 43 27 2c 20 27 61 61 27 2c 20 37  , ('CC', 'aa', 7
0660: 35 39 29 2c 20 28 27 43 43 27 2c 20 27 61 61 27  59), ('CC', 'aa'
0670: 2c 20 34 33 30 29 2c 20 0a 20 20 20 20 28 27 43  , 430), .    ('C
0680: 43 27 2c 20 27 61 61 27 2c 20 36 30 37 29 2c 20  C', 'aa', 607), 
0690: 28 27 44 44 27 2c 20 27 62 62 27 2c 20 37 39 34  ('DD', 'bb', 794
06a0: 29 2c 20 28 27 47 47 27 2c 20 27 61 61 27 2c 20  ), ('GG', 'aa', 
06b0: 31 34 38 29 2c 20 0a 20 20 20 20 28 27 47 47 27  148), .    ('GG'
06c0: 2c 20 27 61 61 27 2c 20 36 33 34 29 2c 20 28 27  , 'aa', 634), ('
06d0: 4a 4a 27 2c 20 27 62 62 27 2c 20 32 35 37 29 2c  JJ', 'bb', 257),
06e0: 20 28 27 44 44 27 2c 20 27 62 62 27 2c 20 39 35   ('DD', 'bb', 95
06f0: 39 29 2c 20 0a 20 20 20 20 28 27 46 46 27 2c 20  9), .    ('FF', 
0700: 27 62 62 27 2c 20 37 32 36 29 2c 20 28 27 42 42  'bb', 726), ('BB
0710: 27 2c 20 27 61 61 27 2c 20 37 36 32 29 2c 20 28  ', 'aa', 762), (
0720: 27 4a 4a 27 2c 20 27 62 62 27 2c 20 33 33 36 29  'JJ', 'bb', 336)
0730: 2c 20 0a 20 20 20 20 28 27 47 47 27 2c 20 27 61  , .    ('GG', 'a
0740: 61 27 2c 20 33 33 35 29 2c 20 28 27 48 48 27 2c  a', 335), ('HH',
0750: 20 27 62 62 27 2c 20 33 33 30 29 2c 20 28 27 47   'bb', 330), ('G
0760: 47 27 2c 20 27 62 62 27 2c 20 31 36 30 29 2c 20  G', 'bb', 160), 
0770: 0a 20 20 20 20 28 27 4a 4a 27 2c 20 27 62 62 27  .    ('JJ', 'bb'
0780: 2c 20 38 33 39 29 2c 20 28 27 46 46 27 2c 20 27  , 839), ('FF', '
0790: 61 61 27 2c 20 36 31 38 29 2c 20 28 27 42 42 27  aa', 618), ('BB'
07a0: 2c 20 27 61 61 27 2c 20 33 39 33 29 2c 20 0a 20  , 'aa', 393), . 
07b0: 20 20 20 28 27 45 45 27 2c 20 27 62 62 27 2c 20     ('EE', 'bb', 
07c0: 36 32 39 29 2c 20 28 27 46 46 27 2c 20 27 61 61  629), ('FF', 'aa
07d0: 27 2c 20 36 36 37 29 2c 20 28 27 41 41 27 2c 20  ', 667), ('AA', 
07e0: 27 62 62 27 2c 20 38 37 30 29 2c 20 0a 20 20 20  'bb', 870), .   
07f0: 20 28 27 46 46 27 2c 20 27 62 62 27 2c 20 31 30   ('FF', 'bb', 10
0800: 32 29 2c 20 28 27 4a 4a 27 2c 20 27 61 61 27 2c  2), ('JJ', 'aa',
0810: 20 31 31 33 29 2c 20 28 27 44 44 27 2c 20 27 61   113), ('DD', 'a
0820: 61 27 2c 20 32 32 34 29 2c 20 0a 20 20 20 20 28  a', 224), .    (
0830: 27 41 41 27 2c 20 27 62 62 27 2c 20 36 32 37 29  'AA', 'bb', 627)
0840: 2c 20 28 27 48 48 27 2c 20 27 62 62 27 2c 20 37  , ('HH', 'bb', 7
0850: 33 30 29 2c 20 28 27 49 49 27 2c 20 27 62 62 27  30), ('II', 'bb'
0860: 2c 20 34 34 33 29 2c 20 0a 20 20 20 20 28 27 48  , 443), .    ('H
0870: 48 27 2c 20 27 62 62 27 2c 20 31 33 33 29 2c 20  H', 'bb', 133), 
0880: 28 27 45 45 27 2c 20 27 62 62 27 2c 20 32 35 32  ('EE', 'bb', 252
0890: 29 2c 20 28 27 49 49 27 2c 20 27 62 62 27 2c 20  ), ('II', 'bb', 
08a0: 38 30 35 29 2c 20 0a 20 20 20 20 28 27 42 42 27  805), .    ('BB'
08b0: 2c 20 27 62 62 27 2c 20 37 38 36 29 2c 20 28 27  , 'bb', 786), ('
08c0: 45 45 27 2c 20 27 62 62 27 2c 20 37 36 38 29 2c  EE', 'bb', 768),
08d0: 20 28 27 48 48 27 2c 20 27 62 62 27 2c 20 36 38   ('HH', 'bb', 68
08e0: 33 29 2c 20 0a 20 20 20 20 28 27 44 44 27 2c 20  3), .    ('DD', 
08f0: 27 62 62 27 2c 20 32 33 38 29 2c 20 28 27 44 44  'bb', 238), ('DD
0900: 27 2c 20 27 61 61 27 2c 20 32 35 36 29 3b 0a 7d  ', 'aa', 256);.}
0910: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 66 72  ..foreach {tn fr
0920: 61 6d 65 7d 20 7b 0a 20 20 31 20 20 7b 20 47 52  ame} {.  1  { GR
0930: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 55 4e 42  OUPS BETWEEN UNB
0940: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
0950: 20 41 4e 44 20 31 20 50 52 45 43 45 44 49 4e 47   AND 1 PRECEDING
0960: 20 7d 0a 20 20 32 20 20 7b 20 47 52 4f 55 50 53   }.  2  { GROUPS
0970: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
0980: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
0990: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 7d 0a 20   CURRENT ROW }. 
09a0: 20 33 20 20 7b 20 47 52 4f 55 50 53 20 42 45 54   3  { GROUPS BET
09b0: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
09c0: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 31 20 46  RECEDING AND 1 F
09d0: 4f 4c 4c 4f 57 49 4e 47 20 7d 0a 20 20 34 20 20  OLLOWING }.  4  
09e0: 7b 20 47 52 4f 55 50 53 20 42 45 54 57 45 45 4e  { GROUPS BETWEEN
09f0: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
0a00: 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44  DING AND UNBOUND
0a10: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 20 7d 0a 20  ED FOLLOWING }. 
0a20: 20 35 20 20 7b 20 47 52 4f 55 50 53 20 42 45 54   5  { GROUPS BET
0a30: 57 45 45 4e 20 31 20 50 52 45 43 45 44 49 4e 47  WEEN 1 PRECEDING
0a40: 20 20 20 20 20 20 20 20 20 41 4e 44 20 32 20 50           AND 2 P
0a50: 52 45 43 45 44 49 4e 47 20 7d 0a 20 20 36 20 20  RECEDING }.  6  
0a60: 7b 20 47 52 4f 55 50 53 20 42 45 54 57 45 45 4e  { GROUPS BETWEEN
0a70: 20 32 20 50 52 45 43 45 44 49 4e 47 20 20 20 20   2 PRECEDING    
0a80: 20 20 20 20 20 41 4e 44 20 31 20 50 52 45 43 45       AND 1 PRECE
0a90: 44 49 4e 47 20 7d 0a 20 20 37 20 20 7b 20 47 52  DING }.  7  { GR
0aa0: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 33 20 50  OUPS BETWEEN 3 P
0ab0: 52 45 43 45 44 49 4e 47 20 20 20 20 20 20 20 20  RECEDING        
0ac0: 20 41 4e 44 20 31 20 50 52 45 43 45 44 49 4e 47   AND 1 PRECEDING
0ad0: 20 7d 0a 20 20 38 20 20 7b 20 47 52 4f 55 50 53   }.  8  { GROUPS
0ae0: 20 42 45 54 57 45 45 4e 20 33 20 50 52 45 43 45   BETWEEN 3 PRECE
0af0: 44 49 4e 47 20 20 20 20 20 20 20 20 20 41 4e 44  DING         AND
0b00: 20 30 20 50 52 45 43 45 44 49 4e 47 20 7d 0a 20   0 PRECEDING }. 
0b10: 20 39 20 20 7b 20 47 52 4f 55 50 53 20 42 45 54   9  { GROUPS BET
0b20: 57 45 45 4e 20 32 20 50 52 45 43 45 44 49 4e 47  WEEN 2 PRECEDING
0b30: 20 20 20 20 20 20 20 20 20 41 4e 44 20 43 55 52           AND CUR
0b40: 52 45 4e 54 20 52 4f 57 20 7d 0a 20 20 31 30 20  RENT ROW }.  10 
0b50: 7b 20 47 52 4f 55 50 53 20 42 45 54 57 45 45 4e  { GROUPS BETWEEN
0b60: 20 33 20 50 52 45 43 45 44 49 4e 47 20 20 20 20   3 PRECEDING    
0b70: 20 20 20 20 20 41 4e 44 20 30 20 46 4f 4c 4c 4f       AND 0 FOLLO
0b80: 57 49 4e 47 20 7d 0a 20 20 31 31 20 7b 20 47 52  WING }.  11 { GR
0b90: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 32 20 50  OUPS BETWEEN 2 P
0ba0: 52 45 43 45 44 49 4e 47 20 20 20 20 20 20 20 20  RECEDING        
0bb0: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
0bc0: 4f 4c 4c 4f 57 49 4e 47 20 7d 0a 20 20 31 32 20  OLLOWING }.  12 
0bd0: 7b 20 47 52 4f 55 50 53 20 42 45 54 57 45 45 4e  { GROUPS BETWEEN
0be0: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20 20   CURRENT ROW    
0bf0: 20 20 20 20 20 41 4e 44 20 30 20 46 4f 4c 4c 4f       AND 0 FOLLO
0c00: 57 49 4e 47 20 7d 0a 20 20 31 33 20 7b 20 47 52  WING }.  13 { GR
0c10: 4f 55 50 53 20 42 45 54 57 45 45 4e 20 43 55 52  OUPS BETWEEN CUR
0c20: 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20 20 20  RENT ROW        
0c30: 20 41 4e 44 20 31 20 46 4f 4c 4c 4f 57 49 4e 47   AND 1 FOLLOWING
0c40: 20 7d 0a 20 20 31 34 20 7b 20 47 52 4f 55 50 53   }.  14 { GROUPS
0c50: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
0c60: 20 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44   ROW         AND
0c70: 20 31 30 30 20 46 4f 4c 4c 4f 57 49 4e 47 20 7d   100 FOLLOWING }
0c80: 0a 20 20 31 35 20 7b 20 47 52 4f 55 50 53 20 42  .  15 { GROUPS B
0c90: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
0ca0: 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44 20 55  OW         AND U
0cb0: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
0cc0: 4e 47 20 7d 0a 20 20 31 36 20 7b 20 47 52 4f 55  NG }.  16 { GROU
0cd0: 50 53 20 42 45 54 57 45 45 4e 20 30 20 46 4f 4c  PS BETWEEN 0 FOL
0ce0: 4c 4f 57 49 4e 47 20 20 20 20 20 20 20 20 20 41  LOWING         A
0cf0: 4e 44 20 30 20 46 4f 4c 4c 4f 57 49 4e 47 20 7d  ND 0 FOLLOWING }
0d00: 0a 20 20 31 37 20 7b 20 47 52 4f 55 50 53 20 42  .  17 { GROUPS B
0d10: 45 54 57 45 45 4e 20 31 20 46 4f 4c 4c 4f 57 49  ETWEEN 1 FOLLOWI
0d20: 4e 47 20 20 20 20 20 20 20 20 20 41 4e 44 20 30  NG         AND 0
0d30: 20 46 4f 4c 4c 4f 57 49 4e 47 20 7d 0a 20 20 31   FOLLOWING }.  1
0d40: 38 20 7b 20 47 52 4f 55 50 53 20 42 45 54 57 45  8 { GROUPS BETWE
0d50: 45 4e 20 31 20 46 4f 4c 4c 4f 57 49 4e 47 20 20  EN 1 FOLLOWING  
0d60: 20 20 20 20 20 20 20 41 4e 44 20 35 20 46 4f 4c         AND 5 FOL
0d70: 4c 4f 57 49 4e 47 20 7d 0a 20 20 31 39 20 7b 20  LOWING }.  19 { 
0d80: 47 52 4f 55 50 53 20 42 45 54 57 45 45 4e 20 31  GROUPS BETWEEN 1
0d90: 20 46 4f 4c 4c 4f 57 49 4e 47 20 20 20 20 20 20   FOLLOWING      
0da0: 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44     AND UNBOUNDED
0db0: 20 46 4f 4c 4c 4f 57 49 4e 47 20 7d 0a 0a 7d 20   FOLLOWING }..} 
0dc0: 7b 0a 20 20 65 78 65 63 73 71 6c 5f 74 65 73 74  {.  execsql_test
0dd0: 20 31 2e 24 74 6e 2e 31 20 22 0a 20 20 20 20 53   1.$tn.1 ".    S
0de0: 45 4c 45 43 54 20 61 2c 20 62 2c 20 73 75 6d 28  ELECT a, b, sum(
0df0: 63 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42  c) OVER (ORDER B
0e00: 59 20 61 20 24 66 72 61 6d 65 29 20 46 52 4f 4d  Y a $frame) FROM
0e10: 20 74 33 20 4f 52 44 45 52 20 42 59 20 31 2c 20   t3 ORDER BY 1, 
0e20: 32 2c 20 33 3b 0a 20 20 22 0a 20 20 65 78 65 63  2, 3;.  ".  exec
0e30: 73 71 6c 5f 74 65 73 74 20 31 2e 24 74 6e 2e 32  sql_test 1.$tn.2
0e40: 20 22 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c   ".    SELECT a,
0e50: 20 62 2c 20 73 75 6d 28 63 29 20 4f 56 45 52 20   b, sum(c) OVER 
0e60: 28 4f 52 44 45 52 20 42 59 20 61 2c 62 20 24 66  (ORDER BY a,b $f
0e70: 72 61 6d 65 29 20 46 52 4f 4d 20 74 33 20 4f 52  rame) FROM t3 OR
0e80: 44 45 52 20 42 59 20 31 2c 20 32 2c 20 33 3b 0a  DER BY 1, 2, 3;.
0e90: 20 20 22 0a 20 20 65 78 65 63 73 71 6c 5f 74 65    ".  execsql_te
0ea0: 73 74 20 31 2e 24 74 6e 2e 33 20 22 0a 20 20 20  st 1.$tn.3 ".   
0eb0: 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 72 61   SELECT a, b, ra
0ec0: 6e 6b 28 29 20 4f 56 45 52 20 28 4f 52 44 45 52  nk() OVER (ORDER
0ed0: 20 42 59 20 61 20 24 66 72 61 6d 65 29 20 46 52   BY a $frame) FR
0ee0: 4f 4d 20 74 33 20 4f 52 44 45 52 20 42 59 20 31  OM t3 ORDER BY 1
0ef0: 2c 20 32 2c 20 33 3b 0a 20 20 22 0a 20 20 65 78  , 2, 3;.  ".  ex
0f00: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 24 74 6e  ecsql_test 1.$tn
0f10: 2e 34 20 22 0a 20 20 20 20 53 45 4c 45 43 54 20  .4 ".    SELECT 
0f20: 61 2c 20 62 2c 20 6d 61 78 28 63 29 20 4f 56 45  a, b, max(c) OVE
0f30: 52 20 28 4f 52 44 45 52 20 42 59 20 61 2c 62 20  R (ORDER BY a,b 
0f40: 24 66 72 61 6d 65 29 20 46 52 4f 4d 20 74 33 20  $frame) FROM t3 
0f50: 4f 52 44 45 52 20 42 59 20 31 2c 20 32 2c 20 33  ORDER BY 1, 2, 3
0f60: 3b 0a 20 20 22 0a 20 20 65 78 65 63 73 71 6c 5f  ;.  ".  execsql_
0f70: 74 65 73 74 20 31 2e 24 74 6e 2e 35 20 22 0a 20  test 1.$tn.5 ". 
0f80: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20     SELECT a, b, 
0f90: 6d 69 6e 28 63 29 20 4f 56 45 52 20 28 4f 52 44  min(c) OVER (ORD
0fa0: 45 52 20 42 59 20 61 2c 62 20 24 66 72 61 6d 65  ER BY a,b $frame
0fb0: 29 20 46 52 4f 4d 20 74 33 20 4f 52 44 45 52 20  ) FROM t3 ORDER 
0fc0: 42 59 20 31 2c 20 32 2c 20 33 3b 0a 20 20 22 0a  BY 1, 2, 3;.  ".
0fd0: 0a 20 20 73 65 74 20 66 32 20 22 24 66 72 61 6d  .  set f2 "$fram
0fe0: 65 20 45 58 43 4c 55 44 45 20 43 55 52 52 45 4e  e EXCLUDE CURREN
0ff0: 54 20 52 4f 57 22 0a 0a 20 20 65 78 65 63 73 71  T ROW"..  execsq
1000: 6c 5f 74 65 73 74 20 31 2e 24 74 6e 2e 36 20 22  l_test 1.$tn.6 "
1010: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62  .    SELECT a, b
1020: 2c 20 73 75 6d 28 63 29 20 4f 56 45 52 20 28 4f  , sum(c) OVER (O
1030: 52 44 45 52 20 42 59 20 61 20 24 66 32 29 20 46  RDER BY a $f2) F
1040: 52 4f 4d 20 74 33 20 4f 52 44 45 52 20 42 59 20  ROM t3 ORDER BY 
1050: 31 2c 20 32 2c 20 33 3b 0a 20 20 22 0a 20 20 65  1, 2, 3;.  ".  e
1060: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 24 74  xecsql_test 1.$t
1070: 6e 2e 37 20 22 0a 20 20 20 20 53 45 4c 45 43 54  n.7 ".    SELECT
1080: 20 61 2c 20 62 2c 20 73 75 6d 28 63 29 20 4f 56   a, b, sum(c) OV
1090: 45 52 20 28 4f 52 44 45 52 20 42 59 20 61 2c 62  ER (ORDER BY a,b
10a0: 20 24 66 32 29 20 46 52 4f 4d 20 74 33 20 4f 52   $f2) FROM t3 OR
10b0: 44 45 52 20 42 59 20 31 2c 20 32 2c 20 33 3b 0a  DER BY 1, 2, 3;.
10c0: 20 20 22 0a 0a 20 20 65 78 65 63 73 71 6c 5f 74    "..  execsql_t
10d0: 65 73 74 20 31 2e 24 74 6e 2e 38 20 22 0a 20 20  est 1.$tn.8 ".  
10e0: 20 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 0a    SELECT a, b, .
10f0: 20 20 20 20 20 20 73 75 6d 28 63 29 20 4f 56 45        sum(c) OVE
1100: 52 20 28 4f 52 44 45 52 20 42 59 20 61 20 24 66  R (ORDER BY a $f
1110: 32 29 2c 0a 20 20 20 20 20 20 73 75 6d 28 63 29  2),.      sum(c)
1120: 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20   OVER (ORDER BY 
1130: 61 20 24 66 72 61 6d 65 29 2c 0a 20 20 20 20 20  a $frame),.     
1140: 20 73 75 6d 28 63 29 20 4f 56 45 52 20 28 4f 52   sum(c) OVER (OR
1150: 44 45 52 20 42 59 20 61 2c 62 20 24 66 32 29 2c  DER BY a,b $f2),
1160: 0a 20 20 20 20 20 20 73 75 6d 28 63 29 20 4f 56  .      sum(c) OV
1170: 45 52 20 28 4f 52 44 45 52 20 42 59 20 61 2c 62  ER (ORDER BY a,b
1180: 20 24 66 72 61 6d 65 29 0a 20 20 20 20 46 52 4f   $frame).    FRO
1190: 4d 20 74 33 20 4f 52 44 45 52 20 42 59 20 31 2c  M t3 ORDER BY 1,
11a0: 20 32 2c 20 33 3b 0a 20 20 22 0a 7d 0a 0a 0a 66   2, 3;.  ".}...f
11b0: 6f 72 65 61 63 68 20 7b 74 6e 20 65 78 7d 20 7b  oreach {tn ex} {
11c0: 0a 20 20 31 20 20 7b 20 45 58 43 4c 55 44 45 20  .  1  { EXCLUDE 
11d0: 4e 4f 20 4f 54 48 45 52 53 20 7d 0a 20 20 32 20  NO OTHERS }.  2 
11e0: 20 7b 20 45 58 43 4c 55 44 45 20 43 55 52 52 45   { EXCLUDE CURRE
11f0: 4e 54 20 52 4f 57 20 7d 0a 20 20 33 20 20 7b 20  NT ROW }.  3  { 
1200: 45 58 43 4c 55 44 45 20 47 52 4f 55 50 20 7d 0a  EXCLUDE GROUP }.
1210: 20 20 34 20 20 7b 20 45 58 43 4c 55 44 45 20 54    4  { EXCLUDE T
1220: 49 45 53 20 7d 0a 7d 20 7b 0a 20 20 65 78 65 63  IES }.} {.  exec
1230: 73 71 6c 5f 74 65 73 74 20 32 2e 24 74 6e 2e 31  sql_test 2.$tn.1
1240: 20 22 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f   ".    SELECT ro
1250: 77 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20  w_number() OVER 
1260: 77 69 6e 20 0a 20 20 20 20 46 52 4f 4d 20 74 33  win .    FROM t3
1270: 0a 20 20 20 20 57 49 4e 44 4f 57 20 77 69 6e 20  .    WINDOW win 
1280: 41 53 20 28 0a 20 20 20 20 20 20 4f 52 44 45 52  AS (.      ORDER
1290: 20 42 59 20 63 2c 20 62 2c 20 61 0a 20 20 20 20   BY c, b, a.    
12a0: 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55    ROWS BETWEEN U
12b0: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
12c0: 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  NG AND UNBOUNDED
12d0: 20 46 4f 4c 4c 4f 57 49 4e 47 20 24 65 78 0a 20   FOLLOWING $ex. 
12e0: 20 20 20 29 0a 20 20 22 0a 0a 20 20 65 78 65 63     ).  "..  exec
12f0: 73 71 6c 5f 74 65 73 74 20 32 2e 24 74 6e 2e 32  sql_test 2.$tn.2
1300: 20 22 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 74   ".    SELECT nt
1310: 68 5f 76 61 6c 75 65 28 63 2c 20 31 34 29 20 4f  h_value(c, 14) O
1320: 56 45 52 20 77 69 6e 20 0a 20 20 20 20 46 52 4f  VER win .    FRO
1330: 4d 20 74 33 0a 20 20 20 20 57 49 4e 44 4f 57 20  M t3.    WINDOW 
1340: 77 69 6e 20 41 53 20 28 0a 20 20 20 20 20 20 4f  win AS (.      O
1350: 52 44 45 52 20 42 59 20 63 2c 20 62 2c 20 61 0a  RDER BY c, b, a.
1360: 20 20 20 20 20 20 52 4f 57 53 20 42 45 54 57 45        ROWS BETWE
1370: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1380: 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55  CEDING AND UNBOU
1390: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 20 24  NDED FOLLOWING $
13a0: 65 78 0a 20 20 20 20 29 0a 20 20 22 0a 0a 20 20  ex.    ).  "..  
13b0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 24  execsql_test 2.$
13c0: 74 6e 2e 33 20 22 0a 20 20 20 20 53 45 4c 45 43  tn.3 ".    SELEC
13d0: 54 20 6d 69 6e 28 63 29 20 4f 56 45 52 20 77 69  T min(c) OVER wi
13e0: 6e 2c 20 6d 61 78 28 63 29 20 4f 56 45 52 20 77  n, max(c) OVER w
13f0: 69 6e 2c 20 73 75 6d 28 63 29 20 4f 56 45 52 20  in, sum(c) OVER 
1400: 77 69 6e 20 46 52 4f 4d 20 74 33 0a 20 20 20 20  win FROM t3.    
1410: 57 49 4e 44 4f 57 20 77 69 6e 20 41 53 20 28 0a  WINDOW win AS (.
1420: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 63        ORDER BY c
1430: 2c 20 62 2c 20 61 0a 20 20 20 20 20 20 52 4f 57  , b, a.      ROW
1440: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1450: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1460: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 24 65  D CURRENT ROW $e
1470: 78 0a 20 20 20 20 29 20 4f 52 44 45 52 20 42 59  x.    ) ORDER BY
1480: 20 61 2c 20 62 2c 20 63 3b 0a 20 20 22 0a 7d 0a   a, b, c;.  ".}.
1490: 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 65 78 65  .==========..exe
14a0: 63 73 71 6c 5f 74 65 73 74 20 33 2e 30 20 7b 0a  csql_test 3.0 {.
14b0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
14c0: 45 58 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45  EXISTS t1;.  CRE
14d0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 52  ATE TABLE t1(a R
14e0: 45 41 4c 2c 20 62 20 49 4e 54 45 47 45 52 29 3b  EAL, b INTEGER);
14f0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1500: 31 20 56 41 4c 55 45 53 0a 20 20 20 20 20 20 28  1 VALUES.      (
1510: 35 2c 20 31 30 29 2c 20 28 31 30 2c 20 32 30 29  5, 10), (10, 20)
1520: 2c 20 28 31 33 2c 20 32 36 29 2c 20 28 31 33 2c  , (13, 26), (13,
1530: 20 32 36 29 2c 20 0a 20 20 20 20 20 20 28 31 35   26), .      (15
1540: 2c 20 33 30 29 2c 20 28 32 30 2c 20 34 30 29 2c  , 30), (20, 40),
1550: 20 28 32 32 2c 38 30 29 2c 20 28 33 30 2c 20 39   (22,80), (30, 9
1560: 30 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b  0);.}..foreach {
1570: 74 6e 20 66 72 61 6d 65 7d 20 7b 0a 20 20 31 20  tn frame} {.  1 
1580: 7b 20 4f 52 44 45 52 20 42 59 20 61 20 52 41 4e  { ORDER BY a RAN
1590: 47 45 20 42 45 54 57 45 45 4e 20 35 20 50 52 45  GE BETWEEN 5 PRE
15a0: 43 45 44 49 4e 47 20 41 4e 44 20 35 20 46 4f 4c  CEDING AND 5 FOL
15b0: 4c 4f 57 49 4e 47 20 7d 0a 20 20 32 20 7b 20 4f  LOWING }.  2 { O
15c0: 52 44 45 52 20 42 59 20 61 20 52 41 4e 47 45 20  RDER BY a RANGE 
15d0: 42 45 54 57 45 45 4e 20 31 30 20 50 52 45 43 45  BETWEEN 10 PRECE
15e0: 44 49 4e 47 20 41 4e 44 20 35 20 50 52 45 43 45  DING AND 5 PRECE
15f0: 44 49 4e 47 20 7d 0a 20 20 33 20 7b 20 4f 52 44  DING }.  3 { ORD
1600: 45 52 20 42 59 20 61 20 52 41 4e 47 45 20 42 45  ER BY a RANGE BE
1610: 54 57 45 45 4e 20 32 20 46 4f 4c 4c 4f 57 49 4e  TWEEN 2 FOLLOWIN
1620: 47 20 41 4e 44 20 33 20 46 4f 4c 4c 4f 57 49 4e  G AND 3 FOLLOWIN
1630: 47 20 7d 0a 20 20 34 20 7b 20 4f 52 44 45 52 20  G }.  4 { ORDER 
1640: 42 59 20 61 20 44 45 53 43 20 52 41 4e 47 45 20  BY a DESC RANGE 
1650: 42 45 54 57 45 45 4e 20 35 20 50 52 45 43 45 44  BETWEEN 5 PRECED
1660: 49 4e 47 20 41 4e 44 20 35 20 46 4f 4c 4c 4f 57  ING AND 5 FOLLOW
1670: 49 4e 47 20 7d 0a 20 20 35 20 7b 20 4f 52 44 45  ING }.  5 { ORDE
1680: 52 20 42 59 20 61 20 44 45 53 43 20 52 41 4e 47  R BY a DESC RANG
1690: 45 20 42 45 54 57 45 45 4e 20 31 30 20 50 52 45  E BETWEEN 10 PRE
16a0: 43 45 44 49 4e 47 20 41 4e 44 20 35 20 50 52 45  CEDING AND 5 PRE
16b0: 43 45 44 49 4e 47 20 7d 0a 20 20 36 20 7b 20 4f  CEDING }.  6 { O
16c0: 52 44 45 52 20 42 59 20 61 20 44 45 53 43 20 52  RDER BY a DESC R
16d0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 32 20 46  ANGE BETWEEN 2 F
16e0: 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 33 20 46  OLLOWING AND 3 F
16f0: 4f 4c 4c 4f 57 49 4e 47 20 7d 0a 0a 20 20 37 20  OLLOWING }..  7 
1700: 20 7b 20 4f 52 44 45 52 20 42 59 20 61 20 52 41   { ORDER BY a RA
1710: 4e 47 45 20 42 45 54 57 45 45 4e 20 35 2e 31 20  NGE BETWEEN 5.1 
1720: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 35 2e  PRECEDING AND 5.
1730: 33 20 46 4f 4c 4c 4f 57 49 4e 47 20 7d 0a 20 20  3 FOLLOWING }.  
1740: 38 20 20 7b 20 4f 52 44 45 52 20 42 59 20 61 20  8  { ORDER BY a 
1750: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 31 30  RANGE BETWEEN 10
1760: 2e 32 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  .2 PRECEDING AND
1770: 20 35 2e 34 20 50 52 45 43 45 44 49 4e 47 20 7d   5.4 PRECEDING }
1780: 0a 20 20 39 20 20 7b 20 4f 52 44 45 52 20 42 59  .  9  { ORDER BY
1790: 20 61 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e   a RANGE BETWEEN
17a0: 20 32 2e 36 20 46 4f 4c 4c 4f 57 49 4e 47 20 41   2.6 FOLLOWING A
17b0: 4e 44 20 33 2e 35 20 46 4f 4c 4c 4f 57 49 4e 47  ND 3.5 FOLLOWING
17c0: 20 7d 0a 20 20 31 30 20 7b 20 4f 52 44 45 52 20   }.  10 { ORDER 
17d0: 42 59 20 61 20 44 45 53 43 20 52 41 4e 47 45 20  BY a DESC RANGE 
17e0: 42 45 54 57 45 45 4e 20 35 2e 37 20 50 52 45 43  BETWEEN 5.7 PREC
17f0: 45 44 49 4e 47 20 41 4e 44 20 35 2e 38 20 46 4f  EDING AND 5.8 FO
1800: 4c 4c 4f 57 49 4e 47 20 7d 0a 20 20 31 31 20 7b  LLOWING }.  11 {
1810: 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43   ORDER BY a DESC
1820: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
1830: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
1840: 4e 47 20 41 4e 44 20 35 2e 39 20 50 52 45 43 45  NG AND 5.9 PRECE
1850: 44 49 4e 47 20 7d 0a 20 20 31 32 20 7b 20 4f 52  DING }.  12 { OR
1860: 44 45 52 20 42 59 20 61 20 44 45 53 43 20 52 41  DER BY a DESC RA
1870: 4e 47 45 20 42 45 54 57 45 45 4e 20 32 2e 31 20  NGE BETWEEN 2.1 
1880: 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 55 4e  FOLLOWING AND UN
1890: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
18a0: 47 20 7d 0a 20 20 31 33 20 20 7b 20 4f 52 44 45  G }.  13  { ORDE
18b0: 52 20 42 59 20 61 20 52 41 4e 47 45 20 35 2e 31  R BY a RANGE 5.1
18c0: 20 50 52 45 43 45 44 49 4e 47 20 7d 0a 7d 20 7b   PRECEDING }.} {
18d0: 0a 20 20 65 78 65 63 73 71 6c 5f 74 65 73 74 20  .  execsql_test 
18e0: 33 2e 24 74 6e 20 22 0a 20 20 20 20 53 45 4c 45  3.$tn ".    SELE
18f0: 43 54 20 43 41 53 54 28 61 20 41 53 20 49 4e 54  CT CAST(a AS INT
1900: 45 47 45 52 29 2c 20 73 75 6d 28 62 29 20 4f 56  EGER), sum(b) OV
1910: 45 52 20 77 69 6e 20 46 52 4f 4d 20 74 31 20 57  ER win FROM t1 W
1920: 49 4e 44 4f 57 20 77 69 6e 20 41 53 20 28 24 66  INDOW win AS ($f
1930: 72 61 6d 65 29 0a 20 20 22 0a 7d 0a 0a 3d 3d 3d  rame).  ".}..===
1940: 3d 3d 3d 3d 3d 3d 3d 0a 0a 65 78 65 63 73 71 6c  =======..execsql
1950: 5f 74 65 73 74 20 34 2e 30 20 7b 0a 20 20 44 52  _test 4.0 {.  DR
1960: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
1970: 54 53 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20  TS t1;.  CREATE 
1980: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
1990: 45 52 2c 20 62 20 49 4e 54 45 47 45 52 29 3b 0a  ER, b INTEGER);.
19a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
19b0: 20 56 41 4c 55 45 53 0a 20 20 20 20 28 4e 55 4c   VALUES.    (NUL
19c0: 4c 2c 20 31 29 2c 20 28 4e 55 4c 4c 2c 20 32 29  L, 1), (NULL, 2)
19d0: 2c 20 28 4e 55 4c 4c 2c 20 33 29 2c 20 28 31 30  , (NULL, 3), (10
19e0: 2c 20 34 29 2c 20 28 31 30 2c 20 35 29 3b 0a 7d  , 4), (10, 5);.}
19f0: 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  ..execsql_test 4
1a00: 2e 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.1 {.  SELECT 
1a10: 73 75 6d 28 62 29 20 4f 56 45 52 20 28 0a 20 20  sum(b) OVER (.  
1a20: 20 20 4f 52 44 45 52 20 42 59 20 61 20 52 41 4e    ORDER BY a RAN
1a30: 47 45 20 42 45 54 57 45 45 4e 20 35 20 50 52 45  GE BETWEEN 5 PRE
1a40: 43 45 44 49 4e 47 20 41 4e 44 20 31 30 20 46 4f  CEDING AND 10 FO
1a50: 4c 4c 4f 57 49 4e 47 0a 20 20 29 20 46 52 4f 4d  LLOWING.  ) FROM
1a60: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 3b 0a   t1 ORDER BY 1;.
1a70: 7d 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  }.execsql_test 4
1a80: 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .1.2 {.  SELECT 
1a90: 73 75 6d 28 62 29 20 4f 56 45 52 20 28 0a 20 20  sum(b) OVER (.  
1aa0: 20 20 4f 52 44 45 52 20 42 59 20 61 20 44 45 53    ORDER BY a DES
1ab0: 43 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  C RANGE BETWEEN 
1ac0: 35 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  5 PRECEDING AND 
1ad0: 31 30 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 29  10 FOLLOWING.  )
1ae0: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
1af0: 59 20 31 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f  Y 1;.}..execsql_
1b00: 74 65 73 74 20 34 2e 32 2e 31 20 7b 0a 20 20 53  test 4.2.1 {.  S
1b10: 45 4c 45 43 54 20 73 75 6d 28 62 29 20 4f 56 45  ELECT sum(b) OVE
1b20: 52 20 28 0a 20 20 20 20 4f 52 44 45 52 20 42 59  R (.    ORDER BY
1b30: 20 61 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e   a RANGE BETWEEN
1b40: 20 35 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44   5 FOLLOWING AND
1b50: 20 31 30 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20   10 FOLLOWING.  
1b60: 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  ) FROM t1 ORDER 
1b70: 42 59 20 31 20 4e 55 4c 4c 53 20 46 49 52 53 54  BY 1 NULLS FIRST
1b80: 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73  ;.}..execsql_tes
1b90: 74 20 34 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45  t 4.2.2 {.  SELE
1ba0: 43 54 20 73 75 6d 28 62 29 20 4f 56 45 52 20 28  CT sum(b) OVER (
1bb0: 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 61 20  .    ORDER BY a 
1bc0: 44 45 53 43 20 52 41 4e 47 45 20 42 45 54 57 45  DESC RANGE BETWE
1bd0: 45 4e 20 35 20 46 4f 4c 4c 4f 57 49 4e 47 20 41  EN 5 FOLLOWING A
1be0: 4e 44 20 31 30 20 46 4f 4c 4c 4f 57 49 4e 47 0a  ND 10 FOLLOWING.
1bf0: 20 20 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45    ) FROM t1 ORDE
1c00: 52 20 42 59 20 31 20 4e 55 4c 4c 53 20 46 49 52  R BY 1 NULLS FIR
1c10: 53 54 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74  ST;.}..execsql_t
1c20: 65 73 74 20 34 2e 33 2e 31 20 7b 0a 20 20 53 45  est 4.3.1 {.  SE
1c30: 4c 45 43 54 20 73 75 6d 28 62 29 20 4f 56 45 52  LECT sum(b) OVER
1c40: 20 28 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20   (.    ORDER BY 
1c50: 61 20 4e 55 4c 4c 53 20 46 49 52 53 54 20 52 41  a NULLS FIRST RA
1c60: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
1c70: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
1c80: 41 4e 44 20 31 30 20 46 4f 4c 4c 4f 57 49 4e 47  AND 10 FOLLOWING
1c90: 0a 20 20 29 20 46 52 4f 4d 20 74 31 20 4f 52 44  .  ) FROM t1 ORD
1ca0: 45 52 20 42 59 20 31 20 4e 55 4c 4c 53 20 46 49  ER BY 1 NULLS FI
1cb0: 52 53 54 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f  RST;.}..execsql_
1cc0: 74 65 73 74 20 34 2e 34 2e 31 20 7b 0a 20 20 53  test 4.4.1 {.  S
1cd0: 45 4c 45 43 54 20 73 75 6d 28 62 29 20 4f 56 45  ELECT sum(b) OVE
1ce0: 52 20 28 0a 20 20 20 20 4f 52 44 45 52 20 42 59  R (.    ORDER BY
1cf0: 20 61 20 4e 55 4c 4c 53 20 46 49 52 53 54 20 52   a NULLS FIRST R
1d00: 4f 57 53 20 42 45 54 57 45 45 4e 20 31 20 50 52  OWS BETWEEN 1 PR
1d10: 45 43 45 44 49 4e 47 20 41 4e 44 20 31 20 46 4f  ECEDING AND 1 FO
1d20: 4c 4c 4f 57 49 4e 47 0a 20 20 29 20 46 52 4f 4d  LLOWING.  ) FROM
1d30: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 4e   t1 ORDER BY 1 N
1d40: 55 4c 4c 53 20 46 49 52 53 54 3b 0a 7d 0a 0a 65  ULLS FIRST;.}..e
1d50: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 34 2e  xecsql_test 4.4.
1d60: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 75 6d  2 {.  SELECT sum
1d70: 28 62 29 20 4f 56 45 52 20 28 0a 20 20 20 20 4f  (b) OVER (.    O
1d80: 52 44 45 52 20 42 59 20 61 20 44 45 53 43 20 4e  RDER BY a DESC N
1d90: 55 4c 4c 53 20 4c 41 53 54 20 52 4f 57 53 20 42  ULLS LAST ROWS B
1da0: 45 54 57 45 45 4e 20 31 20 50 52 45 43 45 44 49  ETWEEN 1 PRECEDI
1db0: 4e 47 20 41 4e 44 20 31 20 46 4f 4c 4c 4f 57 49  NG AND 1 FOLLOWI
1dc0: 4e 47 0a 20 20 29 20 46 52 4f 4d 20 74 31 20 4f  NG.  ) FROM t1 O
1dd0: 52 44 45 52 20 42 59 20 31 20 4e 55 4c 4c 53 20  RDER BY 1 NULLS 
1de0: 46 49 52 53 54 3b 0a 7d 0a 0a 3d 3d 3d 3d 3d 3d  FIRST;.}..======
1df0: 3d 3d 3d 3d 0a 0a 65 78 65 63 73 71 6c 5f 74 65  ====..execsql_te
1e00: 73 74 20 35 2e 30 20 7b 0a 20 20 49 4e 53 45 52  st 5.0 {.  INSER
1e10: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
1e20: 0a 20 20 20 20 28 4e 55 4c 4c 2c 20 27 62 62 27  .    (NULL, 'bb'
1e30: 2c 20 33 35 35 29 2c 20 28 4e 55 4c 4c 2c 20 27  , 355), (NULL, '
1e40: 63 63 27 2c 20 31 35 38 29 2c 20 28 4e 55 4c 4c  cc', 158), (NULL
1e50: 2c 20 27 61 61 27 2c 20 33 39 39 29 2c 20 0a 20  , 'aa', 399), . 
1e60: 20 20 20 28 27 4a 4a 27 2c 20 4e 55 4c 4c 2c 20     ('JJ', NULL, 
1e70: 38 33 39 29 2c 20 28 27 46 46 27 2c 20 4e 55 4c  839), ('FF', NUL
1e80: 4c 2c 20 36 31 38 29 2c 20 28 27 42 42 27 2c 20  L, 618), ('BB', 
1e90: 4e 55 4c 4c 2c 20 33 39 33 29 2c 20 0a 20 20 20  NULL, 393), .   
1ea0: 20 28 4e 55 4c 4c 2c 20 27 62 62 27 2c 20 36 32   (NULL, 'bb', 62
1eb0: 39 29 2c 20 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  9), (NULL, NULL,
1ec0: 20 36 36 37 29 2c 20 28 4e 55 4c 4c 2c 20 4e 55   667), (NULL, NU
1ed0: 4c 4c 2c 20 38 37 30 29 3b 0a 7d 0a 0a 66 6f 72  LL, 870);.}..for
1ee0: 65 61 63 68 20 7b 74 6e 20 65 78 7d 20 7b 0a 20  each {tn ex} {. 
1ef0: 20 31 20 20 7b 20 45 58 43 4c 55 44 45 20 4e 4f   1  { EXCLUDE NO
1f00: 20 4f 54 48 45 52 53 20 7d 0a 20 20 32 20 20 7b   OTHERS }.  2  {
1f10: 20 45 58 43 4c 55 44 45 20 43 55 52 52 45 4e 54   EXCLUDE CURRENT
1f20: 20 52 4f 57 20 7d 0a 20 20 33 20 20 7b 20 45 58   ROW }.  3  { EX
1f30: 43 4c 55 44 45 20 47 52 4f 55 50 20 7d 0a 20 20  CLUDE GROUP }.  
1f40: 34 20 20 7b 20 45 58 43 4c 55 44 45 20 54 49 45  4  { EXCLUDE TIE
1f50: 53 20 7d 0a 7d 20 7b 0a 20 20 66 6f 72 65 61 63  S }.} {.  foreac
1f60: 68 20 7b 74 6e 32 20 66 72 61 6d 65 7d 20 7b 0a  h {tn2 frame} {.
1f70: 20 20 20 20 31 20 7b 20 52 41 4e 47 45 20 42 45      1 { RANGE BE
1f80: 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
1f90: 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
1fa0: 46 4f 4c 4c 4f 57 49 4e 47 20 7d 0a 20 20 20 20  FOLLOWING }.    
1fb0: 32 20 7b 20 4f 52 44 45 52 20 42 59 20 61 20 4e  2 { ORDER BY a N
1fc0: 55 4c 4c 53 20 46 49 52 53 54 20 0a 20 20 20 20  ULLS FIRST .    
1fd0: 20 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45      RANGE BETWEE
1fe0: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
1ff0: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
2000: 4f 57 49 4e 47 20 7d 0a 20 20 20 20 33 20 7b 20  OWING }.    3 { 
2010: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63 6f 61  PARTITION BY coa
2020: 6c 65 73 63 65 28 61 2c 20 27 27 29 20 0a 20 20  lesce(a, '') .  
2030: 20 20 20 20 20 20 52 41 4e 47 45 20 42 45 54 57        RANGE BETW
2040: 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
2050: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
2060: 4c 4c 4f 57 49 4e 47 20 7d 0a 20 20 20 20 34 20  LLOWING }.    4 
2070: 7b 20 4f 52 44 45 52 20 42 59 20 61 20 4e 55 4c  { ORDER BY a NUL
2080: 4c 53 20 46 49 52 53 54 20 47 52 4f 55 50 53 20  LS FIRST GROUPS 
2090: 36 20 50 52 45 43 45 44 49 4e 47 20 7d 0a 20 20  6 PRECEDING }.  
20a0: 20 20 35 20 7b 20 4f 52 44 45 52 20 42 59 20 63    5 { ORDER BY c
20b0: 20 4e 55 4c 4c 53 20 46 49 52 53 54 20 52 41 4e   NULLS FIRST RAN
20c0: 47 45 20 42 45 54 57 45 45 4e 20 36 20 50 52 45  GE BETWEEN 6 PRE
20d0: 43 45 44 49 4e 47 20 41 4e 44 20 37 20 46 4f 4c  CEDING AND 7 FOL
20e0: 4c 4f 57 49 4e 47 20 7d 0a 20 20 20 20 36 20 7b  LOWING }.    6 {
20f0: 20 4f 52 44 45 52 20 42 59 20 63 20 4e 55 4c 4c   ORDER BY c NULL
2100: 53 20 46 49 52 53 54 20 52 41 4e 47 45 20 42 45  S FIRST RANGE BE
2110: 54 57 45 45 4e 20 30 20 50 52 45 43 45 44 49 4e  TWEEN 0 PRECEDIN
2120: 47 20 41 4e 44 20 30 20 46 4f 4c 4c 4f 57 49 4e  G AND 0 FOLLOWIN
2130: 47 20 7d 0a 20 20 20 20 37 20 7b 20 4f 52 44 45  G }.    7 { ORDE
2140: 52 20 42 59 20 63 20 4e 55 4c 4c 53 20 46 49 52  R BY c NULLS FIR
2150: 53 54 2c 20 62 20 4e 55 4c 4c 53 20 46 49 52 53  ST, b NULLS FIRS
2160: 54 2c 20 61 20 4e 55 4c 4c 53 20 46 49 52 53 54  T, a NULLS FIRST
2170: 0a 20 20 20 20 20 20 20 20 52 4f 57 53 20 42 45  .        ROWS BE
2180: 54 57 45 45 4e 20 36 20 50 52 45 43 45 44 49 4e  TWEEN 6 PRECEDIN
2190: 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  G AND UNBOUNDED 
21a0: 46 4f 4c 4c 4f 57 49 4e 47 20 7d 0a 20 20 7d 20  FOLLOWING }.  } 
21b0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 5f 74 65  {.    execsql_te
21c0: 73 74 20 35 2e 24 74 6e 2e 24 74 6e 32 2e 31 20  st 5.$tn.$tn2.1 
21d0: 22 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 6d  ".      SELECT m
21e0: 61 78 28 63 29 20 4f 56 45 52 20 77 69 6e 2c 0a  ax(c) OVER win,.
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e               min
2200: 28 63 29 20 4f 56 45 52 20 77 69 6e 2c 0a 20 20  (c) OVER win,.  
2210: 20 20 20 20 20 20 20 20 20 20 20 63 6f 75 6e 74             count
2220: 28 61 29 20 4f 56 45 52 20 77 69 6e 0a 20 20 20  (a) OVER win.   
2230: 20 20 20 46 52 4f 4d 20 74 33 0a 20 20 20 20 20     FROM t3.     
2240: 20 57 49 4e 44 4f 57 20 77 69 6e 20 41 53 20 28   WINDOW win AS (
2250: 20 24 66 72 61 6d 65 20 24 65 78 20 29 0a 20 20   $frame $ex ).  
2260: 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 20 4e      ORDER BY 1 N
2270: 55 4c 4c 53 20 46 49 52 53 54 2c 20 32 20 4e 55  ULLS FIRST, 2 NU
2280: 4c 4c 53 20 46 49 52 53 54 2c 20 33 20 4e 55 4c  LLS FIRST, 3 NUL
2290: 4c 53 20 46 49 52 53 54 0a 20 20 20 20 22 0a 0a  LS FIRST.    "..
22a0: 20 20 20 20 65 78 65 63 73 71 6c 5f 74 65 73 74      execsql_test
22b0: 20 35 2e 24 74 6e 2e 24 74 6e 32 2e 32 20 22 0a   5.$tn.$tn2.2 ".
22c0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d        SELECT sum
22d0: 28 63 29 20 46 49 4c 54 45 52 20 28 57 48 45 52  (c) FILTER (WHER
22e0: 45 20 28 63 25 32 29 21 3d 30 29 20 4f 56 45 52  E (c%2)!=0) OVER
22f0: 20 77 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20   win,.          
2300: 20 20 20 72 61 6e 6b 28 29 20 4f 56 45 52 20 77     rank() OVER w
2310: 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  in,.            
2320: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 20 4f 56   dense_rank() OV
2330: 45 52 20 77 69 6e 0a 20 20 20 20 20 20 46 52 4f  ER win.      FRO
2340: 4d 20 74 33 0a 20 20 20 20 20 20 57 49 4e 44 4f  M t3.      WINDO
2350: 57 20 77 69 6e 20 41 53 20 28 20 24 66 72 61 6d  W win AS ( $fram
2360: 65 20 24 65 78 20 29 0a 20 20 20 20 20 20 4f 52  e $ex ).      OR
2370: 44 45 52 20 42 59 20 31 20 4e 55 4c 4c 53 20 46  DER BY 1 NULLS F
2380: 49 52 53 54 2c 20 32 20 4e 55 4c 4c 53 20 46 49  IRST, 2 NULLS FI
2390: 52 53 54 2c 20 33 20 4e 55 4c 4c 53 20 46 49 52  RST, 3 NULLS FIR
23a0: 53 54 0a 20 20 20 20 22 0a 20 20 7d 0a 7d 0a 0a  ST.    ".  }.}..
23b0: 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a 0a        finish_test...