/ Hex Artifact Content
Login

Artifact 376a7c9c5b9df9868d92a6d9d455262e1b769f4410b19006f5f8c5507c2a7ed7:


0000: 23 20 32 30 31 38 20 4d 61 79 20 38 0a 23 0a 23  # 2018 May 8.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u 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 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69  **.# This file i
0170: 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65 73  mplements regres
0180: 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20 53  sion tests for S
0190: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a 23  QLite library..#
01a0: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
01b0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
01c0: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
01d0: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73  dir/tester.tcl.s
01e0: 65 74 20 74 65 73 74 70 72 65 66 69 78 20 77 69  et testprefix wi
01f0: 6e 64 6f 77 31 0a 0a 69 66 63 61 70 61 62 6c 65  ndow1..ifcapable
0200: 20 21 77 69 6e 64 6f 77 66 75 6e 63 20 7b 0a 20   !windowfunc {. 
0210: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
0220: 65 74 75 72 6e 0a 7d 0a 0a 64 6f 5f 65 78 65 63  eturn.}..do_exec
0230: 73 71 6c 5f 74 65 73 74 20 31 2e 30 20 7b 0a 20  sql_test 1.0 {. 
0240: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
0250: 28 61 2c 20 62 2c 20 63 2c 20 64 29 3b 0a 20 20  (a, b, c, d);.  
0260: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0270: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 2c 20 34  ALUES(1, 2, 3, 4
0280: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0290: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 2c   t1 VALUES(5, 6,
02a0: 20 37 2c 20 38 29 3b 0a 20 20 49 4e 53 45 52 54   7, 8);.  INSERT
02b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
02c0: 39 2c 20 31 30 2c 20 31 31 2c 20 31 32 29 3b 0a  9, 10, 11, 12);.
02d0: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
02e0: 73 74 20 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  st 1.1 {.  SELEC
02f0: 54 20 73 75 6d 28 62 29 20 4f 56 45 52 20 28 29  T sum(b) OVER ()
0300: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 31 38 20 31   FROM t1.} {18 1
0310: 38 20 31 38 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  8 18}..do_execsq
0320: 6c 5f 74 65 73 74 20 31 2e 32 20 7b 0a 20 20 53  l_test 1.2 {.  S
0330: 45 4c 45 43 54 20 61 2c 20 73 75 6d 28 62 29 20  ELECT a, sum(b) 
0340: 4f 56 45 52 20 28 29 20 46 52 4f 4d 20 74 31 0a  OVER () FROM t1.
0350: 7d 20 7b 31 20 31 38 20 35 20 31 38 20 39 20 31  } {1 18 5 18 9 1
0360: 38 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  8}..do_execsql_t
0370: 65 73 74 20 31 2e 33 20 7b 0a 20 20 53 45 4c 45  est 1.3 {.  SELE
0380: 43 54 20 61 2c 20 34 20 2b 20 73 75 6d 28 62 29  CT a, 4 + sum(b)
0390: 20 4f 56 45 52 20 28 29 20 46 52 4f 4d 20 74 31   OVER () FROM t1
03a0: 0a 7d 20 7b 31 20 32 32 20 35 20 32 32 20 39 20  .} {1 22 5 22 9 
03b0: 32 32 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  22}..do_execsql_
03c0: 74 65 73 74 20 31 2e 34 20 7b 0a 20 20 53 45 4c  test 1.4 {.  SEL
03d0: 45 43 54 20 61 20 2b 20 34 20 2b 20 73 75 6d 28  ECT a + 4 + sum(
03e0: 62 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d 20  b) OVER () FROM 
03f0: 74 31 0a 7d 20 7b 32 33 20 32 37 20 33 31 7d 0a  t1.} {23 27 31}.
0400: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0410: 20 31 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20   1.5 {.  SELECT 
0420: 61 2c 20 73 75 6d 28 62 29 20 4f 56 45 52 20 28  a, sum(b) OVER (
0430: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63 29 20  PARTITION BY c) 
0440: 46 52 4f 4d 20 74 31 0a 7d 20 7b 31 20 32 20 35  FROM t1.} {1 2 5
0450: 20 36 20 39 20 31 30 7d 0a 0a 66 6f 72 65 61 63   6 9 10}..foreac
0460: 68 20 7b 74 6e 20 73 71 6c 7d 20 7b 0a 20 20 31  h {tn sql} {.  1
0470: 20 22 53 45 4c 45 43 54 20 73 75 6d 28 62 29 20   "SELECT sum(b) 
0480: 4f 56 45 52 20 28 29 20 46 52 4f 4d 20 74 31 22  OVER () FROM t1"
0490: 0a 20 20 32 20 22 53 45 4c 45 43 54 20 73 75 6d  .  2 "SELECT sum
04a0: 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54  (b) OVER (PARTIT
04b0: 49 4f 4e 20 42 59 20 63 29 20 46 52 4f 4d 20 74  ION BY c) FROM t
04c0: 31 22 0a 20 20 33 20 22 53 45 4c 45 43 54 20 73  1".  3 "SELECT s
04d0: 75 6d 28 62 29 20 4f 56 45 52 20 28 4f 52 44 45  um(b) OVER (ORDE
04e0: 52 20 42 59 20 63 29 20 46 52 4f 4d 20 74 31 22  R BY c) FROM t1"
04f0: 0a 20 20 34 20 22 53 45 4c 45 43 54 20 73 75 6d  .  4 "SELECT sum
0500: 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54  (b) OVER (PARTIT
0510: 49 4f 4e 20 42 59 20 64 20 4f 52 44 45 52 20 42  ION BY d ORDER B
0520: 59 20 63 29 20 46 52 4f 4d 20 74 31 22 0a 20 20  Y c) FROM t1".  
0530: 35 20 22 53 45 4c 45 43 54 20 73 75 6d 28 62 29  5 "SELECT sum(b)
0540: 20 46 49 4c 54 45 52 20 28 57 48 45 52 45 20 61   FILTER (WHERE a
0550: 3e 30 29 20 4f 56 45 52 20 28 50 41 52 54 49 54  >0) OVER (PARTIT
0560: 49 4f 4e 20 42 59 20 64 20 4f 52 44 45 52 20 42  ION BY d ORDER B
0570: 59 20 63 29 20 46 52 4f 4d 20 74 31 22 0a 20 20  Y c) FROM t1".  
0580: 36 20 22 53 45 4c 45 43 54 20 73 75 6d 28 62 29  6 "SELECT sum(b)
0590: 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20   OVER (ORDER BY 
05a0: 63 20 52 41 4e 47 45 20 55 4e 42 4f 55 4e 44 45  c RANGE UNBOUNDE
05b0: 44 20 50 52 45 43 45 44 49 4e 47 29 20 46 52 4f  D PRECEDING) FRO
05c0: 4d 20 74 31 22 0a 20 20 37 20 22 53 45 4c 45 43  M t1".  7 "SELEC
05d0: 54 20 73 75 6d 28 62 29 20 4f 56 45 52 20 28 4f  T sum(b) OVER (O
05e0: 52 44 45 52 20 42 59 20 63 20 52 4f 57 53 20 34  RDER BY c ROWS 4
05f0: 35 20 50 52 45 43 45 44 49 4e 47 29 20 46 52 4f  5 PRECEDING) FRO
0600: 4d 20 74 31 22 0a 20 20 38 20 22 53 45 4c 45 43  M t1".  8 "SELEC
0610: 54 20 73 75 6d 28 62 29 20 4f 56 45 52 20 28 4f  T sum(b) OVER (O
0620: 52 44 45 52 20 42 59 20 63 20 52 41 4e 47 45 20  RDER BY c RANGE 
0630: 43 55 52 52 45 4e 54 20 52 4f 57 29 20 46 52 4f  CURRENT ROW) FRO
0640: 4d 20 74 31 22 0a 20 20 39 20 22 53 45 4c 45 43  M t1".  9 "SELEC
0650: 54 20 73 75 6d 28 62 29 20 4f 56 45 52 20 28 4f  T sum(b) OVER (O
0660: 52 44 45 52 20 42 59 20 63 20 52 41 4e 47 45 20  RDER BY c RANGE 
0670: 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
0680: 44 20 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20  D PRECEDING .   
0690: 20 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f    AND CURRENT RO
06a0: 57 29 20 46 52 4f 4d 20 74 31 22 0a 20 31 30 20  W) FROM t1". 10 
06b0: 22 53 45 4c 45 43 54 20 73 75 6d 28 62 29 20 4f  "SELECT sum(b) O
06c0: 56 45 52 20 28 4f 52 44 45 52 20 42 59 20 63 20  VER (ORDER BY c 
06d0: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42  ROWS BETWEEN UNB
06e0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
06f0: 20 0a 20 20 20 20 20 41 4e 44 20 55 4e 42 4f 55   .     AND UNBOU
0700: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 29 20  NDED FOLLOWING) 
0710: 46 52 4f 4d 20 74 31 22 0a 7d 20 7b 0a 20 20 64  FROM t1".} {.  d
0720: 6f 5f 74 65 73 74 20 32 2e 24 74 6e 20 7b 20 6c  o_test 2.$tn { l
0730: 69 6e 64 65 78 20 5b 63 61 74 63 68 73 71 6c 20  index [catchsql 
0740: 24 73 71 6c 5d 20 30 20 7d 20 30 0a 7d 0a 0a 66  $sql] 0 } 0.}..f
0750: 6f 72 65 61 63 68 20 7b 74 6e 20 73 71 6c 7d 20  oreach {tn sql} 
0760: 7b 0a 20 20 31 20 22 53 45 4c 45 43 54 20 2a 20  {.  1 "SELECT * 
0770: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 73 75  FROM t1 WHERE su
0780: 6d 28 62 29 20 4f 56 45 52 20 28 29 22 0a 20 20  m(b) OVER ()".  
0790: 32 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  2 "SELECT * FROM
07a0: 20 74 31 20 47 52 4f 55 50 20 42 59 20 73 75 6d   t1 GROUP BY sum
07b0: 28 62 29 20 4f 56 45 52 20 28 29 22 0a 20 20 33  (b) OVER ()".  3
07c0: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
07d0: 74 31 20 47 52 4f 55 50 20 42 59 20 61 20 48 41  t1 GROUP BY a HA
07e0: 56 49 4e 47 20 73 75 6d 28 62 29 20 4f 56 45 52  VING sum(b) OVER
07f0: 20 28 29 22 0a 7d 20 7b 0a 20 20 64 6f 5f 63 61   ()".} {.  do_ca
0800: 74 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 24 74  tchsql_test 3.$t
0810: 6e 20 24 73 71 6c 20 7b 31 20 7b 6d 69 73 75 73  n $sql {1 {misus
0820: 65 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63  e of window func
0830: 74 69 6f 6e 20 73 75 6d 28 29 7d 7d 0a 7d 0a 0a  tion sum()}}.}..
0840: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0850: 34 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  4.0 {.  CREATE T
0860: 41 42 4c 45 20 74 32 28 61 2c 20 62 2c 20 63 29  ABLE t2(a, b, c)
0870: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0880: 74 32 20 56 41 4c 55 45 53 28 30 2c 20 30 2c 20  t2 VALUES(0, 0, 
0890: 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  0);.  INSERT INT
08a0: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 31  O t2 VALUES(1, 1
08b0: 2c 20 31 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 1);.  INSERT I
08c0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c  NTO t2 VALUES(2,
08d0: 20 30 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54   0, 2);.  INSERT
08e0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
08f0: 33 2c 20 31 2c 20 30 29 3b 0a 20 20 49 4e 53 45  3, 1, 0);.  INSE
0900: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
0910: 53 28 34 2c 20 30 2c 20 31 29 3b 0a 20 20 49 4e  S(4, 0, 1);.  IN
0920: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0930: 55 45 53 28 35 2c 20 31 2c 20 32 29 3b 0a 20 20  UES(5, 1, 2);.  
0940: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
0950: 41 4c 55 45 53 28 36 2c 20 30 2c 20 30 29 3b 0a  ALUES(6, 0, 0);.
0960: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
0970: 73 74 20 34 2e 31 20 7b 0a 20 20 53 45 4c 45 43  st 4.1 {.  SELEC
0980: 54 20 61 2c 20 73 75 6d 28 61 29 20 4f 56 45 52  T a, sum(a) OVER
0990: 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 62   (PARTITION BY b
09a0: 29 20 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 0a 20  ) FROM t2;.} {. 
09b0: 20 30 20 31 32 20 20 32 20 31 32 20 20 34 20 31   0 12  2 12  4 1
09c0: 32 20 20 36 20 31 32 20 20 20 31 20 20 39 20 20  2  6 12   1  9  
09d0: 33 20 20 39 20 20 35 20 20 39 20 0a 7d 0a 0a 64  3  9  5  9 .}..d
09e0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
09f0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c  .2 {.  SELECT a,
0a00: 20 73 75 6d 28 61 29 20 4f 56 45 52 20 28 50 41   sum(a) OVER (PA
0a10: 52 54 49 54 49 4f 4e 20 42 59 20 62 29 20 46 52  RTITION BY b) FR
0a20: 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 61  OM t2 ORDER BY a
0a30: 3b 0a 7d 20 7b 0a 20 20 30 20 31 32 20 20 31 20  ;.} {.  0 12  1 
0a40: 20 39 20 20 32 20 31 32 20 20 33 20 20 39 20 20   9  2 12  3  9  
0a50: 34 20 31 32 20 20 35 20 20 39 20 36 20 31 32 20  4 12  5  9 6 12 
0a60: 20 20 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c    .}..do_execsql
0a70: 5f 74 65 73 74 20 34 2e 33 20 7b 0a 20 20 53 45  _test 4.3 {.  SE
0a80: 4c 45 43 54 20 61 2c 20 73 75 6d 28 61 29 20 4f  LECT a, sum(a) O
0a90: 56 45 52 20 28 29 20 46 52 4f 4d 20 74 32 20 4f  VER () FROM t2 O
0aa0: 52 44 45 52 20 42 59 20 61 3b 0a 7d 20 7b 0a 20  RDER BY a;.} {. 
0ab0: 20 30 20 32 31 20 20 31 20 20 32 31 20 20 32 20   0 21  1  21  2 
0ac0: 32 31 20 20 33 20 20 32 31 20 20 34 20 32 31 20  21  3  21  4 21 
0ad0: 20 35 20 20 32 31 20 36 20 32 31 20 20 20 0a 7d   5  21 6 21   .}
0ae0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0af0: 74 20 34 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  t 4.4 {.  SELECT
0b00: 20 61 2c 20 73 75 6d 28 61 29 20 4f 56 45 52 20   a, sum(a) OVER 
0b10: 28 4f 52 44 45 52 20 42 59 20 61 29 20 46 52 4f  (ORDER BY a) FRO
0b20: 4d 20 74 32 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  M t2;.} {.  0 0 
0b30: 20 31 20 31 20 20 32 20 33 20 20 33 20 36 20 20   1 1  2 3  3 6  
0b40: 34 20 31 30 20 20 35 20 31 35 20 20 36 20 32 31  4 10  5 15  6 21
0b50: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
0b60: 65 73 74 20 34 2e 35 20 7b 0a 20 20 53 45 4c 45  est 4.5 {.  SELE
0b70: 43 54 20 61 2c 20 73 75 6d 28 61 29 20 4f 56 45  CT a, sum(a) OVE
0b80: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0b90: 62 20 4f 52 44 45 52 20 42 59 20 61 29 20 46 52  b ORDER BY a) FR
0ba0: 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 61  OM t2 ORDER BY a
0bb0: 0a 7d 20 7b 0a 20 20 30 20 30 20 20 31 20 31 20  .} {.  0 0  1 1 
0bc0: 20 32 20 32 20 20 33 20 34 20 20 34 20 36 20 20   2 2  3 4  4 6  
0bd0: 35 20 39 20 20 36 20 31 32 0a 7d 0a 0a 64 6f 5f  5 9  6 12.}..do_
0be0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 36  execsql_test 4.6
0bf0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 73   {.  SELECT a, s
0c00: 75 6d 28 61 29 20 4f 56 45 52 20 28 50 41 52 54  um(a) OVER (PART
0c10: 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52  ITION BY c ORDER
0c20: 20 42 59 20 61 29 20 46 52 4f 4d 20 74 32 20 4f   BY a) FROM t2 O
0c30: 52 44 45 52 20 42 59 20 61 0a 7d 20 7b 0a 20 20  RDER BY a.} {.  
0c40: 30 20 30 20 20 31 20 31 20 20 32 20 32 20 20 33  0 0  1 1  2 2  3
0c50: 20 33 20 20 34 20 35 20 20 35 20 37 20 20 36 20   3  4 5  5 7  6 
0c60: 39 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  9.}..do_execsql_
0c70: 74 65 73 74 20 34 2e 37 20 7b 0a 20 20 53 45 4c  test 4.7 {.  SEL
0c80: 45 43 54 20 61 2c 20 73 75 6d 28 61 29 20 4f 56  ECT a, sum(a) OV
0c90: 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59  ER (PARTITION BY
0ca0: 20 62 20 4f 52 44 45 52 20 42 59 20 61 20 44 45   b ORDER BY a DE
0cb0: 53 43 29 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  SC) FROM t2 ORDE
0cc0: 52 20 42 59 20 61 0a 7d 20 7b 0a 20 20 30 20 31  R BY a.} {.  0 1
0cd0: 32 20 20 31 20 39 20 20 32 20 31 32 20 20 33 20  2  1 9  2 12  3 
0ce0: 38 20 20 34 20 31 30 20 20 35 20 35 20 20 36 20  8  4 10  5 5  6 
0cf0: 36 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  6.}..do_execsql_
0d00: 74 65 73 74 20 34 2e 38 20 7b 0a 20 20 53 45 4c  test 4.8 {.  SEL
0d10: 45 43 54 20 61 2c 20 0a 20 20 20 20 73 75 6d 28  ECT a, .    sum(
0d20: 61 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  a) OVER (PARTITI
0d30: 4f 4e 20 42 59 20 62 20 4f 52 44 45 52 20 42 59  ON BY b ORDER BY
0d40: 20 61 20 44 45 53 43 29 2c 0a 20 20 20 20 73 75   a DESC),.    su
0d50: 6d 28 61 29 20 4f 56 45 52 20 28 50 41 52 54 49  m(a) OVER (PARTI
0d60: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0d70: 42 59 20 61 29 20 0a 20 20 46 52 4f 4d 20 74 32  BY a) .  FROM t2
0d80: 20 4f 52 44 45 52 20 42 59 20 61 0a 7d 20 7b 0a   ORDER BY a.} {.
0d90: 20 20 30 20 20 31 32 20 20 30 0a 20 20 31 20 20    0  12  0.  1  
0da0: 20 39 20 20 31 20 0a 20 20 32 20 20 31 32 20 20   9  1 .  2  12  
0db0: 32 20 0a 20 20 33 20 20 20 38 20 20 33 20 0a 20  2 .  3   8  3 . 
0dc0: 20 34 20 20 31 30 20 20 35 20 0a 20 20 35 20 20   4  10  5 .  5  
0dd0: 20 35 20 20 37 20 0a 20 20 36 20 20 20 36 20 20   5  7 .  6   6  
0de0: 39 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  9.}..do_execsql_
0df0: 74 65 73 74 20 34 2e 39 20 7b 0a 20 20 53 45 4c  test 4.9 {.  SEL
0e00: 45 43 54 20 61 2c 20 0a 20 20 20 20 73 75 6d 28  ECT a, .    sum(
0e10: 61 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42  a) OVER (ORDER B
0e20: 59 20 61 29 2c 20 0a 20 20 20 20 61 76 67 28 61  Y a), .    avg(a
0e30: 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59  ) OVER (ORDER BY
0e40: 20 61 29 20 0a 20 20 46 52 4f 4d 20 74 32 20 4f   a) .  FROM t2 O
0e50: 52 44 45 52 20 42 59 20 61 0a 7d 20 7b 0a 20 20  RDER BY a.} {.  
0e60: 30 20 20 30 20 20 20 20 20 20 20 30 2e 30 0a 20  0  0       0.0. 
0e70: 20 31 20 20 31 20 20 20 20 20 20 20 30 2e 35 0a   1  1       0.5.
0e80: 20 20 32 20 20 33 20 20 20 20 20 20 20 31 2e 30    2  3       1.0
0e90: 0a 20 20 33 20 20 36 20 20 20 20 20 20 20 31 2e  .  3  6       1.
0ea0: 35 0a 20 20 34 20 20 31 30 20 20 20 20 20 20 32  5.  4  10      2
0eb0: 2e 30 0a 20 20 35 20 20 31 35 20 20 20 20 20 20  .0.  5  15      
0ec0: 32 2e 35 0a 20 20 36 20 20 32 31 20 20 20 20 20  2.5.  6  21     
0ed0: 20 33 2e 30 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73   3.0.}..do_execs
0ee0: 71 6c 5f 74 65 73 74 20 34 2e 31 30 2e 31 20 7b  ql_test 4.10.1 {
0ef0: 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 0a 20 20  .  SELECT a, .  
0f00: 20 20 63 6f 75 6e 74 28 29 20 4f 56 45 52 20 28    count() OVER (
0f10: 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43 29  ORDER BY a DESC)
0f20: 2c 0a 20 20 20 20 67 72 6f 75 70 5f 63 6f 6e 63  ,.    group_conc
0f30: 61 74 28 61 2c 20 27 2e 27 29 20 4f 56 45 52 20  at(a, '.') OVER 
0f40: 28 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43  (ORDER BY a DESC
0f50: 29 20 0a 20 20 46 52 4f 4d 20 74 32 20 4f 52 44  ) .  FROM t2 ORD
0f60: 45 52 20 42 59 20 61 20 44 45 53 43 0a 7d 20 7b  ER BY a DESC.} {
0f70: 0a 20 20 36 20 31 20 36 0a 20 20 35 20 32 20 36  .  6 1 6.  5 2 6
0f80: 2e 35 0a 20 20 34 20 33 20 36 2e 35 2e 34 0a 20  .5.  4 3 6.5.4. 
0f90: 20 33 20 34 20 36 2e 35 2e 34 2e 33 0a 20 20 32   3 4 6.5.4.3.  2
0fa0: 20 35 20 36 2e 35 2e 34 2e 33 2e 32 0a 20 20 31   5 6.5.4.3.2.  1
0fb0: 20 36 20 36 2e 35 2e 34 2e 33 2e 32 2e 31 0a 20   6 6.5.4.3.2.1. 
0fc0: 20 30 20 37 20 36 2e 35 2e 34 2e 33 2e 32 2e 31   0 7 6.5.4.3.2.1
0fd0: 2e 30 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  .0.}..do_execsql
0fe0: 5f 74 65 73 74 20 34 2e 31 30 2e 32 20 7b 0a 20  _test 4.10.2 {. 
0ff0: 20 53 45 4c 45 43 54 20 61 2c 20 0a 20 20 20 20   SELECT a, .    
1000: 63 6f 75 6e 74 28 2a 29 20 4f 56 45 52 20 28 4f  count(*) OVER (O
1010: 52 44 45 52 20 42 59 20 61 20 44 45 53 43 29 2c  RDER BY a DESC),
1020: 0a 20 20 20 20 67 72 6f 75 70 5f 63 6f 6e 63 61  .    group_conca
1030: 74 28 61 2c 20 27 2e 27 29 20 4f 56 45 52 20 28  t(a, '.') OVER (
1040: 4f 52 44 45 52 20 42 59 20 61 20 44 45 53 43 29  ORDER BY a DESC)
1050: 20 0a 20 20 46 52 4f 4d 20 74 32 20 4f 52 44 45   .  FROM t2 ORDE
1060: 52 20 42 59 20 61 20 44 45 53 43 0a 7d 20 7b 0a  R BY a DESC.} {.
1070: 20 20 36 20 31 20 36 0a 20 20 35 20 32 20 36 2e    6 1 6.  5 2 6.
1080: 35 0a 20 20 34 20 33 20 36 2e 35 2e 34 0a 20 20  5.  4 3 6.5.4.  
1090: 33 20 34 20 36 2e 35 2e 34 2e 33 0a 20 20 32 20  3 4 6.5.4.3.  2 
10a0: 35 20 36 2e 35 2e 34 2e 33 2e 32 0a 20 20 31 20  5 6.5.4.3.2.  1 
10b0: 36 20 36 2e 35 2e 34 2e 33 2e 32 2e 31 0a 20 20  6 6.5.4.3.2.1.  
10c0: 30 20 37 20 36 2e 35 2e 34 2e 33 2e 32 2e 31 2e  0 7 6.5.4.3.2.1.
10d0: 30 0a 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c  0.}..do_catchsql
10e0: 5f 74 65 73 74 20 35 2e 31 20 7b 0a 20 20 53 45  _test 5.1 {.  SE
10f0: 4c 45 43 54 20 6e 74 69 6c 65 28 30 29 20 4f 56  LECT ntile(0) OV
1100: 45 52 20 28 4f 52 44 45 52 20 42 59 20 61 29 20  ER (ORDER BY a) 
1110: 46 52 4f 4d 20 74 32 3b 0a 7d 20 7b 31 20 7b 61  FROM t2;.} {1 {a
1120: 72 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65  rgument of ntile
1130: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74   must be a posit
1140: 69 76 65 20 69 6e 74 65 67 65 72 7d 7d 0a 64 6f  ive integer}}.do
1150: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 35  _catchsql_test 5
1160: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6e 74  .2 {.  SELECT nt
1170: 69 6c 65 28 2d 31 29 20 4f 56 45 52 20 28 4f 52  ile(-1) OVER (OR
1180: 44 45 52 20 42 59 20 61 29 20 46 52 4f 4d 20 74  DER BY a) FROM t
1190: 32 3b 0a 7d 20 7b 31 20 7b 61 72 67 75 6d 65 6e  2;.} {1 {argumen
11a0: 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75 73 74 20  t of ntile must 
11b0: 62 65 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e  be a positive in
11c0: 74 65 67 65 72 7d 7d 0a 64 6f 5f 63 61 74 63 68  teger}}.do_catch
11d0: 73 71 6c 5f 74 65 73 74 20 35 2e 33 20 7b 0a 20  sql_test 5.3 {. 
11e0: 20 53 45 4c 45 43 54 20 6e 74 69 6c 65 28 27 7a   SELECT ntile('z
11f0: 62 63 27 29 20 4f 56 45 52 20 28 4f 52 44 45 52  bc') OVER (ORDER
1200: 20 42 59 20 61 29 20 46 52 4f 4d 20 74 32 3b 0a   BY a) FROM t2;.
1210: 7d 20 7b 31 20 7b 61 72 67 75 6d 65 6e 74 20 6f  } {1 {argument o
1220: 66 20 6e 74 69 6c 65 20 6d 75 73 74 20 62 65 20  f ntile must be 
1230: 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  a positive integ
1240: 65 72 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  er}}.do_execsql_
1250: 74 65 73 74 20 35 2e 34 20 7b 0a 20 20 43 52 45  test 5.4 {.  CRE
1260: 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20  ATE TABLE t4(a, 
1270: 62 29 3b 0a 20 20 53 45 4c 45 43 54 20 6e 74 69  b);.  SELECT nti
1280: 6c 65 28 31 29 20 4f 56 45 52 20 28 4f 52 44 45  le(1) OVER (ORDE
1290: 52 20 42 59 20 61 29 20 46 52 4f 4d 20 74 34 3b  R BY a) FROM t4;
12a0: 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  .} {}..#--------
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f0: 2d 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78  -.reset_db.do_ex
1300: 65 63 73 71 6c 5f 74 65 73 74 20 36 2e 31 20 7b  ecsql_test 6.1 {
1310: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1320: 74 31 28 78 29 3b 0a 20 20 49 4e 53 45 52 54 20  t1(x);.  INSERT 
1330: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37  INTO t1 VALUES(7
1340: 29 2c 20 28 36 29 2c 20 28 35 29 2c 20 28 34 29  ), (6), (5), (4)
1350: 2c 20 28 33 29 2c 20 28 32 29 2c 20 28 31 29 3b  , (3), (2), (1);
1360: 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
1370: 20 74 32 28 78 29 3b 0a 20 20 49 4e 53 45 52 54   t2(x);.  INSERT
1380: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1390: 27 62 27 29 2c 20 28 27 61 27 29 3b 0a 0a 20 20  'b'), ('a');..  
13a0: 53 45 4c 45 43 54 20 78 2c 20 63 6f 75 6e 74 28  SELECT x, count(
13b0: 2a 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42  *) OVER (ORDER B
13c0: 59 20 78 29 20 46 52 4f 4d 20 74 31 3b 0a 7d 20  Y x) FROM t1;.} 
13d0: 7b 31 20 31 20 32 20 32 20 33 20 33 20 34 20 34  {1 1 2 2 3 3 4 4
13e0: 20 35 20 35 20 36 20 36 20 37 20 37 7d 0a 0a 64   5 5 6 6 7 7}..d
13f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 36  o_execsql_test 6
1400: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .2 {.  SELECT * 
1410: 46 52 4f 4d 20 74 32 2c 20 28 53 45 4c 45 43 54  FROM t2, (SELECT
1420: 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 4f 56 45   x, count(*) OVE
1430: 52 20 28 4f 52 44 45 52 20 42 59 20 78 29 20 46  R (ORDER BY x) F
1440: 52 4f 4d 20 74 31 29 3b 0a 7d 20 7b 0a 20 20 62  ROM t1);.} {.  b
1450: 20 31 20 31 20 62 20 32 20 32 20 62 20 33 20 33   1 1 b 2 2 b 3 3
1460: 20 62 20 34 20 34 20 62 20 35 20 35 20 62 20 36   b 4 4 b 5 5 b 6
1470: 20 36 20 62 20 37 20 37 0a 20 20 61 20 31 20 31   6 b 7 7.  a 1 1
1480: 20 61 20 32 20 32 20 61 20 33 20 33 20 61 20 34   a 2 2 a 3 3 a 4
1490: 20 34 20 61 20 35 20 35 20 61 20 36 20 36 20 61   4 a 5 5 a 6 6 a
14a0: 20 37 20 37 0a 7d 0a 0a 64 6f 5f 63 61 74 63 68   7 7.}..do_catch
14b0: 73 71 6c 5f 74 65 73 74 20 36 2e 33 20 7b 0a 20  sql_test 6.3 {. 
14c0: 20 53 45 4c 45 43 54 20 78 2c 20 6c 61 67 28 78   SELECT x, lag(x
14d0: 29 20 46 49 4c 54 45 52 20 28 57 48 45 52 45 20  ) FILTER (WHERE 
14e0: 28 78 25 32 29 3d 30 29 20 4f 56 45 52 20 77 20  (x%2)=0) OVER w 
14f0: 46 52 4f 4d 20 74 31 20 0a 20 20 57 49 4e 44 4f  FROM t1 .  WINDO
1500: 57 20 77 20 41 53 20 28 4f 52 44 45 52 20 42 59  W w AS (ORDER BY
1510: 20 78 29 0a 7d 20 7b 31 20 7b 46 49 4c 54 45 52   x).} {1 {FILTER
1520: 20 63 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c 79   clause may only
1530: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 67   be used with ag
1540: 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66  gregate window f
1550: 75 6e 63 74 69 6f 6e 73 7d 7d 0a 20 0a 23 2d 2d  unctions}}. .#--
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 74 74 65 6d 70  -------.# Attemp
15b0: 74 20 74 6f 20 75 73 65 20 61 20 77 69 6e 64 6f  t to use a windo
15c0: 77 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 61 6e  w function as an
15d0: 20 61 67 67 72 65 67 61 74 65 2e 20 41 6e 64 20   aggregate. And 
15e0: 6f 74 68 65 72 20 65 72 72 6f 72 73 2e 0a 23 0a  other errors..#.
15f0: 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63  reset_db.do_exec
1600: 73 71 6c 5f 74 65 73 74 20 37 2e 30 20 7b 0a 20  sql_test 7.0 {. 
1610: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1620: 28 78 2c 20 79 29 3b 0a 20 20 49 4e 53 45 52 54  (x, y);.  INSERT
1630: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1640: 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  1, 2);.  INSERT 
1650: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
1660: 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 4);.  INSERT I
1670: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
1680: 20 36 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   6);.  INSERT IN
1690: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20  TO t1 VALUES(7, 
16a0: 38 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  8);.  INSERT INT
16b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
16c0: 30 29 3b 0a 7d 0a 0a 64 6f 5f 63 61 74 63 68 73  0);.}..do_catchs
16d0: 71 6c 5f 74 65 73 74 20 37 2e 31 2e 31 20 7b 0a  ql_test 7.1.1 {.
16e0: 20 20 53 45 4c 45 43 54 20 6e 74 68 5f 76 61 6c    SELECT nth_val
16f0: 75 65 28 78 2c 20 31 29 20 46 52 4f 4d 20 74 31  ue(x, 1) FROM t1
1700: 3b 0a 7d 20 7b 31 20 7b 6d 69 73 75 73 65 20 6f  ;.} {1 {misuse o
1710: 66 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  f window functio
1720: 6e 20 6e 74 68 5f 76 61 6c 75 65 28 29 7d 7d 0a  n nth_value()}}.
1730: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
1740: 20 37 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43   7.1.2 {.  SELEC
1750: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1760: 45 20 6e 74 68 5f 76 61 6c 75 65 28 78 2c 20 31  E nth_value(x, 1
1770: 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59  ) OVER (ORDER BY
1780: 20 79 29 3b 0a 7d 20 7b 31 20 7b 6d 69 73 75 73   y);.} {1 {misus
1790: 65 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63  e of window func
17a0: 74 69 6f 6e 20 6e 74 68 5f 76 61 6c 75 65 28 29  tion nth_value()
17b0: 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74  }}.do_catchsql_t
17c0: 65 73 74 20 37 2e 31 2e 33 20 7b 0a 20 20 53 45  est 7.1.3 {.  SE
17d0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
17e0: 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79  OM t1 GROUP BY y
17f0: 20 48 41 56 49 4e 47 20 6e 74 68 5f 76 61 6c 75   HAVING nth_valu
1800: 65 28 78 2c 20 31 29 20 4f 56 45 52 20 28 4f 52  e(x, 1) OVER (OR
1810: 44 45 52 20 42 59 20 79 29 3b 0a 7d 20 7b 31 20  DER BY y);.} {1 
1820: 7b 6d 69 73 75 73 65 20 6f 66 20 77 69 6e 64 6f  {misuse of windo
1830: 77 20 66 75 6e 63 74 69 6f 6e 20 6e 74 68 5f 76  w function nth_v
1840: 61 6c 75 65 28 29 7d 7d 0a 64 6f 5f 63 61 74 63  alue()}}.do_catc
1850: 68 73 71 6c 5f 74 65 73 74 20 37 2e 31 2e 34 20  hsql_test 7.1.4 
1860: 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  {.  SELECT count
1870: 28 2a 29 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  (*) FROM t1 GROU
1880: 50 20 42 59 20 6e 74 68 5f 76 61 6c 75 65 28 78  P BY nth_value(x
1890: 2c 20 31 29 20 4f 56 45 52 20 28 4f 52 44 45 52  , 1) OVER (ORDER
18a0: 20 42 59 20 79 29 3b 0a 7d 20 7b 31 20 7b 6d 69   BY y);.} {1 {mi
18b0: 73 75 73 65 20 6f 66 20 77 69 6e 64 6f 77 20 66  suse of window f
18c0: 75 6e 63 74 69 6f 6e 20 6e 74 68 5f 76 61 6c 75  unction nth_valu
18d0: 65 28 29 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71  e()}}.do_catchsq
18e0: 6c 5f 74 65 73 74 20 37 2e 31 2e 35 20 7b 0a 20  l_test 7.1.5 {. 
18f0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1900: 20 46 52 4f 4d 20 74 31 20 4c 49 4d 49 54 20 6e   FROM t1 LIMIT n
1910: 74 68 5f 76 61 6c 75 65 28 78 2c 20 31 29 20 4f  th_value(x, 1) O
1920: 56 45 52 20 28 29 3b 0a 7d 20 7b 31 20 7b 6e 6f  VER ();.} {1 {no
1930: 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 78 7d   such column: x}
1940: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
1950: 73 74 20 37 2e 31 2e 36 20 7b 0a 20 20 53 45 4c  st 7.1.6 {.  SEL
1960: 45 43 54 20 74 72 69 6d 28 78 29 20 4f 56 45 52  ECT trim(x) OVER
1970: 20 28 4f 52 44 45 52 20 42 59 20 79 29 20 46 52   (ORDER BY y) FR
1980: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 7b 74 72 69  OM t1;.} {1 {tri
1990: 6d 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  m() may not be u
19a0: 73 65 64 20 61 73 20 61 20 77 69 6e 64 6f 77 20  sed as a window 
19b0: 66 75 6e 63 74 69 6f 6e 7d 7d 0a 64 6f 5f 63 61  function}}.do_ca
19c0: 74 63 68 73 71 6c 5f 74 65 73 74 20 37 2e 31 2e  tchsql_test 7.1.
19d0: 37 20 7b 0a 20 20 53 45 4c 45 43 54 20 6d 61 78  7 {.  SELECT max
19e0: 28 78 29 20 4f 56 45 52 20 61 62 63 20 46 52 4f  (x) OVER abc FRO
19f0: 4d 20 74 31 20 57 49 4e 44 4f 57 20 64 65 66 20  M t1 WINDOW def 
1a00: 41 53 20 28 4f 52 44 45 52 20 42 59 20 79 29 3b  AS (ORDER BY y);
1a10: 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 77  .} {1 {no such w
1a20: 69 6e 64 6f 77 3a 20 61 62 63 7d 7d 0a 64 6f 5f  indow: abc}}.do_
1a30: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 37 2e  catchsql_test 7.
1a40: 31 2e 38 20 7b 0a 20 20 53 45 4c 45 43 54 20 72  1.8 {.  SELECT r
1a50: 6f 77 5f 6e 75 6d 62 65 72 28 78 29 20 4f 56 45  ow_number(x) OVE
1a60: 52 20 28 29 20 46 52 4f 4d 20 74 31 0a 7d 20 7b  R () FROM t1.} {
1a70: 31 20 7b 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  1 {wrong number 
1a80: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
1a90: 66 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d  function row_num
1aa0: 62 65 72 28 29 7d 7d 0a 0a 64 6f 5f 65 78 65 63  ber()}}..do_exec
1ab0: 73 71 6c 5f 74 65 73 74 20 37 2e 32 20 7b 0a 20  sql_test 7.2 {. 
1ac0: 20 53 45 4c 45 43 54 20 0a 20 20 20 20 6c 65 61   SELECT .    lea
1ad0: 64 28 79 29 20 4f 56 45 52 20 77 69 6e 2c 20 0a  d(y) OVER win, .
1ae0: 20 20 20 20 6c 65 61 64 28 79 2c 20 32 29 20 4f      lead(y, 2) O
1af0: 56 45 52 20 77 69 6e 2c 20 0a 20 20 20 20 6c 65  VER win, .    le
1b00: 61 64 28 79 2c 20 33 2c 20 27 64 65 66 61 75 6c  ad(y, 3, 'defaul
1b10: 74 27 29 20 4f 56 45 52 20 77 69 6e 0a 20 20 46  t') OVER win.  F
1b20: 52 4f 4d 20 74 31 0a 20 20 57 49 4e 44 4f 57 20  ROM t1.  WINDOW 
1b30: 77 69 6e 20 41 53 20 28 4f 52 44 45 52 20 42 59  win AS (ORDER BY
1b40: 20 78 29 0a 7d 20 7b 0a 20 20 34 20 36 20 38 20   x).} {.  4 6 8 
1b50: 20 20 36 20 38 20 31 30 20 20 20 38 20 31 30 20    6 8 10   8 10 
1b60: 64 65 66 61 75 6c 74 20 20 20 31 30 20 7b 7d 20  default   10 {} 
1b70: 64 65 66 61 75 6c 74 20 20 20 7b 7d 20 7b 7d 20  default   {} {} 
1b80: 64 65 66 61 75 6c 74 0a 7d 0a 0a 64 6f 5f 65 78  default.}..do_ex
1b90: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 33 20 7b  ecsql_test 7.3 {
1ba0: 0a 20 20 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75  .  SELECT row_nu
1bb0: 6d 62 65 72 28 29 20 4f 56 45 52 20 28 4f 52 44  mber() OVER (ORD
1bc0: 45 52 20 42 59 20 78 29 20 46 52 4f 4d 20 74 31  ER BY x) FROM t1
1bd0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 7d 0a 0a  .} {1 2 3 4 5}..
1be0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1bf0: 37 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 0a  7.4 {.  SELECT .
1c00: 20 20 20 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29      row_number()
1c10: 20 4f 56 45 52 20 77 69 6e 2c 0a 20 20 20 20 6c   OVER win,.    l
1c20: 65 61 64 28 78 29 20 4f 56 45 52 20 77 69 6e 0a  ead(x) OVER win.
1c30: 20 20 46 52 4f 4d 20 74 31 0a 20 20 57 49 4e 44    FROM t1.  WIND
1c40: 4f 57 20 77 69 6e 20 41 53 20 28 4f 52 44 45 52  OW win AS (ORDER
1c50: 20 42 59 20 78 20 52 4f 57 53 20 42 45 54 57 45   BY x ROWS BETWE
1c60: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1c70: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
1c80: 4e 54 20 52 4f 57 29 0a 7d 20 7b 31 20 33 20 20  NT ROW).} {1 3  
1c90: 32 20 35 20 20 33 20 37 20 20 34 20 39 20 20 20  2 5  3 7  4 9   
1ca0: 35 20 7b 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  5 {}}..#--------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf0: 2d 0a 23 20 41 74 74 65 6d 70 74 20 74 6f 20 75  -.# Attempt to u
1d00: 73 65 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  se a window func
1d10: 74 69 6f 6e 20 69 6e 20 61 20 76 69 65 77 2e 0a  tion in a view..
1d20: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
1d30: 74 20 38 2e 30 20 7b 0a 20 20 43 52 45 41 54 45  t 8.0 {.  CREATE
1d40: 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 2c 20   TABLE t3(a, b, 
1d50: 63 29 3b 0a 0a 20 20 57 49 54 48 20 73 28 69 29  c);..  WITH s(i)
1d60: 20 41 53 20 28 20 56 41 4c 55 45 53 28 31 29 20   AS ( VALUES(1) 
1d70: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
1d80: 20 69 2b 31 20 46 52 4f 4d 20 73 20 57 48 45 52   i+1 FROM s WHER
1d90: 45 20 69 3c 36 20 29 0a 20 20 49 4e 53 45 52 54  E i<6 ).  INSERT
1da0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
1db0: 69 2c 20 69 2c 20 69 20 46 52 4f 4d 20 73 3b 0a  i, i, i FROM s;.
1dc0: 0a 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76  .  CREATE VIEW v
1dd0: 31 20 41 53 20 53 45 4c 45 43 54 0a 20 20 20 20  1 AS SELECT.    
1de0: 73 75 6d 28 62 29 20 4f 56 45 52 20 28 4f 52 44  sum(b) OVER (ORD
1df0: 45 52 20 42 59 20 63 29 2c 0a 20 20 20 20 6d 69  ER BY c),.    mi
1e00: 6e 28 62 29 20 4f 56 45 52 20 28 4f 52 44 45 52  n(b) OVER (ORDER
1e10: 20 42 59 20 63 29 2c 0a 20 20 20 20 6d 61 78 28   BY c),.    max(
1e20: 62 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42  b) OVER (ORDER B
1e30: 59 20 63 29 0a 20 20 46 52 4f 4d 20 74 33 3b 0a  Y c).  FROM t3;.
1e40: 0a 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76  .  CREATE VIEW v
1e50: 32 20 41 53 20 53 45 4c 45 43 54 0a 20 20 20 20  2 AS SELECT.    
1e60: 73 75 6d 28 62 29 20 4f 56 45 52 20 77 69 6e 2c  sum(b) OVER win,
1e70: 0a 20 20 20 20 6d 69 6e 28 62 29 20 4f 56 45 52  .    min(b) OVER
1e80: 20 77 69 6e 2c 0a 20 20 20 20 6d 61 78 28 62 29   win,.    max(b)
1e90: 20 4f 56 45 52 20 77 69 6e 0a 20 20 46 52 4f 4d   OVER win.  FROM
1ea0: 20 74 33 0a 20 20 57 49 4e 44 4f 57 20 77 69 6e   t3.  WINDOW win
1eb0: 20 41 53 20 28 4f 52 44 45 52 20 42 59 20 63 29   AS (ORDER BY c)
1ec0: 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ;.}..do_execsql_
1ed0: 74 65 73 74 20 38 2e 31 2e 31 20 7b 0a 20 20 53  test 8.1.1 {.  S
1ee0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 31 0a  ELECT * FROM v1.
1ef0: 7d 20 7b 31 20 31 20 31 20 20 33 20 31 20 32 20  } {1 1 1  3 1 2 
1f00: 20 36 20 31 20 33 20 20 31 30 20 31 20 34 20 20   6 1 3  10 1 4  
1f10: 31 35 20 31 20 35 20 20 32 31 20 31 20 36 7d 0a  15 1 5  21 1 6}.
1f20: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1f30: 38 2e 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  8.1.2 {.  SELECT
1f40: 20 2a 20 46 52 4f 4d 20 76 32 0a 7d 20 7b 31 20   * FROM v2.} {1 
1f50: 31 20 31 20 20 33 20 31 20 32 20 20 36 20 31 20  1 1  3 1 2  6 1 
1f60: 33 20 20 31 30 20 31 20 34 20 20 31 35 20 31 20  3  10 1 4  15 1 
1f70: 35 20 20 32 31 20 31 20 36 7d 0a 0a 64 62 20 63  5  21 1 6}..db c
1f80: 6c 6f 73 65 0a 73 71 6c 69 74 65 33 20 64 62 20  lose.sqlite3 db 
1f90: 74 65 73 74 2e 64 62 0a 64 6f 5f 65 78 65 63 73  test.db.do_execs
1fa0: 71 6c 5f 74 65 73 74 20 38 2e 32 2e 31 20 7b 0a  ql_test 8.2.1 {.
1fb0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1fc0: 76 31 0a 7d 20 7b 31 20 31 20 31 20 20 33 20 31  v1.} {1 1 1  3 1
1fd0: 20 32 20 20 36 20 31 20 33 20 20 31 30 20 31 20   2  6 1 3  10 1 
1fe0: 34 20 20 31 35 20 31 20 35 20 20 32 31 20 31 20  4  15 1 5  21 1 
1ff0: 36 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  6}.do_execsql_te
2000: 73 74 20 38 2e 32 2e 32 20 7b 0a 20 20 53 45 4c  st 8.2.2 {.  SEL
2010: 45 43 54 20 2a 20 46 52 4f 4d 20 76 32 0a 7d 20  ECT * FROM v2.} 
2020: 7b 31 20 31 20 31 20 20 33 20 31 20 32 20 20 36  {1 1 1  3 1 2  6
2030: 20 31 20 33 20 20 31 30 20 31 20 34 20 20 31 35   1 3  10 1 4  15
2040: 20 31 20 35 20 20 32 31 20 31 20 36 7d 0a 0a 23   1 5  21 1 6}..#
2050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 74 74 65  ---------.# Atte
20a0: 6d 70 74 20 74 6f 20 75 73 65 20 61 20 77 69 6e  mpt to use a win
20b0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  dow function in 
20c0: 61 20 74 72 69 67 67 65 72 2e 0a 23 0a 64 6f 5f  a trigger..#.do_
20d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 39 2e 30  execsql_test 9.0
20e0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
20f0: 45 20 74 34 28 78 2c 20 79 29 3b 0a 20 20 49 4e  E t4(x, y);.  IN
2100: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
2110: 55 45 53 28 31 2c 20 27 67 27 29 3b 0a 20 20 49  UES(1, 'g');.  I
2120: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
2130: 4c 55 45 53 28 32 2c 20 27 69 27 29 3b 0a 20 20  LUES(2, 'i');.  
2140: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
2150: 41 4c 55 45 53 28 33 2c 20 27 6c 27 29 3b 0a 20  ALUES(3, 'l');. 
2160: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
2170: 56 41 4c 55 45 53 28 34 2c 20 27 67 27 29 3b 0a  VALUES(4, 'g');.
2180: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
2190: 20 56 41 4c 55 45 53 28 35 2c 20 27 61 27 29 3b   VALUES(5, 'a');
21a0: 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
21b0: 20 74 35 28 78 2c 20 79 2c 20 6d 29 3b 0a 20 20   t5(x, y, m);.  
21c0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
21d0: 34 69 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  4i AFTER INSERT 
21e0: 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20  ON t4 BEGIN.    
21f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 35 3b 0a  DELETE FROM t5;.
2200: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2210: 74 35 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t5 .      SELECT
2220: 20 78 2c 20 79 2c 20 6d 61 78 28 79 29 20 4f 56   x, y, max(y) OV
2230: 45 52 20 78 79 7a 20 46 52 4f 4d 20 74 34 0a 20  ER xyz FROM t4. 
2240: 20 20 20 20 20 57 49 4e 44 4f 57 20 78 79 7a 20       WINDOW xyz 
2250: 41 53 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59  AS (PARTITION BY
2260: 20 28 78 25 32 29 20 4f 52 44 45 52 20 42 59 20   (x%2) ORDER BY 
2270: 78 29 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 0a 64 6f  x);.  END;.}..do
2280: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 39 2e  _execsql_test 9.
2290: 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 78  1.1 {.  SELECT x
22a0: 2c 20 79 2c 20 6d 61 78 28 79 29 20 4f 56 45 52  , y, max(y) OVER
22b0: 20 78 79 7a 20 46 52 4f 4d 20 74 34 0a 20 20 20   xyz FROM t4.   
22c0: 20 20 20 57 49 4e 44 4f 57 20 78 79 7a 20 41 53     WINDOW xyz AS
22d0: 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 28   (PARTITION BY (
22e0: 78 25 32 29 20 4f 52 44 45 52 20 42 59 20 78 29  x%2) ORDER BY x)
22f0: 20 4f 52 44 45 52 20 42 59 20 31 0a 7d 20 7b 31   ORDER BY 1.} {1
2300: 20 67 20 67 20 20 20 32 20 69 20 69 20 20 20 33   g g   2 i i   3
2310: 20 6c 20 6c 20 20 20 34 20 67 20 69 20 20 20 35   l l   4 g i   5
2320: 20 61 20 6c 7d 0a 0a 64 6f 5f 65 78 65 63 73 71   a l}..do_execsq
2330: 6c 5f 74 65 73 74 20 39 2e 31 2e 32 20 7b 0a 20  l_test 9.1.2 {. 
2340: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
2350: 56 41 4c 55 45 53 28 36 2c 20 27 6d 27 29 3b 0a  VALUES(6, 'm');.
2360: 20 20 53 45 4c 45 43 54 20 78 2c 20 79 2c 20 6d    SELECT x, y, m
2370: 61 78 28 79 29 20 4f 56 45 52 20 78 79 7a 20 46  ax(y) OVER xyz F
2380: 52 4f 4d 20 74 34 0a 20 20 20 20 20 20 57 49 4e  ROM t4.      WIN
2390: 44 4f 57 20 78 79 7a 20 41 53 20 28 50 41 52 54  DOW xyz AS (PART
23a0: 49 54 49 4f 4e 20 42 59 20 28 78 25 32 29 20 4f  ITION BY (x%2) O
23b0: 52 44 45 52 20 42 59 20 78 29 20 4f 52 44 45 52  RDER BY x) ORDER
23c0: 20 42 59 20 31 0a 7d 20 7b 31 20 67 20 67 20 20   BY 1.} {1 g g  
23d0: 20 32 20 69 20 69 20 20 20 33 20 6c 20 6c 20 20   2 i i   3 l l  
23e0: 20 34 20 67 20 69 20 20 20 35 20 61 20 6c 20 20   4 g i   5 a l  
23f0: 20 36 20 6d 20 6d 7d 0a 0a 64 6f 5f 65 78 65 63   6 m m}..do_exec
2400: 73 71 6c 5f 74 65 73 74 20 39 2e 31 2e 33 20 7b  sql_test 9.1.3 {
2410: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
2420: 20 74 35 20 4f 52 44 45 52 20 42 59 20 31 0a 7d   t5 ORDER BY 1.}
2430: 20 7b 31 20 67 20 67 20 20 20 32 20 69 20 69 20   {1 g g   2 i i 
2440: 20 20 33 20 6c 20 6c 20 20 20 34 20 67 20 69 20    3 l l   4 g i 
2450: 20 20 35 20 61 20 6c 20 20 20 36 20 6d 20 6d 7d    5 a l   6 m m}
2460: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
2470: 74 20 39 2e 32 20 7b 0a 20 20 57 49 54 48 20 61  t 9.2 {.  WITH a
2480: 61 61 28 78 2c 20 79 2c 20 7a 29 20 41 53 20 28  aa(x, y, z) AS (
2490: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20 79  .    SELECT x, y
24a0: 2c 20 6d 61 78 28 79 29 20 4f 56 45 52 20 78 79  , max(y) OVER xy
24b0: 7a 20 46 52 4f 4d 20 74 34 0a 20 20 20 20 57 49  z FROM t4.    WI
24c0: 4e 44 4f 57 20 78 79 7a 20 41 53 20 28 50 41 52  NDOW xyz AS (PAR
24d0: 54 49 54 49 4f 4e 20 42 59 20 28 78 25 32 29 20  TITION BY (x%2) 
24e0: 4f 52 44 45 52 20 42 59 20 78 29 0a 20 20 29 0a  ORDER BY x).  ).
24f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2500: 61 61 61 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  aaa ORDER BY 1;.
2510: 7d 20 7b 31 20 67 20 67 20 20 20 32 20 69 20 69  } {1 g g   2 i i
2520: 20 20 20 33 20 6c 20 6c 20 20 20 34 20 67 20 69     3 l l   4 g i
2530: 20 20 20 35 20 61 20 6c 20 20 20 36 20 6d 20 6d     5 a l   6 m m
2540: 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }..do_execsql_te
2550: 73 74 20 39 2e 33 20 7b 0a 20 20 57 49 54 48 20  st 9.3 {.  WITH 
2560: 61 61 61 28 78 2c 20 79 2c 20 7a 29 20 41 53 20  aaa(x, y, z) AS 
2570: 28 0a 20 20 20 20 53 45 4c 45 43 54 20 78 2c 20  (.    SELECT x, 
2580: 79 2c 20 6d 61 78 28 79 29 20 4f 56 45 52 20 78  y, max(y) OVER x
2590: 79 7a 20 46 52 4f 4d 20 74 34 0a 20 20 20 20 57  yz FROM t4.    W
25a0: 49 4e 44 4f 57 20 78 79 7a 20 41 53 20 28 4f 52  INDOW xyz AS (OR
25b0: 44 45 52 20 42 59 20 78 29 0a 20 20 29 0a 20 20  DER BY x).  ).  
25c0: 53 45 4c 45 43 54 20 2a 2c 20 6d 69 6e 28 7a 29  SELECT *, min(z)
25d0: 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20   OVER (ORDER BY 
25e0: 78 29 20 46 52 4f 4d 20 61 61 61 20 4f 52 44 45  x) FROM aaa ORDE
25f0: 52 20 42 59 20 31 3b 0a 7d 20 7b 31 20 67 20 67  R BY 1;.} {1 g g
2600: 20 67 20 20 20 32 20 69 20 69 20 67 20 20 20 33   g   2 i i g   3
2610: 20 6c 20 6c 20 67 20 20 20 34 20 67 20 6c 20 67   l l g   4 g l g
2620: 20 20 20 35 20 61 20 6c 20 67 20 20 20 36 20 6d     5 a l g   6 m
2630: 20 6d 20 67 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   m g}..#--------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  -.#.do_execsql_t
2690: 65 73 74 20 31 30 2e 30 20 7b 0a 20 20 43 52 45  est 10.0 {.  CRE
26a0: 41 54 45 20 54 41 42 4c 45 20 73 61 6c 65 73 28  ATE TABLE sales(
26b0: 65 6d 70 20 54 45 58 54 20 50 52 49 4d 41 52 59  emp TEXT PRIMARY
26c0: 20 4b 45 59 2c 20 72 65 67 69 6f 6e 2c 20 74 6f   KEY, region, to
26d0: 74 61 6c 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  tal);.  INSERT I
26e0: 4e 54 4f 20 73 61 6c 65 73 20 56 41 4c 55 45 53  NTO sales VALUES
26f0: 0a 20 20 20 20 20 20 28 27 41 6c 69 63 65 27 2c  .      ('Alice',
2700: 20 20 20 20 20 27 4e 6f 72 74 68 27 2c 20 33 34       'North', 34
2710: 29 2c 0a 20 20 20 20 20 20 28 27 46 72 61 6e 6b  ),.      ('Frank
2720: 27 2c 20 20 20 20 20 27 53 6f 75 74 68 27 2c 20  ',     'South', 
2730: 32 32 29 2c 0a 20 20 20 20 20 20 28 27 43 68 61  22),.      ('Cha
2740: 72 6c 65 73 27 2c 20 20 20 27 4e 6f 72 74 68 27  rles',   'North'
2750: 2c 20 34 35 29 2c 0a 20 20 20 20 20 20 28 27 44  , 45),.      ('D
2760: 61 72 72 65 6c 6c 27 2c 20 20 20 27 53 6f 75 74  arrell',   'Sout
2770: 68 27 2c 20 38 29 2c 0a 20 20 20 20 20 20 28 27  h', 8),.      ('
2780: 47 72 61 6e 74 27 2c 20 20 20 20 20 27 53 6f 75  Grant',     'Sou
2790: 74 68 27 2c 20 32 33 29 2c 0a 20 20 20 20 20 20  th', 23),.      
27a0: 28 27 42 72 61 64 27 20 2c 20 20 20 20 20 27 4e  ('Brad' ,     'N
27b0: 6f 72 74 68 27 2c 20 32 32 29 2c 0a 20 20 20 20  orth', 22),.    
27c0: 20 20 28 27 45 6c 69 7a 61 62 65 74 68 27 2c 20    ('Elizabeth', 
27d0: 27 53 6f 75 74 68 27 2c 20 39 39 29 2c 0a 20 20  'South', 99),.  
27e0: 20 20 20 20 28 27 48 6f 72 61 63 65 27 2c 20 20      ('Horace',  
27f0: 20 20 27 45 61 73 74 27 2c 20 20 20 31 29 3b 0a    'East',   1);.
2800: 7d 0a 0a 23 20 42 65 73 74 20 74 77 6f 20 73 61  }..# Best two sa
2810: 6c 65 73 70 65 6f 70 6c 65 20 66 72 6f 6d 20 65  lespeople from e
2820: 61 63 68 20 72 65 67 69 6f 6e 0a 23 0a 64 6f 5f  ach region.#.do_
2830: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30 2e  execsql_test 10.
2840: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 65 6d 70  1 {.  SELECT emp
2850: 2c 20 72 65 67 69 6f 6e 2c 20 74 6f 74 61 6c 20  , region, total 
2860: 46 52 4f 4d 20 28 0a 20 20 20 20 53 45 4c 45 43  FROM (.    SELEC
2870: 54 20 0a 20 20 20 20 20 20 65 6d 70 2c 20 72 65  T .      emp, re
2880: 67 69 6f 6e 2c 20 74 6f 74 61 6c 2c 0a 20 20 20  gion, total,.   
2890: 20 20 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20     row_number() 
28a0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
28b0: 42 59 20 72 65 67 69 6f 6e 20 4f 52 44 45 52 20  BY region ORDER 
28c0: 42 59 20 74 6f 74 61 6c 20 44 45 53 43 29 20 41  BY total DESC) A
28d0: 53 20 72 61 6e 6b 0a 20 20 20 20 46 52 4f 4d 20  S rank.    FROM 
28e0: 73 61 6c 65 73 0a 20 20 29 20 57 48 45 52 45 20  sales.  ) WHERE 
28f0: 72 61 6e 6b 3c 3d 32 20 4f 52 44 45 52 20 42 59  rank<=2 ORDER BY
2900: 20 72 65 67 69 6f 6e 2c 20 74 6f 74 61 6c 20 44   region, total D
2910: 45 53 43 0a 7d 20 7b 0a 20 20 48 6f 72 61 63 65  ESC.} {.  Horace
2920: 20 20 20 20 20 20 45 61 73 74 20 20 20 20 20 31        East     1
2930: 0a 20 20 43 68 61 72 6c 65 73 20 20 20 20 20 4e  .  Charles     N
2940: 6f 72 74 68 20 20 20 34 35 0a 20 20 41 6c 69 63  orth   45.  Alic
2950: 65 20 20 20 20 20 20 20 4e 6f 72 74 68 20 20 20  e       North   
2960: 33 34 0a 20 20 45 6c 69 7a 61 62 65 74 68 20 20  34.  Elizabeth  
2970: 20 53 6f 75 74 68 20 20 20 39 39 0a 20 20 47 72   South   99.  Gr
2980: 61 6e 74 20 20 20 20 20 20 20 53 6f 75 74 68 20  ant       South 
2990: 20 20 32 33 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73    23.}..do_execs
29a0: 71 6c 5f 74 65 73 74 20 31 30 2e 32 20 7b 0a 20  ql_test 10.2 {. 
29b0: 20 53 45 4c 45 43 54 20 65 6d 70 2c 20 72 65 67   SELECT emp, reg
29c0: 69 6f 6e 2c 20 73 75 6d 28 74 6f 74 61 6c 29 20  ion, sum(total) 
29d0: 4f 56 45 52 20 77 69 6e 20 46 52 4f 4d 20 73 61  OVER win FROM sa
29e0: 6c 65 73 0a 20 20 57 49 4e 44 4f 57 20 77 69 6e  les.  WINDOW win
29f0: 20 41 53 20 28 50 41 52 54 49 54 49 4f 4e 20 42   AS (PARTITION B
2a00: 59 20 72 65 67 69 6f 6e 20 4f 52 44 45 52 20 42  Y region ORDER B
2a10: 59 20 74 6f 74 61 6c 29 0a 7d 20 7b 0a 20 20 48  Y total).} {.  H
2a20: 6f 72 61 63 65 20 45 61 73 74 20 20 20 20 20 20  orace East      
2a30: 20 31 20 20 0a 20 20 42 72 61 64 20 4e 6f 72 74   1  .  Brad Nort
2a40: 68 20 20 20 20 20 20 20 32 32 20 0a 20 20 41 6c  h       22 .  Al
2a50: 69 63 65 20 4e 6f 72 74 68 20 20 20 20 20 20 35  ice North      5
2a60: 36 20 0a 20 20 43 68 61 72 6c 65 73 20 4e 6f 72  6 .  Charles Nor
2a70: 74 68 20 20 20 31 30 31 20 0a 20 20 44 61 72 72  th   101 .  Darr
2a80: 65 6c 6c 20 53 6f 75 74 68 20 20 20 20 20 38 20  ell South     8 
2a90: 0a 20 20 46 72 61 6e 6b 20 53 6f 75 74 68 20 20  .  Frank South  
2aa0: 20 20 20 20 33 30 20 0a 20 20 47 72 61 6e 74 20      30 .  Grant 
2ab0: 53 6f 75 74 68 20 20 20 20 20 20 35 33 20 0a 20  South      53 . 
2ac0: 20 45 6c 69 7a 61 62 65 74 68 20 53 6f 75 74 68   Elizabeth South
2ad0: 20 31 35 32 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73   152.}..do_execs
2ae0: 71 6c 5f 74 65 73 74 20 31 30 2e 33 20 7b 0a 20  ql_test 10.3 {. 
2af0: 20 53 45 4c 45 43 54 20 65 6d 70 2c 20 72 65 67   SELECT emp, reg
2b00: 69 6f 6e 2c 20 73 75 6d 28 74 6f 74 61 6c 29 20  ion, sum(total) 
2b10: 4f 56 45 52 20 77 69 6e 20 46 52 4f 4d 20 73 61  OVER win FROM sa
2b20: 6c 65 73 0a 20 20 57 49 4e 44 4f 57 20 77 69 6e  les.  WINDOW win
2b30: 20 41 53 20 28 50 41 52 54 49 54 49 4f 4e 20 42   AS (PARTITION B
2b40: 59 20 72 65 67 69 6f 6e 20 4f 52 44 45 52 20 42  Y region ORDER B
2b50: 59 20 74 6f 74 61 6c 29 0a 20 20 4c 49 4d 49 54  Y total).  LIMIT
2b60: 20 35 0a 7d 20 7b 0a 20 20 48 6f 72 61 63 65 20   5.} {.  Horace 
2b70: 45 61 73 74 20 20 20 20 20 20 20 31 20 20 0a 20  East       1  . 
2b80: 20 42 72 61 64 20 4e 6f 72 74 68 20 20 20 20 20   Brad North     
2b90: 20 20 32 32 20 0a 20 20 41 6c 69 63 65 20 4e 6f    22 .  Alice No
2ba0: 72 74 68 20 20 20 20 20 20 35 36 20 0a 20 20 43  rth      56 .  C
2bb0: 68 61 72 6c 65 73 20 4e 6f 72 74 68 20 20 20 31  harles North   1
2bc0: 30 31 20 0a 20 20 44 61 72 72 65 6c 6c 20 53 6f  01 .  Darrell So
2bd0: 75 74 68 20 20 20 20 20 38 20 0a 7d 0a 0a 64 6f  uth     8 .}..do
2be0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30  _execsql_test 10
2bf0: 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 65 6d  .4 {.  SELECT em
2c00: 70 2c 20 72 65 67 69 6f 6e 2c 20 73 75 6d 28 74  p, region, sum(t
2c10: 6f 74 61 6c 29 20 4f 56 45 52 20 77 69 6e 20 46  otal) OVER win F
2c20: 52 4f 4d 20 73 61 6c 65 73 0a 20 20 57 49 4e 44  ROM sales.  WIND
2c30: 4f 57 20 77 69 6e 20 41 53 20 28 50 41 52 54 49  OW win AS (PARTI
2c40: 54 49 4f 4e 20 42 59 20 72 65 67 69 6f 6e 20 4f  TION BY region O
2c50: 52 44 45 52 20 42 59 20 74 6f 74 61 6c 29 0a 20  RDER BY total). 
2c60: 20 4c 49 4d 49 54 20 35 20 4f 46 46 53 45 54 20   LIMIT 5 OFFSET 
2c70: 32 0a 7d 20 7b 0a 20 20 41 6c 69 63 65 20 4e 6f  2.} {.  Alice No
2c80: 72 74 68 20 20 20 20 20 20 35 36 20 0a 20 20 43  rth      56 .  C
2c90: 68 61 72 6c 65 73 20 4e 6f 72 74 68 20 20 20 31  harles North   1
2ca0: 30 31 20 0a 20 20 44 61 72 72 65 6c 6c 20 53 6f  01 .  Darrell So
2cb0: 75 74 68 20 20 20 20 20 38 20 0a 20 20 46 72 61  uth     8 .  Fra
2cc0: 6e 6b 20 53 6f 75 74 68 20 20 20 20 20 20 33 30  nk South      30
2cd0: 20 0a 20 20 47 72 61 6e 74 20 53 6f 75 74 68 20   .  Grant South 
2ce0: 20 20 20 20 20 35 33 20 0a 7d 0a 0a 64 6f 5f 65       53 .}..do_e
2cf0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30 2e 35  xecsql_test 10.5
2d00: 20 7b 0a 20 20 53 45 4c 45 43 54 20 65 6d 70 2c   {.  SELECT emp,
2d10: 20 72 65 67 69 6f 6e 2c 20 73 75 6d 28 74 6f 74   region, sum(tot
2d20: 61 6c 29 20 4f 56 45 52 20 77 69 6e 20 46 52 4f  al) OVER win FRO
2d30: 4d 20 73 61 6c 65 73 0a 20 20 57 49 4e 44 4f 57  M sales.  WINDOW
2d40: 20 77 69 6e 20 41 53 20 28 0a 20 20 20 20 50 41   win AS (.    PA
2d50: 52 54 49 54 49 4f 4e 20 42 59 20 72 65 67 69 6f  RTITION BY regio
2d60: 6e 20 4f 52 44 45 52 20 42 59 20 74 6f 74 61 6c  n ORDER BY total
2d70: 20 0a 20 20 20 20 52 4f 57 53 20 42 45 54 57 45   .    ROWS BETWE
2d80: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
2d90: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
2da0: 4c 4f 57 49 4e 47 0a 20 20 29 0a 7d 20 7b 0a 20  LOWING.  ).} {. 
2db0: 20 48 6f 72 61 63 65 20 45 61 73 74 20 20 20 20   Horace East    
2dc0: 20 20 20 31 20 20 0a 20 20 42 72 61 64 20 4e 6f     1  .  Brad No
2dd0: 72 74 68 20 20 20 20 20 20 31 30 31 0a 20 20 41  rth      101.  A
2de0: 6c 69 63 65 20 4e 6f 72 74 68 20 20 20 20 20 20  lice North      
2df0: 37 39 20 0a 20 20 43 68 61 72 6c 65 73 20 4e 6f  79 .  Charles No
2e00: 72 74 68 20 20 20 20 34 35 20 0a 20 20 44 61 72  rth    45 .  Dar
2e10: 72 65 6c 6c 20 53 6f 75 74 68 20 20 20 31 35 32  rell South   152
2e20: 0a 20 20 46 72 61 6e 6b 20 53 6f 75 74 68 20 20  .  Frank South  
2e30: 20 20 20 31 34 34 20 0a 20 20 47 72 61 6e 74 20     144 .  Grant 
2e40: 53 6f 75 74 68 20 20 20 20 20 31 32 32 20 0a 20  South     122 . 
2e50: 20 45 6c 69 7a 61 62 65 74 68 20 53 6f 75 74 68   Elizabeth South
2e60: 20 20 39 39 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73    99.}..do_execs
2e70: 71 6c 5f 74 65 73 74 20 31 30 2e 36 20 7b 0a 20  ql_test 10.6 {. 
2e80: 20 53 45 4c 45 43 54 20 65 6d 70 2c 20 72 65 67   SELECT emp, reg
2e90: 69 6f 6e 2c 20 73 75 6d 28 74 6f 74 61 6c 29 20  ion, sum(total) 
2ea0: 4f 56 45 52 20 77 69 6e 20 46 52 4f 4d 20 73 61  OVER win FROM sa
2eb0: 6c 65 73 0a 20 20 57 49 4e 44 4f 57 20 77 69 6e  les.  WINDOW win
2ec0: 20 41 53 20 28 0a 20 20 20 20 50 41 52 54 49 54   AS (.    PARTIT
2ed0: 49 4f 4e 20 42 59 20 72 65 67 69 6f 6e 20 4f 52  ION BY region OR
2ee0: 44 45 52 20 42 59 20 74 6f 74 61 6c 20 0a 20 20  DER BY total .  
2ef0: 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43    ROWS BETWEEN C
2f00: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
2f10: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
2f20: 4e 47 0a 20 20 29 20 4c 49 4d 49 54 20 35 20 4f  NG.  ) LIMIT 5 O
2f30: 46 46 53 45 54 20 32 0a 7d 20 7b 0a 20 20 41 6c  FFSET 2.} {.  Al
2f40: 69 63 65 20 4e 6f 72 74 68 20 20 20 20 20 20 37  ice North      7
2f50: 39 20 0a 20 20 43 68 61 72 6c 65 73 20 4e 6f 72  9 .  Charles Nor
2f60: 74 68 20 20 20 20 34 35 20 0a 20 20 44 61 72 72  th    45 .  Darr
2f70: 65 6c 6c 20 53 6f 75 74 68 20 20 20 31 35 32 0a  ell South   152.
2f80: 20 20 46 72 61 6e 6b 20 53 6f 75 74 68 20 20 20    Frank South   
2f90: 20 20 31 34 34 20 0a 20 20 47 72 61 6e 74 20 53    144 .  Grant S
2fa0: 6f 75 74 68 20 20 20 20 20 31 32 32 20 0a 7d 0a  outh     122 .}.
2fb0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2fc0: 20 31 30 2e 37 20 7b 0a 20 20 53 45 4c 45 43 54   10.7 {.  SELECT
2fd0: 20 65 6d 70 2c 20 72 65 67 69 6f 6e 2c 20 28 0a   emp, region, (.
2fe0: 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 74      SELECT sum(t
2ff0: 6f 74 61 6c 29 20 4f 56 45 52 20 28 0a 20 20 20  otal) OVER (.   
3000: 20 20 20 4f 52 44 45 52 20 42 59 20 74 6f 74 61     ORDER BY tota
3010: 6c 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  l RANGE BETWEEN 
3020: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
3030: 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
3040: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20 20  D FOLLOWING.    
3050: 29 20 7c 7c 20 6f 75 74 65 72 2e 65 6d 70 20 46  ) || outer.emp F
3060: 52 4f 4d 20 73 61 6c 65 73 0a 20 20 29 20 46 52  ROM sales.  ) FR
3070: 4f 4d 20 73 61 6c 65 73 20 41 53 20 6f 75 74 65  OM sales AS oute
3080: 72 3b 0a 7d 20 7b 0a 20 20 41 6c 69 63 65 20 4e  r;.} {.  Alice N
3090: 6f 72 74 68 20 32 35 34 41 6c 69 63 65 20 0a 20  orth 254Alice . 
30a0: 20 46 72 61 6e 6b 20 53 6f 75 74 68 20 32 35 34   Frank South 254
30b0: 46 72 61 6e 6b 20 0a 20 20 43 68 61 72 6c 65 73  Frank .  Charles
30c0: 20 4e 6f 72 74 68 20 32 35 34 43 68 61 72 6c 65   North 254Charle
30d0: 73 20 0a 20 20 44 61 72 72 65 6c 6c 20 53 6f 75  s .  Darrell Sou
30e0: 74 68 20 32 35 34 44 61 72 72 65 6c 6c 20 0a 20  th 254Darrell . 
30f0: 20 47 72 61 6e 74 20 53 6f 75 74 68 20 32 35 34   Grant South 254
3100: 47 72 61 6e 74 20 0a 20 20 42 72 61 64 20 4e 6f  Grant .  Brad No
3110: 72 74 68 20 32 35 34 42 72 61 64 20 0a 20 20 45  rth 254Brad .  E
3120: 6c 69 7a 61 62 65 74 68 20 53 6f 75 74 68 20 32  lizabeth South 2
3130: 35 34 45 6c 69 7a 61 62 65 74 68 20 0a 20 20 48  54Elizabeth .  H
3140: 6f 72 61 63 65 20 45 61 73 74 20 32 35 34 48 6f  orace East 254Ho
3150: 72 61 63 65 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  race.}..do_execs
3160: 71 6c 5f 74 65 73 74 20 31 30 2e 38 20 7b 0a 20  ql_test 10.8 {. 
3170: 20 53 45 4c 45 43 54 20 65 6d 70 2c 20 72 65 67   SELECT emp, reg
3180: 69 6f 6e 2c 20 28 0a 20 20 20 20 53 45 4c 45 43  ion, (.    SELEC
3190: 54 20 73 75 6d 28 74 6f 74 61 6c 29 20 46 49 4c  T sum(total) FIL
31a0: 54 45 52 20 28 57 48 45 52 45 20 73 61 6c 65 73  TER (WHERE sales
31b0: 2e 65 6d 70 21 3d 6f 75 74 65 72 2e 65 6d 70 29  .emp!=outer.emp)
31c0: 20 4f 56 45 52 20 28 0a 20 20 20 20 20 20 4f 52   OVER (.      OR
31d0: 44 45 52 20 42 59 20 74 6f 74 61 6c 20 52 41 4e  DER BY total RAN
31e0: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
31f0: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
3200: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
3210: 4c 4f 57 49 4e 47 0a 20 20 20 20 29 20 46 52 4f  LOWING.    ) FRO
3220: 4d 20 73 61 6c 65 73 0a 20 20 29 20 46 52 4f 4d  M sales.  ) FROM
3230: 20 73 61 6c 65 73 20 41 53 20 6f 75 74 65 72 3b   sales AS outer;
3240: 0a 7d 20 7b 0a 20 20 41 6c 69 63 65 20 4e 6f 72  .} {.  Alice Nor
3250: 74 68 20 32 32 30 20 0a 20 20 46 72 61 6e 6b 20  th 220 .  Frank 
3260: 53 6f 75 74 68 20 32 33 32 20 0a 20 20 43 68 61  South 232 .  Cha
3270: 72 6c 65 73 20 4e 6f 72 74 68 20 32 30 39 20 0a  rles North 209 .
3280: 20 20 44 61 72 72 65 6c 6c 20 53 6f 75 74 68 20    Darrell South 
3290: 32 34 36 0a 20 20 47 72 61 6e 74 20 53 6f 75 74  246.  Grant Sout
32a0: 68 20 32 33 31 20 0a 20 20 42 72 61 64 20 4e 6f  h 231 .  Brad No
32b0: 72 74 68 20 32 33 32 20 0a 20 20 45 6c 69 7a 61  rth 232 .  Eliza
32c0: 62 65 74 68 20 53 6f 75 74 68 20 31 35 35 20 0a  beth South 155 .
32d0: 20 20 48 6f 72 61 63 65 20 45 61 73 74 20 32 35    Horace East 25
32e0: 33 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  3.}..#----------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3330: 23 20 43 68 65 63 6b 20 74 68 61 74 20 69 74 20  # Check that it 
3340: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
3350: 74 6f 20 75 73 65 20 61 20 77 69 6e 64 6f 77 20  to use a window 
3360: 66 75 6e 63 74 69 6f 6e 20 69 6e 20 61 20 43 52  function in a CR
3370: 45 41 54 45 20 49 4e 44 45 58 0a 23 20 73 74 61  EATE INDEX.# sta
3380: 74 65 6d 65 6e 74 2e 0a 23 0a 64 6f 5f 65 78 65  tement..#.do_exe
3390: 63 73 71 6c 5f 74 65 73 74 20 31 31 2e 30 20 7b  csql_test 11.0 {
33a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36   CREATE TABLE t6
33b0: 28 61 2c 20 62 2c 20 63 29 3b 20 7d 0a 0a 64 6f  (a, b, c); }..do
33c0: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31  _catchsql_test 1
33d0: 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 49  1.1 {.  CREATE I
33e0: 4e 44 45 58 20 74 36 69 20 4f 4e 20 74 36 28 61  NDEX t6i ON t6(a
33f0: 29 20 57 48 45 52 45 20 73 75 6d 28 62 29 20 4f  ) WHERE sum(b) O
3400: 56 45 52 20 28 29 3b 0a 7d 20 7b 31 20 7b 6d 69  VER ();.} {1 {mi
3410: 73 75 73 65 20 6f 66 20 77 69 6e 64 6f 77 20 66  suse of window f
3420: 75 6e 63 74 69 6f 6e 20 73 75 6d 28 29 7d 7d 0a  unction sum()}}.
3430: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
3440: 20 31 31 2e 32 20 7b 0a 20 20 43 52 45 41 54 45   11.2 {.  CREATE
3450: 20 49 4e 44 45 58 20 74 36 69 20 4f 4e 20 74 36   INDEX t6i ON t6
3460: 28 61 29 20 57 48 45 52 45 20 6c 65 61 64 28 62  (a) WHERE lead(b
3470: 29 20 4f 56 45 52 20 28 29 3b 0a 7d 20 7b 31 20  ) OVER ();.} {1 
3480: 7b 6d 69 73 75 73 65 20 6f 66 20 77 69 6e 64 6f  {misuse of windo
3490: 77 20 66 75 6e 63 74 69 6f 6e 20 6c 65 61 64 28  w function lead(
34a0: 29 7d 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c  )}}..do_catchsql
34b0: 5f 74 65 73 74 20 31 31 2e 33 20 7b 0a 20 20 43  _test 11.3 {.  C
34c0: 52 45 41 54 45 20 49 4e 44 45 58 20 74 36 69 20  REATE INDEX t6i 
34d0: 4f 4e 20 74 36 28 73 75 6d 28 62 29 20 4f 56 45  ON t6(sum(b) OVE
34e0: 52 20 28 29 29 3b 0a 7d 20 7b 31 20 7b 6d 69 73  R ());.} {1 {mis
34f0: 75 73 65 20 6f 66 20 77 69 6e 64 6f 77 20 66 75  use of window fu
3500: 6e 63 74 69 6f 6e 20 73 75 6d 28 29 7d 7d 0a 64  nction sum()}}.d
3510: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
3520: 31 31 2e 34 20 7b 0a 20 20 43 52 45 41 54 45 20  11.4 {.  CREATE 
3530: 49 4e 44 45 58 20 74 36 69 20 4f 4e 20 74 36 28  INDEX t6i ON t6(
3540: 6c 65 61 64 28 62 29 20 4f 56 45 52 20 28 29 29  lead(b) OVER ())
3550: 3b 0a 7d 20 7b 31 20 7b 6d 69 73 75 73 65 20 6f  ;.} {1 {misuse o
3560: 66 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  f window functio
3570: 6e 20 6c 65 61 64 28 29 7d 7d 0a 0a 23 20 32 30  n lead()}}..# 20
3580: 31 38 2d 30 39 2d 31 37 20 74 69 63 6b 65 74 20  18-09-17 ticket 
3590: 35 31 30 63 64 65 32 37 37 37 38 33 62 35 66 62  510cde277783b5fb
35a0: 35 64 65 36 32 38 33 39 33 39 35 39 38 34 39 64  5de628393959849d
35b0: 66 66 33 37 37 65 62 33 0a 23 20 45 6e 64 6c 65  ff377eb3.# Endle
35c0: 73 73 20 6c 6f 6f 70 20 6f 6e 20 61 20 71 75 65  ss loop on a que
35d0: 72 79 20 77 69 74 68 20 77 69 6e 64 6f 77 20 66  ry with window f
35e0: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 61 20 6c  unctions and a l
35f0: 69 6d 69 74 0a 23 0a 64 6f 5f 65 78 65 63 73 71  imit.#.do_execsq
3600: 6c 5f 74 65 73 74 20 31 32 2e 31 30 30 20 7b 0a  l_test 12.100 {.
3610: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
3620: 45 58 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45  EXISTS t1;.  CRE
3630: 41 54 45 20 54 41 42 4c 45 20 74 31 28 69 64 20  ATE TABLE t1(id 
3640: 49 4e 54 2c 20 62 20 56 41 52 43 48 41 52 2c 20  INT, b VARCHAR, 
3650: 63 20 56 41 52 43 48 41 52 29 3b 0a 20 20 49 4e  c VARCHAR);.  IN
3660: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3670: 55 45 53 28 31 2c 20 27 41 27 2c 20 27 6f 6e 65  UES(1, 'A', 'one
3680: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
3690: 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 20 27  O t1 VALUES(2, '
36a0: 42 27 2c 20 27 74 77 6f 27 29 3b 0a 20 20 49 4e  B', 'two');.  IN
36b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
36c0: 55 45 53 28 33 2c 20 27 43 27 2c 20 27 74 68 72  UES(3, 'C', 'thr
36d0: 65 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ee');.  INSERT I
36e0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
36f0: 20 27 44 27 2c 20 27 6f 6e 65 27 29 3b 0a 20 20   'D', 'one');.  
3700: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3710: 41 4c 55 45 53 28 35 2c 20 27 45 27 2c 20 27 74  ALUES(5, 'E', 't
3720: 77 6f 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 69  wo');.  SELECT i
3730: 64 2c 20 62 2c 20 6c 65 61 64 28 63 2c 31 29 20  d, b, lead(c,1) 
3740: 4f 56 45 52 28 4f 52 44 45 52 20 42 59 20 63 29  OVER(ORDER BY c)
3750: 20 41 53 20 78 20 0a 20 20 20 20 46 52 4f 4d 20   AS x .    FROM 
3760: 74 31 20 57 48 45 52 45 20 69 64 3e 31 0a 20 20  t1 WHERE id>1.  
3770: 20 4f 52 44 45 52 20 42 59 20 62 20 4c 49 4d 49   ORDER BY b LIMI
3780: 54 20 31 3b 0a 7d 20 7b 32 20 42 20 74 77 6f 7d  T 1;.} {2 B two}
3790: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
37a0: 20 31 32 2e 31 31 30 20 7b 0a 20 20 49 4e 53 45   12.110 {.  INSE
37b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
37c0: 53 28 36 2c 20 27 46 27 2c 20 27 74 68 72 65 65  S(6, 'F', 'three
37d0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
37e0: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 27  O t1 VALUES(7, '
37f0: 47 27 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 53 45  G', 'one');.  SE
3800: 4c 45 43 54 20 69 64 2c 20 62 2c 20 6c 65 61 64  LECT id, b, lead
3810: 28 63 2c 31 29 20 4f 56 45 52 28 4f 52 44 45 52  (c,1) OVER(ORDER
3820: 20 42 59 20 63 29 20 41 53 20 78 0a 20 20 20 20   BY c) AS x.    
3830: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 69 64  FROM t1 WHERE id
3840: 3e 31 0a 20 20 20 4f 52 44 45 52 20 42 59 20 62  >1.   ORDER BY b
3850: 20 4c 49 4d 49 54 20 32 3b 0a 7d 20 7b 32 20 42   LIMIT 2;.} {2 B
3860: 20 74 77 6f 20 33 20 43 20 74 68 72 65 65 7d 0a   two 3 C three}.
3870: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 64 6f 5f  -----------..do_
38c0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 33 2e  execsql_test 13.
38d0: 31 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  1 {.  DROP TABLE
38e0: 20 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20   IF EXISTS t1;. 
38f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
3900: 28 61 20 69 6e 74 2c 20 62 20 69 6e 74 29 3b 0a  (a int, b int);.
3910: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3920: 20 56 41 4c 55 45 53 28 31 2c 31 31 29 3b 0a 20   VALUES(1,11);. 
3930: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3940: 56 41 4c 55 45 53 28 32 2c 31 32 29 3b 0a 7d 0a  VALUES(2,12);.}.
3950: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
3960: 20 31 33 2e 32 2e 31 20 7b 0a 20 20 53 45 4c 45   13.2.1 {.  SELE
3970: 43 54 20 61 2c 20 72 61 6e 6b 28 29 20 4f 56 45  CT a, rank() OVE
3980: 52 28 4f 52 44 45 52 20 42 59 20 62 29 20 46 52  R(ORDER BY b) FR
3990: 4f 4d 20 74 31 3b 0a 20 20 53 45 4c 45 43 54 20  OM t1;.  SELECT 
39a0: 61 2c 20 72 61 6e 6b 28 29 20 4f 56 45 52 28 4f  a, rank() OVER(O
39b0: 52 44 45 52 20 42 59 20 62 20 44 45 53 43 29 20  RDER BY b DESC) 
39c0: 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 0a 20 20 31  FROM t1;.} {.  1
39d0: 20 31 20 20 20 32 20 32 20 20 20 32 20 31 20 20   1   2 2   2 1  
39e0: 20 31 20 32 0a 7d 0a 64 6f 5f 65 78 65 63 73 71   1 2.}.do_execsq
39f0: 6c 5f 74 65 73 74 20 31 33 2e 32 2e 32 20 7b 0a  l_test 13.2.2 {.
3a00: 20 20 53 45 4c 45 43 54 20 61 2c 20 72 61 6e 6b    SELECT a, rank
3a10: 28 29 20 4f 56 45 52 28 4f 52 44 45 52 20 42 59  () OVER(ORDER BY
3a20: 20 62 29 20 46 52 4f 4d 20 74 31 0a 20 20 20 20   b) FROM t1.    
3a30: 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 53 45 4c 45  UNION ALL.  SELE
3a40: 43 54 20 61 2c 20 72 61 6e 6b 28 29 20 4f 56 45  CT a, rank() OVE
3a50: 52 28 4f 52 44 45 52 20 42 59 20 62 20 44 45 53  R(ORDER BY b DES
3a60: 43 29 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 0a  C) FROM t1;.} {.
3a70: 20 20 31 20 31 20 20 20 32 20 32 20 20 20 32 20    1 1   2 2   2 
3a80: 31 20 20 20 31 20 32 0a 7d 0a 64 6f 5f 65 78 65  1   1 2.}.do_exe
3a90: 63 73 71 6c 5f 74 65 73 74 20 31 33 2e 33 20 7b  csql_test 13.3 {
3aa0: 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 72 61 6e  .  SELECT a, ran
3ab0: 6b 28 29 20 4f 56 45 52 28 4f 52 44 45 52 20 42  k() OVER(ORDER B
3ac0: 59 20 62 29 20 46 52 4f 4d 20 74 31 0a 20 20 20  Y b) FROM t1.   
3ad0: 20 55 4e 49 4f 4e 20 0a 20 20 53 45 4c 45 43 54   UNION .  SELECT
3ae0: 20 61 2c 20 72 61 6e 6b 28 29 20 4f 56 45 52 28   a, rank() OVER(
3af0: 4f 52 44 45 52 20 42 59 20 62 20 44 45 53 43 29  ORDER BY b DESC)
3b00: 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 0a 20 20   FROM t1;.} {.  
3b10: 31 20 31 20 20 20 31 20 32 20 20 20 32 20 31 20  1 1   1 2   2 1 
3b20: 20 20 32 20 32 20 20 0a 7d 0a 0a 64 6f 5f 65 78    2 2  .}..do_ex
3b30: 65 63 73 71 6c 5f 74 65 73 74 20 31 33 2e 34 20  ecsql_test 13.4 
3b40: 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 72 61  {.  SELECT a, ra
3b50: 6e 6b 28 29 20 4f 56 45 52 28 4f 52 44 45 52 20  nk() OVER(ORDER 
3b60: 42 59 20 62 29 20 46 52 4f 4d 20 74 31 0a 20 20  BY b) FROM t1.  
3b70: 20 20 45 58 43 45 50 54 20 0a 20 20 53 45 4c 45    EXCEPT .  SELE
3b80: 43 54 20 61 2c 20 72 61 6e 6b 28 29 20 4f 56 45  CT a, rank() OVE
3b90: 52 28 4f 52 44 45 52 20 42 59 20 62 20 44 45 53  R(ORDER BY b DES
3ba0: 43 29 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b 0a  C) FROM t1;.} {.
3bb0: 20 20 31 20 31 20 20 20 32 20 32 20 0a 7d 0a 0a    1 1   2 2 .}..
3bc0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
3bd0: 31 33 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20  13.5 {.  SELECT 
3be0: 61 2c 20 72 61 6e 6b 28 29 20 4f 56 45 52 28 4f  a, rank() OVER(O
3bf0: 52 44 45 52 20 42 59 20 62 29 20 46 52 4f 4d 20  RDER BY b) FROM 
3c00: 74 31 0a 20 20 20 20 49 4e 54 45 52 53 45 43 54  t1.    INTERSECT
3c10: 20 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 72 61   .  SELECT a, ra
3c20: 6e 6b 28 29 20 4f 56 45 52 28 4f 52 44 45 52 20  nk() OVER(ORDER 
3c30: 42 59 20 62 20 44 45 53 43 29 20 46 52 4f 4d 20  BY b DESC) FROM 
3c40: 74 31 3b 0a 7d 20 7b 7d 0a 0a 23 20 32 30 31 38  t1;.} {}..# 2018
3c50: 2d 31 32 2d 30 36 0a 23 20 68 74 74 70 73 3a 2f  -12-06.# https:/
3c60: 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
3c70: 73 72 63 2f 69 6e 66 6f 2f 66 30 39 66 63 64 31  src/info/f09fcd1
3c80: 37 38 31 30 66 36 35 66 37 0a 23 20 41 73 73 65  7810f65f7.# Asse
3c90: 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 68 65 6e  rtion fault when
3ca0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
3cb0: 73 20 61 72 65 20 75 73 65 64 2e 0a 23 0a 23 20  s are used..#.# 
3cc0: 52 6f 6f 74 20 63 61 75 73 65 20 69 73 20 74 68  Root cause is th
3cd0: 65 20 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65  e query flattene
3ce0: 72 20 69 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74  r invoking sqlit
3cf0: 65 33 45 78 70 72 44 75 70 28 29 20 6f 6e 0a 23  e3ExprDup() on.#
3d00: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
3d10: 74 20 63 6f 6e 74 61 69 6e 20 73 75 62 71 75 65  t contain subque
3d20: 72 69 65 73 20 77 69 74 68 20 77 69 6e 64 6f 77  ries with window
3d30: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
3d40: 0a 23 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  .# sqlite3ExprDu
3d50: 70 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  p() routine is n
3d60: 6f 74 20 6d 61 6b 69 6e 67 20 63 6f 72 72 65 63  ot making correc
3d70: 74 6c 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  tly initializing
3d80: 0a 23 20 53 65 6c 65 63 74 2e 70 57 69 6e 20 66  .# Select.pWin f
3d90: 69 65 6c 64 20 6f 66 20 74 68 65 20 73 75 62 71  ield of the subq
3da0: 75 65 72 69 65 73 2e 0a 23 0a 73 71 6c 69 74 65  ueries..#.sqlite
3db0: 33 20 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 64 6f  3 db :memory:.do
3dc0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 34  _execsql_test 14
3dd0: 2e 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20  .0 {.  SELECT * 
3de0: 46 52 4f 4d 28 0a 20 20 20 20 53 45 4c 45 43 54  FROM(.    SELECT
3df0: 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
3e00: 31 20 41 53 20 63 29 20 57 48 45 52 45 20 63 20  1 AS c) WHERE c 
3e10: 49 4e 20 28 0a 20 20 20 20 20 20 20 20 53 45 4c  IN (.        SEL
3e20: 45 43 54 20 28 72 6f 77 5f 6e 75 6d 62 65 72 28  ECT (row_number(
3e30: 29 20 4f 56 45 52 28 29 29 20 46 52 4f 4d 20 28  ) OVER()) FROM (
3e40: 56 41 4c 55 45 53 20 28 30 29 29 0a 20 20 20 20  VALUES (0)).    
3e50: 29 0a 20 20 29 3b 0a 7d 20 7b 31 7d 0a 64 6f 5f  ).  );.} {1}.do_
3e60: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 34 2e  execsql_test 14.
3e70: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  1 {.  CREATE TAB
3e80: 4c 45 20 74 31 28 78 29 3b 20 49 4e 53 45 52 54  LE t1(x); INSERT
3e90: 20 49 4e 54 4f 20 74 31 28 78 29 20 56 41 4c 55   INTO t1(x) VALU
3ea0: 45 53 28 31 32 33 34 35 29 3b 0a 20 20 43 52 45  ES(12345);.  CRE
3eb0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 63 29 3b  ATE TABLE t2(c);
3ec0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 28   INSERT INTO t2(
3ed0: 63 29 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  c) VALUES(1);.  
3ee0: 53 45 4c 45 43 54 20 79 2c 20 79 2b 31 2c 20 79  SELECT y, y+1, y
3ef0: 2b 32 20 46 52 4f 4d 20 28 0a 20 20 20 20 53 45  +2 FROM (.    SE
3f00: 4c 45 43 54 20 63 20 49 4e 20 28 0a 20 20 20 20  LECT c IN (.    
3f10: 20 20 53 45 4c 45 43 54 20 28 72 6f 77 5f 6e 75    SELECT (row_nu
3f20: 6d 62 65 72 28 29 20 4f 56 45 52 28 29 29 20 46  mber() OVER()) F
3f30: 52 4f 4d 20 74 31 0a 20 20 20 20 29 20 41 53 20  ROM t1.    ) AS 
3f40: 79 20 46 52 4f 4d 20 74 32 0a 20 20 29 3b 0a 7d  y FROM t2.  );.}
3f50: 20 7b 31 20 32 20 33 7d 0a 0a 23 20 32 30 31 38   {1 2 3}..# 2018
3f60: 2d 31 32 2d 33 31 0a 23 20 68 74 74 70 73 3a 2f  -12-31.# https:/
3f70: 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f  /www.sqlite.org/
3f80: 73 72 63 2f 69 6e 66 6f 2f 64 30 38 36 36 62 32  src/info/d0866b2
3f90: 36 66 38 33 65 39 63 35 35 0a 23 20 57 69 6e 64  6f83e9c55.# Wind
3fa0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 63  ow function in c
3fb0: 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
3fc0: 72 79 20 63 61 75 73 65 73 20 61 73 73 65 72 74  ry causes assert
3fd0: 69 6f 6e 20 66 61 75 6c 74 20 0a 23 0a 64 6f 5f  ion fault .#.do_
3fe0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 31 35  catchsql_test 15
3ff0: 2e 30 20 7b 0a 20 20 57 49 54 48 20 74 28 69 64  .0 {.  WITH t(id
4000: 2c 20 70 61 72 65 6e 74 29 20 41 53 20 28 0a 20  , parent) AS (. 
4010: 20 53 45 4c 45 43 54 20 43 41 53 54 28 31 20 41   SELECT CAST(1 A
4020: 53 20 49 4e 54 29 2c 20 43 41 53 54 28 4e 55 4c  S INT), CAST(NUL
4030: 4c 20 41 53 20 49 4e 54 29 0a 20 20 55 4e 49 4f  L AS INT).  UNIO
4040: 4e 20 41 4c 4c 0a 20 20 53 45 4c 45 43 54 20 32  N ALL.  SELECT 2
4050: 2c 20 4e 55 4c 4c 0a 20 20 55 4e 49 4f 4e 20 41  , NULL.  UNION A
4060: 4c 4c 0a 20 20 53 45 4c 45 43 54 20 33 2c 20 31  LL.  SELECT 3, 1
4070: 0a 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 53  .  UNION ALL.  S
4080: 45 4c 45 43 54 20 34 2c 20 31 0a 20 20 55 4e 49  ELECT 4, 1.  UNI
4090: 4f 4e 20 41 4c 4c 0a 20 20 53 45 4c 45 43 54 20  ON ALL.  SELECT 
40a0: 35 2c 20 32 0a 20 20 55 4e 49 4f 4e 20 41 4c 4c  5, 2.  UNION ALL
40b0: 0a 20 20 53 45 4c 45 43 54 20 36 2c 20 32 0a 20  .  SELECT 6, 2. 
40c0: 20 29 2c 20 71 20 41 53 20 28 0a 20 20 53 45 4c   ), q AS (.  SEL
40d0: 45 43 54 20 74 2e 2a 2c 20 52 4f 57 5f 4e 55 4d  ECT t.*, ROW_NUM
40e0: 42 45 52 28 29 20 4f 56 45 52 20 28 4f 52 44 45  BER() OVER (ORDE
40f0: 52 20 42 59 20 74 2e 69 64 29 20 41 53 20 72 6e  R BY t.id) AS rn
4100: 0a 20 20 20 20 46 52 4f 4d 20 74 0a 20 20 20 57  .    FROM t.   W
4110: 48 45 52 45 20 70 61 72 65 6e 74 20 49 53 20 4e  HERE parent IS N
4120: 55 4c 4c 0a 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  ULL.   UNION ALL
4130: 0a 20 20 53 45 4c 45 43 54 20 74 2e 2a 2c 20 52  .  SELECT t.*, R
4140: 4f 57 5f 4e 55 4d 42 45 52 28 29 20 4f 56 45 52  OW_NUMBER() OVER
4150: 20 28 4f 52 44 45 52 20 42 59 20 74 2e 69 64 29   (ORDER BY t.id)
4160: 20 41 53 20 72 6e 0a 20 20 20 20 46 52 4f 4d 20   AS rn.    FROM 
4170: 71 0a 20 20 20 20 4a 4f 49 4e 20 74 0a 20 20 20  q.    JOIN t.   
4180: 20 20 20 4f 4e 20 74 2e 70 61 72 65 6e 74 20 3d     ON t.parent =
4190: 20 71 2e 69 64 0a 20 20 29 0a 20 20 53 45 4c 45   q.id.  ).  SELE
41a0: 43 54 20 2a 0a 20 20 20 20 46 52 4f 4d 20 71 3b  CT *.    FROM q;
41b0: 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74 20 75 73  .} {1 {cannot us
41c0: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
41d0: 6e 73 20 69 6e 20 72 65 63 75 72 73 69 76 65 20  ns in recursive 
41e0: 71 75 65 72 69 65 73 7d 7d 0a 64 6f 5f 65 78 65  queries}}.do_exe
41f0: 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 31 20 7b  csql_test 15.1 {
4200: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46  .  DROP TABLE IF
4210: 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20 44 52   EXISTS t1;.  DR
4220: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
4230: 54 53 20 74 32 3b 0a 20 20 43 52 45 41 54 45 20  TS t2;.  CREATE 
4240: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 49  TABLE t1(x);.  I
4250: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4260: 4c 55 45 53 28 27 61 27 29 2c 20 28 27 62 27 29  LUES('a'), ('b')
4270: 2c 20 28 27 63 27 29 3b 0a 20 20 43 52 45 41 54  , ('c');.  CREAT
4280: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
4290: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
42a0: 74 32 20 56 41 4c 55 45 53 28 27 58 27 2c 20 31  t2 VALUES('X', 1
42b0: 29 2c 20 28 27 58 27 2c 20 32 29 2c 20 28 27 59  ), ('X', 2), ('Y
42c0: 27 2c 20 32 29 2c 20 28 27 59 27 2c 20 33 29 3b  ', 2), ('Y', 3);
42d0: 0a 20 20 53 45 4c 45 43 54 20 78 2c 20 28 0a 20  .  SELECT x, (. 
42e0: 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28 62 29     SELECT sum(b)
42f0: 0a 20 20 20 20 20 20 4f 56 45 52 20 28 50 41 52  .      OVER (PAR
4300: 54 49 54 49 4f 4e 20 42 59 20 61 20 52 4f 57 53  TITION BY a ROWS
4310: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
4320: 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20 20  ED PRECEDING.   
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
4360: 4f 4c 4c 4f 57 49 4e 47 29 0a 20 20 20 20 46 52  OLLOWING).    FR
4370: 4f 4d 20 74 32 20 57 48 45 52 45 20 62 3c 78 0a  OM t2 WHERE b<x.
4380: 20 20 29 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b    ) FROM t1;.} {
4390: 61 20 33 20 62 20 33 20 63 20 33 7d 0a 0a 64 6f  a 3 b 3 c 3}..do
43a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35  _execsql_test 15
43b0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 28 0a 20  .2 {.  SELECT(. 
43c0: 20 20 20 57 49 54 48 20 63 20 41 53 28 0a 20 20     WITH c AS(.  
43d0: 20 20 20 20 56 41 4c 55 45 53 28 31 29 0a 20 20      VALUES(1).  
43e0: 20 20 29 20 53 45 4c 45 43 54 20 27 27 20 46 52    ) SELECT '' FR
43f0: 4f 4d 20 63 2c 63 0a 20 20 29 20 78 20 57 48 45  OM c,c.  ) x WHE
4400: 52 45 20 78 2b 78 3b 0a 7d 20 7b 7d 0a 0a 23 2d  RE x+x;.} {}..#-
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4450: 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 64 6f 5f 65 78 65  --------..do_exe
4460: 63 73 71 6c 5f 74 65 73 74 20 31 36 2e 30 20 7b  csql_test 16.0 {
4470: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
4480: 74 37 28 61 2c 62 29 3b 20 0a 20 20 49 4e 53 45  t7(a,b); .  INSE
4490: 52 54 20 49 4e 54 4f 20 74 37 28 72 6f 77 69 64  RT INTO t7(rowid
44a0: 2c 20 61 2c 20 62 29 20 56 41 4c 55 45 53 0a 20  , a, b) VALUES. 
44b0: 20 20 20 20 20 28 31 2c 20 31 2c 20 33 29 2c 0a       (1, 1, 3),.
44c0: 20 20 20 20 20 20 28 32 2c 20 31 30 2c 20 34 29        (2, 10, 4)
44d0: 2c 0a 20 20 20 20 20 20 28 33 2c 20 31 30 30 2c  ,.      (3, 100,
44e0: 20 32 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73   2);.}..do_execs
44f0: 71 6c 5f 74 65 73 74 20 31 36 2e 31 20 7b 0a 20  ql_test 16.1 {. 
4500: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 73   SELECT rowid, s
4510: 75 6d 28 61 29 20 4f 56 45 52 20 28 50 41 52 54  um(a) OVER (PART
4520: 49 54 49 4f 4e 20 42 59 20 62 20 49 4e 20 28 53  ITION BY b IN (S
4530: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
4540: 20 74 37 29 29 20 46 52 4f 4d 20 74 37 3b 0a 7d   t7)) FROM t7;.}
4550: 20 7b 0a 20 20 32 20 31 30 0a 20 20 31 20 31 30   {.  2 10.  1 10
4560: 31 0a 20 20 33 20 31 30 31 0a 7d 0a 0a 64 6f 5f  1.  3 101.}..do_
4570: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 36 2e  execsql_test 16.
4580: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f 77  2 {.  SELECT row
4590: 69 64 2c 20 73 75 6d 28 61 29 20 4f 56 45 52 20  id, sum(a) OVER 
45a0: 77 31 20 46 52 4f 4d 20 74 37 20 0a 20 20 57 49  w1 FROM t7 .  WI
45b0: 4e 44 4f 57 20 77 31 20 41 53 20 28 50 41 52 54  NDOW w1 AS (PART
45c0: 49 54 49 4f 4e 20 42 59 20 62 20 49 4e 20 28 53  ITION BY b IN (S
45d0: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
45e0: 20 74 37 29 29 3b 0a 7d 20 7b 0a 20 20 32 20 31   t7));.} {.  2 1
45f0: 30 0a 20 20 31 20 31 30 31 0a 20 20 33 20 31 30  0.  1 101.  3 10
4600: 31 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  1.}..#----------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4650: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
4660: 31 37 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  17.0 {.  CREATE 
4670: 54 41 42 4c 45 20 74 38 28 61 29 3b 0a 20 20 49  TABLE t8(a);.  I
4680: 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41  NSERT INTO t8 VA
4690: 4c 55 45 53 28 31 29 2c 20 28 32 29 2c 20 28 33  LUES(1), (2), (3
46a0: 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  );.}..do_execsql
46b0: 5f 74 65 73 74 20 31 37 2e 31 20 7b 0a 20 20 53  _test 17.1 {.  S
46c0: 45 4c 45 43 54 20 2b 73 75 6d 28 30 29 20 4f 56  ELECT +sum(0) OV
46d0: 45 52 20 28 29 20 4f 52 44 45 52 20 42 59 20 2b  ER () ORDER BY +
46e0: 73 75 6d 28 30 29 20 4f 56 45 52 20 28 29 3b 0a  sum(0) OVER ();.
46f0: 7d 20 7b 30 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  } {0}..do_execsq
4700: 6c 5f 74 65 73 74 20 31 37 2e 32 20 7b 0a 20 20  l_test 17.2 {.  
4710: 73 65 6c 65 63 74 20 2b 73 75 6d 28 61 29 20 4f  select +sum(a) O
4720: 56 45 52 20 28 29 20 46 52 4f 4d 20 74 38 20 4f  VER () FROM t8 O
4730: 52 44 45 52 20 42 59 20 2b 73 75 6d 28 61 29 20  RDER BY +sum(a) 
4740: 4f 56 45 52 20 28 29 20 44 45 53 43 3b 0a 7d 20  OVER () DESC;.} 
4750: 7b 36 20 36 20 36 7d 0a 0a 64 6f 5f 65 78 65 63  {6 6 6}..do_exec
4760: 73 71 6c 5f 74 65 73 74 20 31 37 2e 33 20 7b 0a  sql_test 17.3 {.
4770: 20 20 53 45 4c 45 43 54 20 31 30 2b 73 75 6d 28    SELECT 10+sum(
4780: 61 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42  a) OVER (ORDER B
4790: 59 20 61 29 20 0a 20 20 46 52 4f 4d 20 74 38 20  Y a) .  FROM t8 
47a0: 0a 20 20 4f 52 44 45 52 20 42 59 20 31 30 2b 73  .  ORDER BY 10+s
47b0: 75 6d 28 61 29 20 4f 56 45 52 20 28 4f 52 44 45  um(a) OVER (ORDE
47c0: 52 20 42 59 20 61 29 20 44 45 53 43 3b 0a 7d 20  R BY a) DESC;.} 
47d0: 7b 31 36 20 31 33 20 31 31 7d 0a 0a 0a 23 2d 2d  {16 13 11}...#--
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 65  -------.# Test e
4830: 72 72 6f 72 20 63 61 73 65 73 20 66 72 6f 6d 20  rror cases from 
4840: 63 68 61 69 6e 69 6e 67 20 77 69 6e 64 6f 77 20  chaining window 
4850: 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 23 0a 72  definitions..#.r
4860: 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73  eset_db.do_execs
4870: 71 6c 5f 74 65 73 74 20 31 38 2e 30 20 7b 0a 20  ql_test 18.0 {. 
4880: 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45   DROP TABLE IF E
4890: 58 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45 41  XISTS t1;.  CREA
48a0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
48b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
48c0: 59 2c 20 62 20 54 45 58 54 2c 20 63 20 54 45 58  Y, b TEXT, c TEX
48d0: 54 2c 20 64 20 49 4e 54 45 47 45 52 29 3b 0a 20  T, d INTEGER);. 
48e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
48f0: 56 41 4c 55 45 53 28 31 2c 20 27 6f 64 64 27 2c  VALUES(1, 'odd',
4900: 20 20 27 6f 6e 65 27 2c 20 20 20 31 29 3b 0a 20    'one',   1);. 
4910: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4920: 56 41 4c 55 45 53 28 32 2c 20 27 65 76 65 6e 27  VALUES(2, 'even'
4930: 2c 20 27 74 77 6f 27 2c 20 20 20 32 29 3b 0a 20  , 'two',   2);. 
4940: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4950: 56 41 4c 55 45 53 28 33 2c 20 27 6f 64 64 27 2c  VALUES(3, 'odd',
4960: 20 20 27 74 68 72 65 65 27 2c 20 33 29 3b 0a 20    'three', 3);. 
4970: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4980: 56 41 4c 55 45 53 28 34 2c 20 27 65 76 65 6e 27  VALUES(4, 'even'
4990: 2c 20 27 66 6f 75 72 27 2c 20 20 34 29 3b 0a 20  , 'four',  4);. 
49a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
49b0: 56 41 4c 55 45 53 28 35 2c 20 27 6f 64 64 27 2c  VALUES(5, 'odd',
49c0: 20 20 27 66 69 76 65 27 2c 20 20 35 29 3b 0a 20    'five',  5);. 
49d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
49e0: 56 41 4c 55 45 53 28 36 2c 20 27 65 76 65 6e 27  VALUES(6, 'even'
49f0: 2c 20 27 73 69 78 27 2c 20 20 20 36 29 3b 0a 7d  , 'six',   6);.}
4a00: 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 71  ..foreach {tn sq
4a10: 6c 20 65 72 72 6f 72 7d 20 7b 0a 20 20 31 20 7b  l error} {.  1 {
4a20: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 2c 20 73  .    SELECT c, s
4a30: 75 6d 28 64 29 20 4f 56 45 52 20 77 69 6e 32 20  um(d) OVER win2 
4a40: 46 52 4f 4d 20 74 31 0a 20 20 20 20 20 20 57 49  FROM t1.      WI
4a50: 4e 44 4f 57 20 77 69 6e 31 20 41 53 20 28 52 4f  NDOW win1 AS (RO
4a60: 57 53 20 42 45 54 57 45 45 4e 20 31 20 50 52 45  WS BETWEEN 1 PRE
4a70: 43 45 44 49 4e 47 20 41 4e 44 20 31 20 46 4f 4c  CEDING AND 1 FOL
4a80: 4c 4f 57 49 4e 47 29 2c 20 0a 20 20 20 20 20 20  LOWING), .      
4a90: 20 20 20 20 20 20 20 77 69 6e 32 20 41 53 20 28         win2 AS (
4aa0: 77 69 6e 31 20 4f 52 44 45 52 20 42 59 20 62 29  win1 ORDER BY b)
4ab0: 0a 20 20 7d 20 7b 63 61 6e 6e 6f 74 20 6f 76 65  .  } {cannot ove
4ac0: 72 72 69 64 65 20 66 72 61 6d 65 20 73 70 65 63  rride frame spec
4ad0: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 77 69 6e  ification of win
4ae0: 64 6f 77 3a 20 77 69 6e 31 7d 0a 0a 20 20 32 20  dow: win1}..  2 
4af0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 2c 20  {.    SELECT c, 
4b00: 73 75 6d 28 64 29 20 4f 56 45 52 20 77 69 6e 32  sum(d) OVER win2
4b10: 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20 20 57   FROM t1.      W
4b20: 49 4e 44 4f 57 20 77 69 6e 31 20 41 53 20 28 29  INDOW win1 AS ()
4b30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 77  ,.             w
4b40: 69 6e 32 20 41 53 20 28 77 69 6e 34 20 4f 52 44  in2 AS (win4 ORD
4b50: 45 52 20 42 59 20 62 29 0a 20 20 7d 20 7b 6e 6f  ER BY b).  } {no
4b60: 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20 77 69   such window: wi
4b70: 6e 34 7d 0a 0a 20 20 33 20 7b 0a 20 20 20 20 53  n4}..  3 {.    S
4b80: 45 4c 45 43 54 20 63 2c 20 73 75 6d 28 64 29 20  ELECT c, sum(d) 
4b90: 4f 56 45 52 20 77 69 6e 32 20 46 52 4f 4d 20 74  OVER win2 FROM t
4ba0: 31 0a 20 20 20 20 20 20 57 49 4e 44 4f 57 20 77  1.      WINDOW w
4bb0: 69 6e 31 20 41 53 20 28 29 2c 0a 20 20 20 20 20  in1 AS (),.     
4bc0: 20 20 20 20 20 20 20 20 77 69 6e 32 20 41 53 20          win2 AS 
4bd0: 28 77 69 6e 31 20 50 41 52 54 49 54 49 4f 4e 20  (win1 PARTITION 
4be0: 42 59 20 64 29 0a 20 20 7d 20 7b 63 61 6e 6e 6f  BY d).  } {canno
4bf0: 74 20 6f 76 65 72 72 69 64 65 20 50 41 52 54 49  t override PARTI
4c00: 54 49 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 77  TION clause of w
4c10: 69 6e 64 6f 77 3a 20 77 69 6e 31 7d 0a 0a 20 20  indow: win1}..  
4c20: 34 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  4 {.    SELECT c
4c30: 2c 20 73 75 6d 28 64 29 20 4f 56 45 52 20 77 69  , sum(d) OVER wi
4c40: 6e 32 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20  n2 FROM t1.     
4c50: 20 57 49 4e 44 4f 57 20 77 69 6e 31 20 41 53 20   WINDOW win1 AS 
4c60: 28 4f 52 44 45 52 20 42 59 20 62 29 2c 0a 20 20  (ORDER BY b),.  
4c70: 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 32 20             win2 
4c80: 41 53 20 28 77 69 6e 31 20 4f 52 44 45 52 20 42  AS (win1 ORDER B
4c90: 59 20 64 29 0a 20 20 7d 20 7b 63 61 6e 6e 6f 74  Y d).  } {cannot
4ca0: 20 6f 76 65 72 72 69 64 65 20 4f 52 44 45 52 20   override ORDER 
4cb0: 42 59 20 63 6c 61 75 73 65 20 6f 66 20 77 69 6e  BY clause of win
4cc0: 64 6f 77 3a 20 77 69 6e 31 7d 0a 7d 20 7b 0a 20  dow: win1}.} {. 
4cd0: 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73   do_catchsql_tes
4ce0: 74 20 31 38 2e 31 2e 24 74 6e 20 24 73 71 6c 20  t 18.1.$tn $sql 
4cf0: 5b 6c 69 73 74 20 31 20 24 65 72 72 6f 72 5d 0a  [list 1 $error].
4d00: 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73  }..foreach {tn s
4d10: 71 6c 20 65 72 72 6f 72 7d 20 7b 0a 20 20 31 20  ql error} {.  1 
4d20: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 2c 20  {.    SELECT c, 
4d30: 73 75 6d 28 64 29 20 4f 56 45 52 20 28 77 69 6e  sum(d) OVER (win
4d40: 31 20 4f 52 44 45 52 20 42 59 20 62 29 20 46 52  1 ORDER BY b) FR
4d50: 4f 4d 20 74 31 0a 20 20 20 20 20 20 57 49 4e 44  OM t1.      WIND
4d60: 4f 57 20 77 69 6e 31 20 41 53 20 28 52 4f 57 53  OW win1 AS (ROWS
4d70: 20 42 45 54 57 45 45 4e 20 31 20 50 52 45 43 45   BETWEEN 1 PRECE
4d80: 44 49 4e 47 20 41 4e 44 20 31 20 46 4f 4c 4c 4f  DING AND 1 FOLLO
4d90: 57 49 4e 47 29 0a 20 20 7d 20 7b 63 61 6e 6e 6f  WING).  } {canno
4da0: 74 20 6f 76 65 72 72 69 64 65 20 66 72 61 6d 65  t override frame
4db0: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 6f   specification o
4dc0: 66 20 77 69 6e 64 6f 77 3a 20 77 69 6e 31 7d 0a  f window: win1}.
4dd0: 0a 20 20 32 20 7b 0a 20 20 20 20 53 45 4c 45 43  .  2 {.    SELEC
4de0: 54 20 63 2c 20 73 75 6d 28 64 29 20 4f 56 45 52  T c, sum(d) OVER
4df0: 20 28 77 69 6e 34 20 4f 52 44 45 52 20 42 59 20   (win4 ORDER BY 
4e00: 62 29 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20  b) FROM t1.     
4e10: 20 57 49 4e 44 4f 57 20 77 69 6e 31 20 41 53 20   WINDOW win1 AS 
4e20: 28 29 0a 20 20 7d 20 7b 6e 6f 20 73 75 63 68 20  ().  } {no such 
4e30: 77 69 6e 64 6f 77 3a 20 77 69 6e 34 7d 0a 0a 20  window: win4}.. 
4e40: 20 33 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20   3 {.    SELECT 
4e50: 63 2c 20 73 75 6d 28 64 29 20 4f 56 45 52 20 28  c, sum(d) OVER (
4e60: 77 69 6e 31 20 50 41 52 54 49 54 49 4f 4e 20 42  win1 PARTITION B
4e70: 59 20 64 29 20 46 52 4f 4d 20 74 31 0a 20 20 20  Y d) FROM t1.   
4e80: 20 20 20 57 49 4e 44 4f 57 20 77 69 6e 31 20 41     WINDOW win1 A
4e90: 53 20 28 29 0a 20 20 7d 20 7b 63 61 6e 6e 6f 74  S ().  } {cannot
4ea0: 20 6f 76 65 72 72 69 64 65 20 50 41 52 54 49 54   override PARTIT
4eb0: 49 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 77 69  ION clause of wi
4ec0: 6e 64 6f 77 3a 20 77 69 6e 31 7d 0a 0a 20 20 34  ndow: win1}..  4
4ed0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 2c   {.    SELECT c,
4ee0: 20 73 75 6d 28 64 29 20 4f 56 45 52 20 28 77 69   sum(d) OVER (wi
4ef0: 6e 31 20 4f 52 44 45 52 20 42 59 20 64 29 20 46  n1 ORDER BY d) F
4f00: 52 4f 4d 20 74 31 0a 20 20 20 20 20 20 57 49 4e  ROM t1.      WIN
4f10: 44 4f 57 20 77 69 6e 31 20 41 53 20 28 4f 52 44  DOW win1 AS (ORD
4f20: 45 52 20 42 59 20 62 29 0a 20 20 7d 20 7b 63 61  ER BY b).  } {ca
4f30: 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20 4f 52  nnot override OR
4f40: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
4f50: 20 77 69 6e 64 6f 77 3a 20 77 69 6e 31 7d 0a 7d   window: win1}.}
4f60: 20 7b 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c   {.  do_catchsql
4f70: 5f 74 65 73 74 20 31 38 2e 32 2e 24 74 6e 20 24  _test 18.2.$tn $
4f80: 73 71 6c 20 5b 6c 69 73 74 20 31 20 24 65 72 72  sql [list 1 $err
4f90: 6f 72 5d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  or].}..do_execsq
4fa0: 6c 5f 74 65 73 74 20 31 38 2e 33 2e 31 20 7b 0a  l_test 18.3.1 {.
4fb0: 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63    SELECT group_c
4fc0: 6f 6e 63 61 74 28 63 2c 20 27 2e 27 29 20 4f 56  oncat(c, '.') OV
4fd0: 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59  ER (PARTITION BY
4fe0: 20 62 20 4f 52 44 45 52 20 42 59 20 63 29 0a 20   b ORDER BY c). 
4ff0: 20 46 52 4f 4d 20 74 31 0a 7d 20 7b 66 6f 75 72   FROM t1.} {four
5000: 20 66 6f 75 72 2e 73 69 78 20 66 6f 75 72 2e 73   four.six four.s
5010: 69 78 2e 74 77 6f 20 66 69 76 65 20 66 69 76 65  ix.two five five
5020: 2e 6f 6e 65 20 66 69 76 65 2e 6f 6e 65 2e 74 68  .one five.one.th
5030: 72 65 65 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  ree}..do_execsql
5040: 5f 74 65 73 74 20 31 38 2e 33 2e 32 20 7b 0a 20  _test 18.3.2 {. 
5050: 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f   SELECT group_co
5060: 6e 63 61 74 28 63 2c 20 27 2e 27 29 20 4f 56 45  ncat(c, '.') OVE
5070: 52 20 28 77 69 6e 31 20 4f 52 44 45 52 20 42 59  R (win1 ORDER BY
5080: 20 63 29 0a 20 20 46 52 4f 4d 20 74 31 0a 20 20   c).  FROM t1.  
5090: 57 49 4e 44 4f 57 20 77 69 6e 31 20 41 53 20 28  WINDOW win1 AS (
50a0: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 62 29 0a  PARTITION BY b).
50b0: 7d 20 7b 66 6f 75 72 20 66 6f 75 72 2e 73 69 78  } {four four.six
50c0: 20 66 6f 75 72 2e 73 69 78 2e 74 77 6f 20 66 69   four.six.two fi
50d0: 76 65 20 66 69 76 65 2e 6f 6e 65 20 66 69 76 65  ve five.one five
50e0: 2e 6f 6e 65 2e 74 68 72 65 65 7d 0a 0a 64 6f 5f  .one.three}..do_
50f0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 38 2e  execsql_test 18.
5100: 33 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 67  3.3 {.  SELECT g
5110: 72 6f 75 70 5f 63 6f 6e 63 61 74 28 63 2c 20 27  roup_concat(c, '
5120: 2e 27 29 20 4f 56 45 52 20 77 69 6e 32 0a 20 20  .') OVER win2.  
5130: 46 52 4f 4d 20 74 31 0a 20 20 57 49 4e 44 4f 57  FROM t1.  WINDOW
5140: 20 77 69 6e 31 20 41 53 20 28 50 41 52 54 49 54   win1 AS (PARTIT
5150: 49 4f 4e 20 42 59 20 62 29 2c 0a 20 20 20 20 20  ION BY b),.     
5160: 20 20 20 20 77 69 6e 32 20 41 53 20 28 77 69 6e      win2 AS (win
5170: 31 20 4f 52 44 45 52 20 42 59 20 63 29 0a 7d 20  1 ORDER BY c).} 
5180: 7b 66 6f 75 72 20 66 6f 75 72 2e 73 69 78 20 66  {four four.six f
5190: 6f 75 72 2e 73 69 78 2e 74 77 6f 20 66 69 76 65  our.six.two five
51a0: 20 66 69 76 65 2e 6f 6e 65 20 66 69 76 65 2e 6f   five.one five.o
51b0: 6e 65 2e 74 68 72 65 65 7d 0a 0a 64 6f 5f 65 78  ne.three}..do_ex
51c0: 65 63 73 71 6c 5f 74 65 73 74 20 31 38 2e 33 2e  ecsql_test 18.3.
51d0: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 67 72 6f  4 {.  SELECT gro
51e0: 75 70 5f 63 6f 6e 63 61 74 28 63 2c 20 27 2e 27  up_concat(c, '.'
51f0: 29 20 4f 56 45 52 20 28 77 69 6e 32 29 0a 20 20  ) OVER (win2).  
5200: 46 52 4f 4d 20 74 31 0a 20 20 57 49 4e 44 4f 57  FROM t1.  WINDOW
5210: 20 77 69 6e 31 20 41 53 20 28 50 41 52 54 49 54   win1 AS (PARTIT
5220: 49 4f 4e 20 42 59 20 62 29 2c 0a 20 20 20 20 20  ION BY b),.     
5230: 20 20 20 20 77 69 6e 32 20 41 53 20 28 77 69 6e      win2 AS (win
5240: 31 20 4f 52 44 45 52 20 42 59 20 63 29 0a 7d 20  1 ORDER BY c).} 
5250: 7b 66 6f 75 72 20 66 6f 75 72 2e 73 69 78 20 66  {four four.six f
5260: 6f 75 72 2e 73 69 78 2e 74 77 6f 20 66 69 76 65  our.six.two five
5270: 20 66 69 76 65 2e 6f 6e 65 20 66 69 76 65 2e 6f   five.one five.o
5280: 6e 65 2e 74 68 72 65 65 7d 0a 0a 64 6f 5f 65 78  ne.three}..do_ex
5290: 65 63 73 71 6c 5f 74 65 73 74 20 31 38 2e 33 2e  ecsql_test 18.3.
52a0: 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 67 72 6f  5 {.  SELECT gro
52b0: 75 70 5f 63 6f 6e 63 61 74 28 63 2c 20 27 2e 27  up_concat(c, '.'
52c0: 29 20 4f 56 45 52 20 77 69 6e 35 0a 20 20 46 52  ) OVER win5.  FR
52d0: 4f 4d 20 74 31 0a 20 20 57 49 4e 44 4f 57 20 77  OM t1.  WINDOW w
52e0: 69 6e 31 20 41 53 20 28 50 41 52 54 49 54 49 4f  in1 AS (PARTITIO
52f0: 4e 20 42 59 20 62 29 2c 0a 20 20 20 20 20 20 20  N BY b),.       
5300: 20 20 77 69 6e 32 20 41 53 20 28 77 69 6e 31 29    win2 AS (win1)
5310: 2c 0a 20 20 20 20 20 20 20 20 20 77 69 6e 33 20  ,.         win3 
5320: 41 53 20 28 77 69 6e 32 29 2c 0a 20 20 20 20 20  AS (win2),.     
5330: 20 20 20 20 77 69 6e 34 20 41 53 20 28 77 69 6e      win4 AS (win
5340: 33 29 2c 0a 20 20 20 20 20 20 20 20 20 77 69 6e  3),.         win
5350: 35 20 41 53 20 28 77 69 6e 34 20 4f 52 44 45 52  5 AS (win4 ORDER
5360: 20 42 59 20 63 29 0a 7d 20 7b 66 6f 75 72 20 66   BY c).} {four f
5370: 6f 75 72 2e 73 69 78 20 66 6f 75 72 2e 73 69 78  our.six four.six
5380: 2e 74 77 6f 20 66 69 76 65 20 66 69 76 65 2e 6f  .two five five.o
5390: 6e 65 20 66 69 76 65 2e 6f 6e 65 2e 74 68 72 65  ne five.one.thre
53a0: 65 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e}..#-----------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
53f0: 20 54 65 73 74 20 52 41 4e 47 45 20 3c 65 78 70   Test RANGE <exp
5400: 72 3e 20 50 52 45 43 45 44 49 4e 47 2f 46 4f 4c  r> PRECEDING/FOL
5410: 4c 4f 57 49 4e 47 20 77 68 65 6e 20 74 68 65 72  LOWING when ther
5420: 65 20 61 72 65 20 73 74 72 69 6e 67 2c 20 62 6c  e are string, bl
5430: 6f 62 0a 23 20 61 6e 64 20 4e 55 4c 4c 20 76 61  ob.# and NULL va
5440: 6c 75 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  lues in the data
5450: 73 65 74 2e 0a 23 0a 72 65 73 65 74 5f 64 62 0a  set..#.reset_db.
5460: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5470: 31 39 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20  19.0 {.  CREATE 
5480: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
5490: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
54a0: 20 56 41 4c 55 45 53 0a 20 20 20 20 28 31 2c 20   VALUES.    (1, 
54b0: 31 29 2c 20 28 32 2c 20 32 29 2c 20 28 33 2c 20  1), (2, 2), (3, 
54c0: 33 29 2c 20 28 34 2c 20 34 29 2c 20 28 35 2c 20  3), (4, 4), (5, 
54d0: 35 29 2c 0a 20 20 20 20 28 27 61 27 2c 20 36 29  5),.    ('a', 6)
54e0: 2c 20 28 27 62 27 2c 20 37 29 2c 20 28 27 63 27  , ('b', 7), ('c'
54f0: 2c 20 38 29 2c 20 28 27 64 27 2c 20 39 29 2c 20  , 8), ('d', 9), 
5500: 28 27 65 27 2c 20 31 30 29 3b 0a 7d 0a 64 6f 5f  ('e', 10);.}.do_
5510: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39 2e  execsql_test 19.
5520: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20  1 {.  SELECT a, 
5530: 73 75 6d 28 62 29 20 4f 56 45 52 20 28 4f 52 44  sum(b) OVER (ORD
5540: 45 52 20 42 59 20 61 29 20 46 52 4f 4d 20 74 31  ER BY a) FROM t1
5550: 3b 0a 7d 20 7b 31 20 31 20 20 32 20 33 20 20 33  ;.} {1 1  2 3  3
5560: 20 36 20 20 34 20 31 30 20 20 35 20 31 35 20 20   6  4 10  5 15  
5570: 61 20 32 31 20 62 20 32 38 20 63 20 33 36 20 64  a 21 b 28 c 36 d
5580: 20 34 35 20 65 20 35 35 7d 0a 0a 64 6f 5f 65 78   45 e 55}..do_ex
5590: 65 63 73 71 6c 5f 74 65 73 74 20 31 39 2e 32 2e  ecsql_test 19.2.
55a0: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20  1 {.  SELECT a, 
55b0: 73 75 6d 28 62 29 20 4f 56 45 52 20 28 0a 20 20  sum(b) OVER (.  
55c0: 20 20 4f 52 44 45 52 20 42 59 20 61 20 52 41 4e    ORDER BY a RAN
55d0: 47 45 20 42 45 54 57 45 45 4e 20 31 20 50 52 45  GE BETWEEN 1 PRE
55e0: 43 45 44 49 4e 47 20 41 4e 44 20 31 20 46 4f 4c  CEDING AND 1 FOL
55f0: 4c 4f 57 49 4e 47 0a 20 20 29 20 46 52 4f 4d 20  LOWING.  ) FROM 
5600: 74 31 3b 0a 7d 20 7b 31 20 33 20 32 20 36 20 33  t1;.} {1 3 2 6 3
5610: 20 39 20 34 20 31 32 20 35 20 39 20 61 20 36 20   9 4 12 5 9 a 6 
5620: 62 20 37 20 63 20 38 20 64 20 39 20 65 20 31 30  b 7 c 8 d 9 e 10
5630: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5640: 74 20 31 39 2e 32 2e 32 20 7b 0a 20 20 53 45 4c  t 19.2.2 {.  SEL
5650: 45 43 54 20 61 2c 20 73 75 6d 28 62 29 20 4f 56  ECT a, sum(b) OV
5660: 45 52 20 28 0a 20 20 20 20 4f 52 44 45 52 20 42  ER (.    ORDER B
5670: 59 20 61 20 44 45 53 43 20 52 41 4e 47 45 20 42  Y a DESC RANGE B
5680: 45 54 57 45 45 4e 20 31 20 50 52 45 43 45 44 49  ETWEEN 1 PRECEDI
5690: 4e 47 20 41 4e 44 20 31 20 46 4f 4c 4c 4f 57 49  NG AND 1 FOLLOWI
56a0: 4e 47 0a 20 20 29 20 46 52 4f 4d 20 74 31 20 4f  NG.  ) FROM t1 O
56b0: 52 44 45 52 20 42 59 20 61 20 41 53 43 3b 0a 7d  RDER BY a ASC;.}
56c0: 20 7b 31 20 33 20 32 20 36 20 33 20 39 20 34 20   {1 3 2 6 3 9 4 
56d0: 31 32 20 35 20 39 20 61 20 36 20 62 20 37 20 63  12 5 9 a 6 b 7 c
56e0: 20 38 20 64 20 39 20 65 20 31 30 7d 0a 0a 64 6f   8 d 9 e 10}..do
56f0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 39  _execsql_test 19
5700: 2e 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20  .3.1 {.  SELECT 
5710: 61 2c 20 73 75 6d 28 62 29 20 4f 56 45 52 20 28  a, sum(b) OVER (
5720: 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 61 20  .    ORDER BY a 
5730: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 32 20  RANGE BETWEEN 2 
5740: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 31 20  PRECEDING AND 1 
5750: 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 29 20 46 52  FOLLOWING.  ) FR
5760: 4f 4d 20 74 31 3b 0a 7d 20 7b 31 20 33 20 32 20  OM t1;.} {1 3 2 
5770: 36 20 33 20 31 30 20 34 20 31 34 20 35 20 31 32  6 3 10 4 14 5 12
5780: 20 61 20 36 20 62 20 37 20 63 20 38 20 64 20 39   a 6 b 7 c 8 d 9
5790: 20 65 20 31 30 7d 0a 64 6f 5f 65 78 65 63 73 71   e 10}.do_execsq
57a0: 6c 5f 74 65 73 74 20 31 39 2e 33 2e 32 20 7b 0a  l_test 19.3.2 {.
57b0: 20 20 53 45 4c 45 43 54 20 61 2c 20 73 75 6d 28    SELECT a, sum(
57c0: 62 29 20 4f 56 45 52 20 28 0a 20 20 20 20 4f 52  b) OVER (.    OR
57d0: 44 45 52 20 42 59 20 61 20 44 45 53 43 20 52 41  DER BY a DESC RA
57e0: 4e 47 45 20 42 45 54 57 45 45 4e 20 31 20 50 52  NGE BETWEEN 1 PR
57f0: 45 43 45 44 49 4e 47 20 41 4e 44 20 32 20 46 4f  ECEDING AND 2 FO
5800: 4c 4c 4f 57 49 4e 47 0a 20 20 29 20 46 52 4f 4d  LLOWING.  ) FROM
5810: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20 41   t1 ORDER BY a A
5820: 53 43 3b 0a 7d 20 7b 31 20 33 20 32 20 36 20 33  SC;.} {1 3 2 6 3
5830: 20 31 30 20 34 20 31 34 20 35 20 31 32 20 61 20   10 4 14 5 12 a 
5840: 36 20 62 20 37 20 63 20 38 20 64 20 39 20 65 20  6 b 7 c 8 d 9 e 
5850: 31 30 7d 0a 0a 0a 72 65 73 65 74 5f 64 62 0a 64  10}...reset_db.d
5860: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
5870: 30 2e 30 20 7b 0a 20 20 43 52 45 41 54 45 20 54  0.0 {.  CREATE T
5880: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
5890: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
58a0: 56 41 4c 55 45 53 0a 20 20 20 20 28 4e 55 4c 4c  VALUES.    (NULL
58b0: 2c 20 31 30 30 29 2c 20 28 4e 55 4c 4c 2c 20 31  , 100), (NULL, 1
58c0: 30 30 29 2c 20 0a 20 20 20 20 28 31 2c 20 31 29  00), .    (1, 1)
58d0: 2c 20 28 32 2c 20 32 29 2c 20 28 33 2c 20 33 29  , (2, 2), (3, 3)
58e0: 2c 20 28 34 2c 20 34 29 2c 20 28 35 2c 20 35 29  , (4, 4), (5, 5)
58f0: 2c 0a 20 20 20 20 28 27 61 27 2c 20 36 29 2c 20  ,.    ('a', 6), 
5900: 28 27 62 27 2c 20 37 29 2c 20 28 27 63 27 2c 20  ('b', 7), ('c', 
5910: 38 29 2c 20 28 27 64 27 2c 20 39 29 2c 20 28 27  8), ('d', 9), ('
5920: 65 27 2c 20 31 30 29 3b 0a 7d 0a 64 6f 5f 65 78  e', 10);.}.do_ex
5930: 65 63 73 71 6c 5f 74 65 73 74 20 32 30 2e 31 20  ecsql_test 20.1 
5940: 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 73 75  {.  SELECT a, su
5950: 6d 28 62 29 20 4f 56 45 52 20 28 4f 52 44 45 52  m(b) OVER (ORDER
5960: 20 42 59 20 61 29 20 46 52 4f 4d 20 74 31 3b 0a   BY a) FROM t1;.
5970: 7d 20 7b 0a 20 20 7b 7d 20 32 30 30 20 7b 7d 20  } {.  {} 200 {} 
5980: 32 30 30 20 31 20 32 30 31 20 20 32 20 32 30 33  200 1 201  2 203
5990: 20 20 33 20 32 30 36 20 20 34 20 32 31 30 20 20    3 206  4 210  
59a0: 35 20 32 31 35 20 20 0a 20 20 61 20 32 32 31 20  5 215  .  a 221 
59b0: 62 20 32 32 38 20 63 20 32 33 36 20 64 20 32 34  b 228 c 236 d 24
59c0: 35 20 65 20 32 35 35 0a 7d 0a 0a 64 6f 5f 65 78  5 e 255.}..do_ex
59d0: 65 63 73 71 6c 5f 74 65 73 74 20 32 30 2e 32 2e  ecsql_test 20.2.
59e0: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20  1 {.  SELECT a, 
59f0: 73 75 6d 28 62 29 20 4f 56 45 52 20 28 0a 20 20  sum(b) OVER (.  
5a00: 20 20 4f 52 44 45 52 20 42 59 20 61 20 52 41 4e    ORDER BY a RAN
5a10: 47 45 20 42 45 54 57 45 45 4e 20 31 20 50 52 45  GE BETWEEN 1 PRE
5a20: 43 45 44 49 4e 47 20 41 4e 44 20 31 20 46 4f 4c  CEDING AND 1 FOL
5a30: 4c 4f 57 49 4e 47 0a 20 20 29 20 46 52 4f 4d 20  LOWING.  ) FROM 
5a40: 74 31 3b 0a 7d 20 7b 7b 7d 20 32 30 30 20 7b 7d  t1;.} {{} 200 {}
5a50: 20 32 30 30 20 31 20 33 20 32 20 36 20 33 20 39   200 1 3 2 6 3 9
5a60: 20 34 20 31 32 20 35 20 39 20 61 20 36 20 62 20   4 12 5 9 a 6 b 
5a70: 37 20 63 20 38 20 64 20 39 20 65 20 31 30 7d 0a  7 c 8 d 9 e 10}.
5a80: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5a90: 32 30 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43  20.2.2 {.  SELEC
5aa0: 54 20 61 2c 20 73 75 6d 28 62 29 20 4f 56 45 52  T a, sum(b) OVER
5ab0: 20 28 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20   (.    ORDER BY 
5ac0: 61 20 44 45 53 43 20 52 41 4e 47 45 20 42 45 54  a DESC RANGE BET
5ad0: 57 45 45 4e 20 31 20 50 52 45 43 45 44 49 4e 47  WEEN 1 PRECEDING
5ae0: 20 41 4e 44 20 31 20 46 4f 4c 4c 4f 57 49 4e 47   AND 1 FOLLOWING
5af0: 0a 20 20 29 20 46 52 4f 4d 20 74 31 20 4f 52 44  .  ) FROM t1 ORD
5b00: 45 52 20 42 59 20 61 20 41 53 43 3b 0a 7d 20 7b  ER BY a ASC;.} {
5b10: 7b 7d 20 32 30 30 20 7b 7d 20 32 30 30 20 31 20  {} 200 {} 200 1 
5b20: 33 20 32 20 36 20 33 20 39 20 34 20 31 32 20 35  3 2 6 3 9 4 12 5
5b30: 20 39 20 61 20 36 20 62 20 37 20 63 20 38 20 64   9 a 6 b 7 c 8 d
5b40: 20 39 20 65 20 31 30 7d 0a 0a 64 6f 5f 65 78 65   9 e 10}..do_exe
5b50: 63 73 71 6c 5f 74 65 73 74 20 32 30 2e 33 2e 31  csql_test 20.3.1
5b60: 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 73   {.  SELECT a, s
5b70: 75 6d 28 62 29 20 4f 56 45 52 20 28 0a 20 20 20  um(b) OVER (.   
5b80: 20 4f 52 44 45 52 20 42 59 20 61 20 52 41 4e 47   ORDER BY a RANG
5b90: 45 20 42 45 54 57 45 45 4e 20 32 20 50 52 45 43  E BETWEEN 2 PREC
5ba0: 45 44 49 4e 47 20 41 4e 44 20 31 20 46 4f 4c 4c  EDING AND 1 FOLL
5bb0: 4f 57 49 4e 47 0a 20 20 29 20 46 52 4f 4d 20 74  OWING.  ) FROM t
5bc0: 31 3b 0a 7d 20 7b 7b 7d 20 32 30 30 20 7b 7d 20  1;.} {{} 200 {} 
5bd0: 32 30 30 20 31 20 33 20 32 20 36 20 33 20 31 30  200 1 3 2 6 3 10
5be0: 20 34 20 31 34 20 35 20 31 32 20 61 20 36 20 62   4 14 5 12 a 6 b
5bf0: 20 37 20 63 20 38 20 64 20 39 20 65 20 31 30 7d   7 c 8 d 9 e 10}
5c00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5c10: 20 32 30 2e 33 2e 32 20 7b 0a 20 20 53 45 4c 45   20.3.2 {.  SELE
5c20: 43 54 20 61 2c 20 73 75 6d 28 62 29 20 4f 56 45  CT a, sum(b) OVE
5c30: 52 20 28 0a 20 20 20 20 4f 52 44 45 52 20 42 59  R (.    ORDER BY
5c40: 20 61 20 44 45 53 43 20 52 41 4e 47 45 20 42 45   a DESC RANGE BE
5c50: 54 57 45 45 4e 20 31 20 50 52 45 43 45 44 49 4e  TWEEN 1 PRECEDIN
5c60: 47 20 41 4e 44 20 32 20 46 4f 4c 4c 4f 57 49 4e  G AND 2 FOLLOWIN
5c70: 47 0a 20 20 29 20 46 52 4f 4d 20 74 31 20 4f 52  G.  ) FROM t1 OR
5c80: 44 45 52 20 42 59 20 61 20 41 53 43 3b 0a 7d 20  DER BY a ASC;.} 
5c90: 7b 7b 7d 20 32 30 30 20 7b 7d 20 32 30 30 20 31  {{} 200 {} 200 1
5ca0: 20 33 20 32 20 36 20 33 20 31 30 20 34 20 31 34   3 2 6 3 10 4 14
5cb0: 20 35 20 31 32 20 61 20 36 20 62 20 37 20 63 20   5 12 a 6 b 7 c 
5cc0: 38 20 64 20 39 20 65 20 31 30 7d 0a 0a 23 2d 2d  8 d 9 e 10}..#--
5cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d10: 2d 2d 2d 2d 2d 2d 2d 0a 64 6f 5f 65 78 65 63 73  -------.do_execs
5d20: 71 6c 5f 74 65 73 74 20 32 31 2e 30 20 7b 0a 20  ql_test 21.0 {. 
5d30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6b 65   CREATE TABLE ke
5d40: 79 77 6f 72 64 5f 74 61 62 28 0a 20 20 20 20 63  yword_tab(.    c
5d50: 75 72 72 65 6e 74 2c 20 65 78 63 6c 75 64 65 2c  urrent, exclude,
5d60: 20 66 69 6c 74 65 72 2c 20 66 6f 6c 6c 6f 77 69   filter, followi
5d70: 6e 67 2c 20 67 72 6f 75 70 73 2c 20 6e 6f 2c 20  ng, groups, no, 
5d80: 6f 74 68 65 72 73 2c 20 6f 76 65 72 2c 0a 20 20  others, over,.  
5d90: 20 20 70 61 72 74 69 74 69 6f 6e 2c 20 70 72 65    partition, pre
5da0: 63 65 64 69 6e 67 2c 20 72 61 6e 67 65 2c 20 74  ceding, range, t
5db0: 69 65 73 2c 20 75 6e 62 6f 75 6e 64 65 64 2c 20  ies, unbounded, 
5dc0: 77 69 6e 64 6f 77 0a 20 20 29 3b 0a 7d 0a 64 6f  window.  );.}.do
5dd0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 31  _execsql_test 21
5de0: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 0a 20 20  .1 {.  SELECT.  
5df0: 20 20 63 75 72 72 65 6e 74 2c 20 65 78 63 6c 75    current, exclu
5e00: 64 65 2c 20 66 69 6c 74 65 72 2c 20 66 6f 6c 6c  de, filter, foll
5e10: 6f 77 69 6e 67 2c 20 67 72 6f 75 70 73 2c 20 6e  owing, groups, n
5e20: 6f 2c 20 6f 74 68 65 72 73 2c 20 6f 76 65 72 2c  o, others, over,
5e30: 0a 20 20 20 20 70 61 72 74 69 74 69 6f 6e 2c 20  .    partition, 
5e40: 70 72 65 63 65 64 69 6e 67 2c 20 72 61 6e 67 65  preceding, range
5e50: 2c 20 74 69 65 73 2c 20 75 6e 62 6f 75 6e 64 65  , ties, unbounde
5e60: 64 2c 20 77 69 6e 64 6f 77 0a 20 20 46 52 4f 4d  d, window.  FROM
5e70: 20 6b 65 79 77 6f 72 64 5f 74 61 62 0a 7d 0a 0a   keyword_tab.}..
5e80: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 66 6f 72 65 61  ----------.forea
5ed0: 63 68 20 7b 74 6e 20 65 78 70 72 20 65 72 72 7d  ch {tn expr err}
5ee0: 20 7b 0a 20 20 31 20 20 20 34 2e 35 20 20 20 20   {.  1   4.5    
5ef0: 20 20 30 0a 20 20 32 20 20 20 4e 55 4c 4c 20 20    0.  2   NULL  
5f00: 20 20 20 31 0a 20 20 33 20 20 20 30 2e 30 20 20     1.  3   0.0  
5f10: 20 20 20 20 30 0a 20 20 34 20 20 20 30 2e 31 20      0.  4   0.1 
5f20: 20 20 20 20 20 30 0a 20 20 35 20 20 2d 30 2e 31       0.  5  -0.1
5f30: 20 20 20 20 20 20 31 0a 20 20 36 20 20 27 27 20        1.  6  '' 
5f40: 20 20 20 20 20 20 20 31 0a 20 20 37 20 20 27 32         1.  7  '2
5f50: 2e 30 27 20 20 20 20 20 30 0a 20 20 38 20 20 27  .0'     0.  8  '
5f60: 32 2e 30 78 27 20 20 20 20 31 0a 20 20 39 20 20  2.0x'    1.  9  
5f70: 78 27 31 32 33 34 27 20 20 20 31 0a 20 31 30 20  x'1234'   1. 10 
5f80: 20 27 31 2e 32 27 20 20 20 20 20 30 0a 7d 20 7b   '1.2'     0.} {
5f90: 0a 20 20 73 65 74 20 72 65 73 20 7b 30 20 31 7d  .  set res {0 1}
5fa0: 0a 20 20 69 66 20 7b 24 65 72 72 7d 20 7b 73 65  .  if {$err} {se
5fb0: 74 20 72 65 73 20 7b 31 20 7b 66 72 61 6d 65 20  t res {1 {frame 
5fc0: 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20  starting offset 
5fd0: 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65  must be a non-ne
5fe0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 7d 7d 20  gative number}} 
5ff0: 7d 0a 20 20 64 6f 5f 63 61 74 63 68 73 71 6c 5f  }.  do_catchsql_
6000: 74 65 73 74 20 32 32 2e 24 74 6e 2e 31 20 22 0a  test 22.$tn.1 ".
6010: 20 20 20 20 57 49 54 48 20 61 28 78 2c 20 79 29      WITH a(x, y)
6020: 20 41 53 20 28 20 56 41 4c 55 45 53 28 31 2c 20   AS ( VALUES(1, 
6030: 32 29 20 29 0a 20 20 20 20 53 45 4c 45 43 54 20  2) ).    SELECT 
6040: 73 75 6d 28 78 29 20 4f 56 45 52 20 28 0a 20 20  sum(x) OVER (.  
6050: 20 20 20 20 4f 52 44 45 52 20 42 59 20 79 20 52      ORDER BY y R
6060: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 24 65 78  ANGE BETWEEN $ex
6070: 70 72 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  pr PRECEDING AND
6080: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
6090: 57 49 4e 47 0a 20 20 20 20 29 20 46 52 4f 4d 20  WING.    ) FROM 
60a0: 61 0a 20 20 22 20 24 72 65 73 0a 0a 20 20 73 65  a.  " $res..  se
60b0: 74 20 72 65 73 20 7b 30 20 31 7d 0a 20 20 69 66  t res {0 1}.  if
60c0: 20 7b 24 65 72 72 7d 20 7b 73 65 74 20 72 65 73   {$err} {set res
60d0: 20 7b 31 20 7b 66 72 61 6d 65 20 65 6e 64 69 6e   {1 {frame endin
60e0: 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65  g offset must be
60f0: 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20   a non-negative 
6100: 6e 75 6d 62 65 72 7d 7d 20 7d 0a 20 20 64 6f 5f  number}} }.  do_
6110: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 32 32  catchsql_test 22
6120: 2e 24 74 6e 2e 32 20 22 0a 20 20 20 20 57 49 54  .$tn.2 ".    WIT
6130: 48 20 61 28 78 2c 20 79 29 20 41 53 20 28 20 56  H a(x, y) AS ( V
6140: 41 4c 55 45 53 28 31 2c 20 32 29 20 29 0a 20 20  ALUES(1, 2) ).  
6150: 20 20 53 45 4c 45 43 54 20 73 75 6d 28 78 29 20    SELECT sum(x) 
6160: 4f 56 45 52 20 28 0a 20 20 20 20 20 20 4f 52 44  OVER (.      ORD
6170: 45 52 20 42 59 20 79 20 52 41 4e 47 45 20 42 45  ER BY y RANGE BE
6180: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
6190: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 24 65  PRECEDING AND $e
61a0: 78 70 72 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20  xpr FOLLOWING.  
61b0: 20 20 29 20 46 52 4f 4d 20 61 0a 20 20 22 20 24    ) FROM a.  " $
61c0: 72 65 73 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  res.}..#--------
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6210: 2d 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78  -.reset_db.do_ex
6220: 65 63 73 71 6c 5f 74 65 73 74 20 32 33 2e 30 20  ecsql_test 23.0 
6230: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
6240: 20 74 35 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20   t5(a, b, c);.  
6250: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 35 61  CREATE INDEX t5a
6260: 62 20 4f 4e 20 74 35 28 61 2c 20 62 29 3b 0a 7d  b ON t5(a, b);.}
6270: 0a 0a 70 72 6f 63 20 64 6f 5f 6f 72 64 65 72 63  ..proc do_orderc
6280: 6f 75 6e 74 5f 74 65 73 74 20 7b 74 6e 20 73 71  ount_test {tn sq
6290: 6c 20 6e 4f 72 64 65 72 42 79 7d 20 7b 0a 20 20  l nOrderBy} {.  
62a0: 73 65 74 20 70 6c 61 6e 20 5b 65 78 65 63 73 71  set plan [execsq
62b0: 6c 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  l "EXPLAIN QUERY
62c0: 20 50 4c 41 4e 20 24 73 71 6c 22 5d 0a 20 20 75   PLAN $sql"].  u
62d0: 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f 5f  plevel [list do_
62e0: 74 65 73 74 20 24 74 6e 20 5b 6c 69 73 74 20 72  test $tn [list r
62f0: 65 67 65 78 70 20 2d 61 6c 6c 20 4f 52 44 45 52  egexp -all ORDER
6300: 20 24 70 6c 61 6e 5d 20 24 6e 4f 72 64 65 72 42   $plan] $nOrderB
6310: 79 5d 0a 7d 0a 0a 64 6f 5f 6f 72 64 65 72 63 6f  y].}..do_orderco
6320: 75 6e 74 5f 74 65 73 74 20 32 33 2e 31 20 7b 0a  unt_test 23.1 {.
6330: 20 20 53 45 4c 45 43 54 20 0a 20 20 20 20 73 75    SELECT .    su
6340: 6d 28 63 29 20 4f 56 45 52 20 28 4f 52 44 45 52  m(c) OVER (ORDER
6350: 20 42 59 20 61 2c 20 62 29 2c 0a 20 20 20 20 73   BY a, b),.    s
6360: 75 6d 28 63 29 20 4f 56 45 52 20 28 50 41 52 54  um(c) OVER (PART
6370: 49 54 49 4f 4e 20 42 59 20 61 20 4f 52 44 45 52  ITION BY a ORDER
6380: 20 42 59 20 62 29 0a 20 20 46 52 4f 4d 20 74 35   BY b).  FROM t5
6390: 0a 7d 20 30 0a 0a 64 6f 5f 6f 72 64 65 72 63 6f  .} 0..do_orderco
63a0: 75 6e 74 5f 74 65 73 74 20 32 33 2e 32 20 7b 0a  unt_test 23.2 {.
63b0: 20 20 53 45 4c 45 43 54 20 0a 20 20 20 20 73 75    SELECT .    su
63c0: 6d 28 63 29 20 4f 56 45 52 20 28 4f 52 44 45 52  m(c) OVER (ORDER
63d0: 20 42 59 20 62 2c 20 61 29 2c 0a 20 20 20 20 73   BY b, a),.    s
63e0: 75 6d 28 63 29 20 4f 56 45 52 20 28 50 41 52 54  um(c) OVER (PART
63f0: 49 54 49 4f 4e 20 42 59 20 62 20 4f 52 44 45 52  ITION BY b ORDER
6400: 20 42 59 20 61 29 0a 20 20 46 52 4f 4d 20 74 35   BY a).  FROM t5
6410: 0a 7d 20 31 0a 0a 64 6f 5f 6f 72 64 65 72 63 6f  .} 1..do_orderco
6420: 75 6e 74 5f 74 65 73 74 20 32 33 2e 33 20 7b 0a  unt_test 23.3 {.
6430: 20 20 53 45 4c 45 43 54 20 0a 20 20 20 20 73 75    SELECT .    su
6440: 6d 28 63 29 20 4f 56 45 52 20 28 4f 52 44 45 52  m(c) OVER (ORDER
6450: 20 42 59 20 62 2c 20 61 29 2c 0a 20 20 20 20 73   BY b, a),.    s
6460: 75 6d 28 63 29 20 4f 56 45 52 20 28 4f 52 44 45  um(c) OVER (ORDE
6470: 52 20 42 59 20 63 2c 20 62 29 0a 20 20 46 52 4f  R BY c, b).  FRO
6480: 4d 20 74 35 0a 7d 20 32 0a 0a 64 6f 5f 6f 72 64  M t5.} 2..do_ord
6490: 65 72 63 6f 75 6e 74 5f 74 65 73 74 20 32 33 2e  ercount_test 23.
64a0: 34 20 7b 0a 20 20 53 45 4c 45 43 54 20 0a 20 20  4 {.  SELECT .  
64b0: 20 20 73 75 6d 28 63 29 20 4f 56 45 52 20 28 4f    sum(c) OVER (O
64c0: 52 44 45 52 20 42 59 20 62 20 52 4f 57 53 20 42  RDER BY b ROWS B
64d0: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
64e0: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
64f0: 55 52 52 45 4e 54 20 52 4f 57 29 2c 0a 20 20 20  URRENT ROW),.   
6500: 20 73 75 6d 28 63 29 20 4f 56 45 52 20 28 4f 52   sum(c) OVER (OR
6510: 44 45 52 20 42 59 20 62 20 52 41 4e 47 45 20 42  DER BY b RANGE B
6520: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
6530: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
6540: 55 52 52 45 4e 54 20 52 4f 57 29 2c 0a 20 20 20  URRENT ROW),.   
6550: 20 73 75 6d 28 63 29 20 4f 56 45 52 20 28 4f 52   sum(c) OVER (OR
6560: 44 45 52 20 42 59 20 62 20 47 52 4f 55 50 53 20  DER BY b GROUPS 
6570: 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
6580: 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
6590: 43 55 52 52 45 4e 54 20 52 4f 57 29 0a 20 20 46  CURRENT ROW).  F
65a0: 52 4f 4d 20 74 35 0a 7d 20 31 0a 0a 64 6f 5f 6f  ROM t5.} 1..do_o
65b0: 72 64 65 72 63 6f 75 6e 74 5f 74 65 73 74 20 32  rdercount_test 2
65c0: 33 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 0a  3.5 {.  SELECT .
65d0: 20 20 20 20 73 75 6d 28 63 29 20 4f 56 45 52 20      sum(c) OVER 
65e0: 28 4f 52 44 45 52 20 42 59 20 62 2b 31 20 52 4f  (ORDER BY b+1 RO
65f0: 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  WS UNBOUNDED PRE
6600: 43 45 44 49 4e 47 29 2c 0a 20 20 20 20 73 75 6d  CEDING),.    sum
6610: 28 63 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20  (c) OVER (ORDER 
6620: 42 59 20 62 2b 31 20 52 41 4e 47 45 20 55 4e 42  BY b+1 RANGE UNB
6630: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
6640: 29 2c 0a 20 20 20 20 73 75 6d 28 63 29 20 4f 56  ),.    sum(c) OV
6650: 45 52 20 28 4f 52 44 45 52 20 42 59 20 62 2b 31  ER (ORDER BY b+1
6660: 20 47 52 4f 55 50 53 20 55 4e 42 4f 55 4e 44 45   GROUPS UNBOUNDE
6670: 44 20 50 52 45 43 45 44 49 4e 47 29 0a 20 20 46  D PRECEDING).  F
6680: 52 4f 4d 20 74 35 0a 7d 20 31 0a 0a 64 6f 5f 6f  ROM t5.} 1..do_o
6690: 72 64 65 72 63 6f 75 6e 74 5f 74 65 73 74 20 32  rdercount_test 2
66a0: 33 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 0a  3.6 {.  SELECT .
66b0: 20 20 20 20 73 75 6d 28 63 29 20 4f 56 45 52 20      sum(c) OVER 
66c0: 28 4f 52 44 45 52 20 42 59 20 62 2b 31 20 52 4f  (ORDER BY b+1 RO
66d0: 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  WS UNBOUNDED PRE
66e0: 43 45 44 49 4e 47 29 2c 0a 20 20 20 20 73 75 6d  CEDING),.    sum
66f0: 28 63 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20  (c) OVER (ORDER 
6700: 42 59 20 62 2b 32 20 52 41 4e 47 45 20 55 4e 42  BY b+2 RANGE UNB
6710: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
6720: 29 2c 0a 20 20 20 20 73 75 6d 28 63 29 20 4f 56  ),.    sum(c) OV
6730: 45 52 20 28 4f 52 44 45 52 20 42 59 20 62 2b 33  ER (ORDER BY b+3
6740: 20 47 52 4f 55 50 53 20 55 4e 42 4f 55 4e 44 45   GROUPS UNBOUNDE
6750: 44 20 50 52 45 43 45 44 49 4e 47 29 0a 20 20 46  D PRECEDING).  F
6760: 52 4f 4d 20 74 35 0a 7d 20 33 0a 0a 64 6f 5f 65  ROM t5.} 3..do_e
6770: 78 65 63 73 71 6c 5f 74 65 73 74 20 32 34 2e 31  xecsql_test 24.1
6780: 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 75 6d 28   {.  SELECT sum(
6790: 34 34 29 20 4f 56 45 52 20 28 29 0a 7d 20 7b 34  44) OVER ().} {4
67a0: 34 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  4}..do_execsql_t
67b0: 65 73 74 20 32 34 2e 32 20 7b 0a 20 20 53 45 4c  est 24.2 {.  SEL
67c0: 45 43 54 20 6c 65 61 64 28 34 34 29 20 4f 56 45  ECT lead(44) OVE
67d0: 52 20 28 29 0a 7d 20 7b 7b 7d 7d 0a 0a 23 2d 2d  R ().} {{}}..#--
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6820: 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 72 65 73 65 74 5f  -------.#.reset_
6830: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
6840: 73 74 20 32 35 2e 30 20 7b 0a 20 20 43 52 45 41  st 25.0 {.  CREA
6850: 54 45 20 54 41 42 4c 45 20 74 31 20 28 20 74 31  TE TABLE t1 ( t1
6860: 5f 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  _id INTEGER PRIM
6870: 41 52 59 20 4b 45 59 20 29 3b 0a 20 20 43 52 45  ARY KEY );.  CRE
6880: 41 54 45 20 54 41 42 4c 45 20 74 32 20 28 20 74  ATE TABLE t2 ( t
6890: 32 5f 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  2_id INTEGER PRI
68a0: 4d 41 52 59 20 4b 45 59 20 29 3b 0a 20 20 43 52  MARY KEY );.  CR
68b0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 20 28 20  EATE TABLE t3 ( 
68c0: 74 33 5f 69 64 20 49 4e 54 45 47 45 52 20 50 52  t3_id INTEGER PR
68d0: 49 4d 41 52 59 20 4b 45 59 20 29 3b 0a 0a 20 20  IMARY KEY );..  
68e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
68f0: 41 4c 55 45 53 28 31 29 2c 20 20 28 33 29 2c 20  ALUES(1),  (3), 
6900: 28 35 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  (5);.  INSERT IN
6910: 54 4f 20 74 32 20 56 41 4c 55 45 53 20 20 20 20  TO t2 VALUES    
6920: 20 20 28 33 29 2c 20 28 35 29 3b 0a 20 20 49 4e    (3), (5);.  IN
6930: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
6940: 55 45 53 28 31 30 29 2c 20 28 31 31 29 2c 20 28  UES(10), (11), (
6950: 31 32 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  12);.}..do_execs
6960: 71 6c 5f 74 65 73 74 20 32 35 2e 31 20 7b 0a 20  ql_test 25.1 {. 
6970: 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f   SELECT t1.* FRO
6980: 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 0a  M t1, t2 WHERE .
6990: 20 20 20 20 74 31 5f 69 64 3d 74 32 5f 69 64 20      t1_id=t2_id 
69a0: 41 4e 44 20 74 31 5f 69 64 20 49 4e 20 28 0a 20  AND t1_id IN (. 
69b0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 74 31         SELECT t1
69c0: 5f 69 64 20 2b 20 72 6f 77 5f 6e 75 6d 62 65 72  _id + row_number
69d0: 28 29 20 4f 56 45 52 20 28 20 4f 52 44 45 52 20  () OVER ( ORDER 
69e0: 42 59 20 74 31 5f 69 64 20 29 20 46 52 4f 4d 20  BY t1_id ) FROM 
69f0: 74 33 0a 20 20 20 20 29 0a 7d 0a 0a 64 6f 5f 65  t3.    ).}..do_e
6a00: 78 65 63 73 71 6c 5f 74 65 73 74 20 32 35 2e 32  xecsql_test 25.2
6a10: 20 7b 0a 20 20 53 45 4c 45 43 54 20 74 31 2e 2a   {.  SELECT t1.*
6a20: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
6a30: 52 45 20 0a 20 20 20 20 74 31 5f 69 64 3d 74 32  RE .    t1_id=t2
6a40: 5f 69 64 20 41 4e 44 20 74 31 5f 69 64 20 49 4e  _id AND t1_id IN
6a50: 20 28 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43   (.        SELEC
6a60: 54 20 20 20 20 20 20 20 20 20 72 6f 77 5f 6e 75  T         row_nu
6a70: 6d 62 65 72 28 29 20 4f 56 45 52 20 28 20 4f 52  mber() OVER ( OR
6a80: 44 45 52 20 42 59 20 74 31 5f 69 64 20 29 20 46  DER BY t1_id ) F
6a90: 52 4f 4d 20 74 33 0a 20 20 20 20 29 0a 7d 20 7b  ROM t3.    ).} {
6aa0: 33 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  3}..#-----------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 72  --------------.r
6af0: 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73  eset_db.do_execs
6b00: 71 6c 5f 74 65 73 74 20 32 36 2e 30 20 7b 0a 20  ql_test 26.0 {. 
6b10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
6b20: 28 78 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41  (x);.  CREATE TA
6b30: 42 4c 45 20 74 32 28 63 29 3b 0a 7d 0a 0a 64 6f  BLE t2(c);.}..do
6b40: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 36  _execsql_test 26
6b50: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 28 20  .1 {.  SELECT ( 
6b60: 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65  SELECT row_numbe
6b70: 72 28 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d  r() OVER () FROM
6b80: 20 28 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d   ( SELECT c FROM
6b90: 20 74 31 20 29 20 29 20 46 52 4f 4d 20 74 32 0a   t1 ) ) FROM t2.
6ba0: 7d 20 7b 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  } {}..do_execsql
6bb0: 5f 74 65 73 74 20 32 36 2e 32 20 7b 0a 20 20 49  _test 26.2 {.  I
6bc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6bd0: 4c 55 45 53 28 31 29 2c 20 28 32 29 2c 20 28 33  LUES(1), (2), (3
6be0: 29 2c 20 28 34 29 3b 0a 20 20 49 4e 53 45 52 54  ), (4);.  INSERT
6bf0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
6c00: 32 29 2c 20 28 36 29 2c 20 28 38 29 2c 20 28 34  2), (6), (8), (4
6c10: 29 3b 0a 20 20 53 45 4c 45 43 54 20 63 2c 20 63  );.  SELECT c, c
6c20: 20 49 4e 20 28 20 0a 20 20 20 20 53 45 4c 45 43   IN ( .    SELEC
6c30: 54 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 4f  T row_number() O
6c40: 56 45 52 20 28 29 20 46 52 4f 4d 20 28 20 53 45  VER () FROM ( SE
6c50: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 31 20 29  LECT c FROM t1 )
6c60: 0a 20 20 29 20 46 52 4f 4d 20 74 32 0a 7d 20 7b  .  ) FROM t2.} {
6c70: 32 20 31 20 20 36 20 30 20 20 38 20 30 20 20 34  2 1  6 0  8 0  4
6c80: 20 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   1}..do_execsql_
6c90: 74 65 73 74 20 32 36 2e 33 20 7b 0a 20 20 44 45  test 26.3 {.  DE
6ca0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
6cb0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a  DELETE FROM t2;.
6cc0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
6cd0: 32 20 56 41 4c 55 45 53 28 31 29 2c 20 28 32 29  2 VALUES(1), (2)
6ce0: 2c 20 28 33 29 2c 20 28 34 29 3b 0a 20 20 49 4e  , (3), (4);.  IN
6cf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6d00: 55 45 53 28 31 29 2c 20 28 31 29 2c 20 28 32 29  UES(1), (1), (2)
6d10: 2c 20 28 33 29 2c 20 28 33 29 2c 20 28 33 29 2c  , (3), (3), (3),
6d20: 20 28 33 29 2c 20 28 34 29 2c 20 28 34 29 3b 0a   (3), (4), (4);.
6d30: 0a 20 20 53 45 4c 45 43 54 20 63 2c 20 63 20 49  .  SELECT c, c I
6d40: 4e 20 28 20 0a 20 20 20 20 53 45 4c 45 43 54 20  N ( .    SELECT 
6d50: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45  row_number() OVE
6d60: 52 20 28 29 20 46 52 4f 4d 20 28 20 53 45 4c 45  R () FROM ( SELE
6d70: 43 54 20 31 20 46 52 4f 4d 20 74 31 20 57 48 45  CT 1 FROM t1 WHE
6d80: 52 45 20 78 3d 63 20 29 0a 20 20 29 20 46 52 4f  RE x=c ).  ) FRO
6d90: 4d 20 74 32 0a 7d 20 7b 31 20 31 20 20 32 20 30  M t2.} {1 1  2 0
6da0: 20 20 33 20 31 20 20 34 20 30 7d 0a 0a 23 2d 2d    3 1  4 0}..#--
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 0a 72 65 73 65 74 5f 64 62  -------.reset_db
6e00: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6e10: 20 32 37 2e 30 20 7b 0a 20 20 43 52 45 41 54 45   27.0 {.  CREATE
6e20: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
6e30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6e40: 41 4c 55 45 53 28 4e 55 4c 4c 29 2c 20 28 31 29  ALUES(NULL), (1)
6e50: 2c 20 28 32 29 2c 20 28 33 29 2c 20 28 34 29 2c  , (2), (3), (4),
6e60: 20 28 35 29 3b 0a 7d 0a 64 6f 5f 65 78 65 63 73   (5);.}.do_execs
6e70: 71 6c 5f 74 65 73 74 20 32 37 2e 31 20 7b 0a 20  ql_test 27.1 {. 
6e80: 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
6e90: 52 4f 4d 20 74 31 3b 0a 7d 20 7b 31 7d 0a 64 6f  ROM t1;.} {1}.do
6ea0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 37  _execsql_test 27
6eb0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6d 69  .2 {.  SELECT mi
6ec0: 6e 28 78 29 20 4f 56 45 52 20 77 69 6e 20 46 52  n(x) OVER win FR
6ed0: 4f 4d 20 74 31 0a 20 20 57 49 4e 44 4f 57 20 77  OM t1.  WINDOW w
6ee0: 69 6e 20 41 53 20 28 4f 52 44 45 52 20 42 59 20  in AS (ORDER BY 
6ef0: 72 6f 77 69 64 20 52 4f 57 53 20 42 45 54 57 45  rowid ROWS BETWE
6f00: 45 4e 20 31 20 50 52 45 43 45 44 49 4e 47 20 41  EN 1 PRECEDING A
6f10: 4e 44 20 31 20 46 4f 4c 4c 4f 57 49 4e 47 29 0a  ND 1 FOLLOWING).
6f20: 7d 20 7b 31 20 31 20 31 20 32 20 33 20 34 7d 0a  } {1 1 1 2 3 4}.
6f30: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 72 65 73  -----------..res
6f80: 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c  et_db.do_execsql
6f90: 5f 74 65 73 74 20 32 38 2e 31 2e 31 20 7b 0a 20  _test 28.1.1 {. 
6fa0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
6fb0: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
6fc0: 52 59 20 4b 45 59 2c 20 62 20 43 48 41 52 28 31  RY KEY, b CHAR(1
6fd0: 29 2c 20 63 20 43 48 41 52 28 32 29 2c 20 64 20  ), c CHAR(2), d 
6fe0: 41 4e 59 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  ANY);.  INSERT I
6ff0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 20 28 33  NTO t1 VALUES (3
7000: 2c 20 27 43 27 2c 20 27 63 63 27 2c 20 31 2e 30  , 'C', 'cc', 1.0
7010: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
7020: 20 74 31 20 56 41 4c 55 45 53 20 28 31 33 2c 27   t1 VALUES (13,'
7030: 4d 27 2c 20 27 63 63 27 2c 20 4e 55 4c 4c 29 3b  M', 'cc', NULL);
7040: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
7050: 65 73 74 20 32 38 2e 31 2e 32 20 7b 0a 20 20 53  est 28.1.2 {.  S
7060: 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63  ELECT group_conc
7070: 61 74 28 62 2c 27 27 29 20 4f 56 45 52 20 77 31  at(b,'') OVER w1
7080: 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 57 49 4e   FROM t1.    WIN
7090: 44 4f 57 20 77 31 20 41 53 20 28 4f 52 44 45 52  DOW w1 AS (ORDER
70a0: 20 42 59 20 61 20 52 41 4e 47 45 20 42 45 54 57   BY a RANGE BETW
70b0: 45 45 4e 20 33 20 50 52 45 43 45 44 49 4e 47 20  EEN 3 PRECEDING 
70c0: 41 4e 44 20 31 20 50 52 45 43 45 44 49 4e 47 29  AND 1 PRECEDING)
70d0: 0a 7d 20 7b 0a 20 20 7b 7d 20 7b 7d 0a 7d 0a 0a  .} {.  {} {}.}..
70e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
70f0: 32 38 2e 32 2e 31 20 7b 0a 20 20 43 52 45 41 54  28.2.1 {.  CREAT
7100: 45 20 54 41 42 4c 45 20 74 32 28 61 20 54 45 58  E TABLE t2(a TEX
7110: 54 2c 20 62 20 49 4e 54 45 47 45 52 29 3b 0a 20  T, b INTEGER);. 
7120: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
7130: 56 41 4c 55 45 53 28 27 41 27 2c 20 4e 55 4c 4c  VALUES('A', NULL
7140: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
7150: 20 74 32 20 56 41 4c 55 45 53 28 27 42 27 2c 20   t2 VALUES('B', 
7160: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65  NULL);.}..do_exe
7170: 63 73 71 6c 5f 74 65 73 74 20 32 38 2e 32 2e 31  csql_test 28.2.1
7180: 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20   {.  DROP TABLE 
7190: 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20  IF EXISTS t1;.  
71a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
71b0: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
71c0: 59 20 4b 45 59 2c 20 62 20 43 48 41 52 28 31 29  Y KEY, b CHAR(1)
71d0: 2c 20 63 20 43 48 41 52 28 32 29 2c 20 64 20 41  , c CHAR(2), d A
71e0: 4e 59 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  NY);.  INSERT IN
71f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 0a 20 20 20  TO t1 VALUES.   
7200: 20 28 31 30 2c 27 4a 27 2c 20 27 63 63 27 2c 20   (10,'J', 'cc', 
7210: 4e 55 4c 4c 29 2c 0a 20 20 20 20 28 31 31 2c 27  NULL),.    (11,'
7220: 4b 27 2c 20 27 63 63 27 2c 20 27 78 79 7a 27 29  K', 'cc', 'xyz')
7230: 2c 0a 20 20 20 20 28 31 33 2c 27 4d 27 2c 20 27  ,.    (13,'M', '
7240: 63 63 27 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 64  cc', NULL);.}..d
7250: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
7260: 38 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  8.2.2 {.  SELECT
7270: 20 61 2c 20 62 2c 20 63 2c 20 71 75 6f 74 65 28   a, b, c, quote(
7280: 64 29 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  d), group_concat
7290: 28 62 2c 27 27 29 20 4f 56 45 52 20 77 31 2c 20  (b,'') OVER w1, 
72a0: 27 7c 27 20 46 52 4f 4d 20 74 31 0a 20 20 20 20  '|' FROM t1.    
72b0: 57 49 4e 44 4f 57 20 77 31 20 41 53 0a 20 20 20  WINDOW w1 AS.   
72c0: 20 28 4f 52 44 45 52 20 42 59 20 64 20 44 45 53   (ORDER BY d DES
72d0: 43 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  C RANGE BETWEEN 
72e0: 37 2e 30 20 50 52 45 43 45 44 49 4e 47 20 41 4e  7.0 PRECEDING AN
72f0: 44 20 32 2e 35 20 50 52 45 43 45 44 49 4e 47 29  D 2.5 PRECEDING)
7300: 0a 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 2c  .    ORDER BY c,
7310: 20 64 2c 20 61 3b 0a 7d 20 7b 0a 20 20 31 30 20   d, a;.} {.  10 
7320: 4a 20 63 63 20 4e 55 4c 4c 20 4a 4d 20 7c 0a 20  J cc NULL JM |. 
7330: 20 31 33 20 4d 20 63 63 20 4e 55 4c 4c 20 4a 4d   13 M cc NULL JM
7340: 20 7c 20 0a 20 20 31 31 20 4b 20 63 63 20 27 78   | .  11 K cc 'x
7350: 79 7a 27 20 4b 20 7c 0a 7d 0a 0a 23 2d 2d 2d 2d  yz' K |.}..#----
7360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
73a0: 2d 2d 2d 2d 2d 0a 72 65 73 65 74 5f 64 62 0a 0a  -----.reset_db..
73b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
73c0: 32 39 2e 31 20 7b 0a 20 20 44 52 4f 50 20 54 41  29.1 {.  DROP TA
73d0: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31  BLE IF EXISTS t1
73e0: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
73f0: 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52   t1(a INTEGER PR
7400: 49 4d 41 52 59 20 4b 45 59 2c 20 62 20 43 48 41  IMARY KEY, b CHA
7410: 52 28 31 29 2c 20 63 20 43 48 41 52 28 32 29 2c  R(1), c CHAR(2),
7420: 20 64 20 41 4e 59 29 3b 0a 20 20 49 4e 53 45 52   d ANY);.  INSER
7430: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
7440: 0a 20 20 20 20 28 31 2c 20 27 41 27 2c 20 27 61  .    (1, 'A', 'a
7450: 61 27 2c 20 32 2e 35 29 2c 0a 20 20 20 20 28 32  a', 2.5),.    (2
7460: 2c 20 27 42 27 2c 20 27 62 62 27 2c 20 33 2e 37  , 'B', 'bb', 3.7
7470: 35 29 2c 0a 20 20 20 20 28 33 2c 20 27 43 27 2c  5),.    (3, 'C',
7480: 20 27 63 63 27 2c 20 31 2e 30 29 2c 0a 20 20 20   'cc', 1.0),.   
7490: 20 28 34 2c 20 27 44 27 2c 20 27 63 63 27 2c 20   (4, 'D', 'cc', 
74a0: 38 2e 32 35 29 2c 0a 20 20 20 20 28 35 2c 20 27  8.25),.    (5, '
74b0: 45 27 2c 20 27 62 62 27 2c 20 36 2e 35 29 2c 0a  E', 'bb', 6.5),.
74c0: 20 20 20 20 28 36 2c 20 27 46 27 2c 20 27 61 61      (6, 'F', 'aa
74d0: 27 2c 20 36 2e 35 29 2c 0a 20 20 20 20 28 37 2c  ', 6.5),.    (7,
74e0: 20 27 47 27 2c 20 27 61 61 27 2c 20 36 2e 30 29   'G', 'aa', 6.0)
74f0: 2c 0a 20 20 20 20 28 38 2c 20 27 48 27 2c 20 27  ,.    (8, 'H', '
7500: 62 62 27 2c 20 39 2e 30 29 2c 0a 20 20 20 20 28  bb', 9.0),.    (
7510: 39 2c 20 27 49 27 2c 20 27 61 61 27 2c 20 33 2e  9, 'I', 'aa', 3.
7520: 37 35 29 2c 0a 20 20 20 20 28 31 30 2c 27 4a 27  75),.    (10,'J'
7530: 2c 20 27 63 63 27 2c 20 4e 55 4c 4c 29 2c 0a 20  , 'cc', NULL),. 
7540: 20 20 20 28 31 31 2c 27 4b 27 2c 20 27 63 63 27     (11,'K', 'cc'
7550: 2c 20 27 78 79 7a 27 29 2c 0a 20 20 20 20 28 31  , 'xyz'),.    (1
7560: 32 2c 27 4c 27 2c 20 27 63 63 27 2c 20 27 78 79  2,'L', 'cc', 'xy
7570: 5a 27 29 2c 0a 20 20 20 20 28 31 33 2c 27 4d 27  Z'),.    (13,'M'
7580: 2c 20 27 63 63 27 2c 20 4e 55 4c 4c 29 3b 0a 7d  , 'cc', NULL);.}
7590: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
75a0: 74 20 32 39 2e 32 20 7b 0a 20 20 53 45 4c 45 43  t 29.2 {.  SELEC
75b0: 54 20 61 2c 20 62 2c 20 63 2c 20 71 75 6f 74 65  T a, b, c, quote
75c0: 28 64 29 2c 20 67 72 6f 75 70 5f 63 6f 6e 63 61  (d), group_conca
75d0: 74 28 62 2c 27 27 29 20 4f 56 45 52 20 77 31 2c  t(b,'') OVER w1,
75e0: 20 27 7c 27 20 46 52 4f 4d 20 74 31 0a 20 20 20   '|' FROM t1.   
75f0: 20 57 49 4e 44 4f 57 20 77 31 20 41 53 0a 20 20   WINDOW w1 AS.  
7600: 20 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20    (PARTITION BY 
7610: 63 20 4f 52 44 45 52 20 42 59 20 64 20 44 45 53  c ORDER BY d DES
7620: 43 0a 20 20 20 20 20 52 41 4e 47 45 20 42 45 54  C.     RANGE BET
7630: 57 45 45 4e 20 37 2e 30 20 50 52 45 43 45 44 49  WEEN 7.0 PRECEDI
7640: 4e 47 20 41 4e 44 20 32 2e 35 20 50 52 45 43 45  NG AND 2.5 PRECE
7650: 44 49 4e 47 29 0a 20 20 20 20 4f 52 44 45 52 20  DING).    ORDER 
7660: 42 59 20 63 2c 20 64 2c 20 61 3b 0a 7d 20 7b 0a  BY c, d, a;.} {.
7670: 20 20 31 20 41 20 61 61 20 32 2e 35 20 46 47 20    1 A aa 2.5 FG 
7680: 7c 20 0a 20 20 39 20 49 20 61 61 20 33 2e 37 35  | .  9 I aa 3.75
7690: 20 46 20 7c 20 0a 20 20 37 20 47 20 61 61 20 36   F | .  7 G aa 6
76a0: 20 7b 7d 20 7c 20 0a 20 20 36 20 46 20 61 61 20   {} | .  6 F aa 
76b0: 36 2e 35 20 7b 7d 20 7c 20 0a 20 20 32 20 42 20  6.5 {} | .  2 B 
76c0: 62 62 20 33 2e 37 35 20 48 45 20 7c 0a 20 20 35  bb 3.75 HE |.  5
76d0: 20 45 20 62 62 20 36 2e 35 20 48 20 7c 20 0a 20   E bb 6.5 H | . 
76e0: 20 38 20 48 20 62 62 20 39 20 7b 7d 20 7c 20 0a   8 H bb 9 {} | .
76f0: 20 20 31 30 20 4a 20 63 63 20 4e 55 4c 4c 20 4a    10 J cc NULL J
7700: 4d 20 7c 20 0a 20 20 31 33 20 4d 20 63 63 20 4e  M | .  13 M cc N
7710: 55 4c 4c 20 4a 4d 20 7c 20 0a 20 20 33 20 43 20  ULL JM | .  3 C 
7720: 63 63 20 31 20 7b 7d 20 7c 20 0a 20 20 34 20 44  cc 1 {} | .  4 D
7730: 20 63 63 20 38 2e 32 35 20 7b 7d 20 7c 20 0a 20   cc 8.25 {} | . 
7740: 20 31 32 20 4c 20 63 63 20 27 78 79 5a 27 20 4c   12 L cc 'xyZ' L
7750: 20 7c 20 0a 20 20 31 31 20 4b 20 63 63 20 27 78   | .  11 K cc 'x
7760: 79 7a 27 20 4b 20 7c 0a 7d 0a 0a 23 20 32 30 31  yz' K |.}..# 201
7770: 39 2d 30 37 2d 31 38 0a 23 20 43 68 65 63 6b 2d  9-07-18.# Check-
7780: 69 6e 20 5b 37 65 66 37 62 32 33 63 62 62 31 62  in [7ef7b23cbb1b
7790: 39 61 63 65 5d 20 28 77 68 69 63 68 20 77 61 73  9ace] (which was
77a0: 20 69 74 73 65 6c 66 20 61 20 66 69 78 20 66 6f   itself a fix fo
77b0: 72 20 74 69 63 6b 65 74 0a 23 20 68 74 74 70 73  r ticket.# https
77c0: 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
77d0: 67 2f 73 72 63 2f 69 6e 66 6f 2f 31 62 65 37 32  g/src/info/1be72
77e0: 61 61 62 39 29 20 69 6e 74 72 6f 64 75 63 65 64  aab9) introduced
77f0: 20 61 20 6e 65 77 20 70 72 6f 62 6c 65 6d 0a 23   a new problem.#
7800: 20 69 66 20 74 68 65 20 4c 48 53 20 6f 66 20 61   if the LHS of a
7810: 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
7820: 72 20 69 73 20 61 20 57 49 4e 44 4f 57 20 66 75  r is a WINDOW fu
7830: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 72 6f  nction.  The pro
7840: 62 6c 65 6d 0a 23 20 77 61 73 20 66 6f 75 6e 64  blem.# was found
7850: 20 62 79 20 28 74 68 65 20 72 65 63 65 6e 74 6c   by (the recentl
7860: 79 20 65 6e 68 61 6e 63 65 64 29 20 64 62 73 71  y enhanced) dbsq
7870: 6c 66 75 7a 7a 2e 0a 23 0a 64 6f 5f 65 78 65 63  lfuzz..#.do_exec
7880: 73 71 6c 5f 74 65 73 74 20 33 30 2e 30 20 7b 0a  sql_test 30.0 {.
7890: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
78a0: 45 58 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45  EXISTS t1;.  CRE
78b0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
78c0: 62 2c 20 63 29 3b 0a 20 20 49 4e 53 45 52 54 20  b, c);.  INSERT 
78d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
78e0: 42 42 27 2c 27 61 61 27 2c 33 39 39 29 3b 0a 20  BB','aa',399);. 
78f0: 20 53 45 4c 45 43 54 0a 20 20 20 20 63 6f 75 6e   SELECT.    coun
7900: 74 20 28 29 20 4f 56 45 52 20 77 69 6e 31 20 4e  t () OVER win1 N
7910: 4f 54 20 42 45 54 57 45 45 4e 20 27 61 27 20 41  OT BETWEEN 'a' A
7920: 4e 44 20 27 6d 6d 6d 27 2c 0a 20 20 20 20 63 6f  ND 'mmm',.    co
7930: 75 6e 74 20 28 29 20 4f 56 45 52 20 77 69 6e 33  unt () OVER win3
7940: 0a 20 20 46 52 4f 4d 20 74 31 0a 20 20 57 49 4e  .  FROM t1.  WIN
7950: 44 4f 57 20 77 69 6e 31 20 41 53 20 28 4f 52 44  DOW win1 AS (ORD
7960: 45 52 20 42 59 20 61 20 47 52 4f 55 50 53 20 42  ER BY a GROUPS B
7970: 45 54 57 45 45 4e 20 34 20 50 52 45 43 45 44 49  ETWEEN 4 PRECEDI
7980: 4e 47 20 41 4e 44 20 31 20 46 4f 4c 4c 4f 57 49  NG AND 1 FOLLOWI
7990: 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  NG.             
79a0: 20 20 20 20 20 45 58 43 4c 55 44 45 20 43 55 52       EXCLUDE CUR
79b0: 52 45 4e 54 20 52 4f 57 29 2c 0a 20 20 20 20 20  RENT ROW),.     
79c0: 20 20 20 20 77 69 6e 32 20 41 53 20 28 50 41 52      win2 AS (PAR
79d0: 54 49 54 49 4f 4e 20 42 59 20 62 20 4f 52 44 45  TITION BY b ORDE
79e0: 52 20 42 59 20 61 29 2c 0a 20 20 20 20 20 20 20  R BY a),.       
79f0: 20 20 77 69 6e 33 20 41 53 20 28 77 69 6e 32 20    win3 AS (win2 
7a00: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 35 2e  RANGE BETWEEN 5.
7a10: 32 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  2 PRECEDING AND 
7a20: 74 72 75 65 20 50 52 45 43 45 44 49 4e 47 20 29  true PRECEDING )
7a30: 3b 0a 7d 20 7b 31 20 31 7d 0a 0a 66 69 6e 69 73  ;.} {1 1}..finis
7a40: 68 5f 74 65 73 74 0a                             h_test.