/ Hex Artifact Content
Login

Artifact d732df0e81beedc0ba8a563ade68611d322d27303ad0c0c8e4444107c39e84ec:


0000: 23 23 20 32 30 31 38 20 4d 61 79 20 31 39 0a 23  ## 2018 May 19.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a  you give..#.#***
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 0a 23 0a 0a 73 6f 75 72 63 65 20 5b  ****.#..source [
0170: 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20  file join [file 
0180: 64 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 20  dirname $argv0] 
0190: 70 67 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c 5d 0a 0a  pg_common.tcl]..
01a0: 23 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  #===============
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 73 74 61 72  ==========..star
01f0: 74 5f 74 65 73 74 20 77 69 6e 64 6f 77 34 20 22  t_test window4 "
0200: 32 30 31 38 20 4a 75 6e 65 20 30 34 22 0a 69 66  2018 June 04".if
0210: 63 61 70 61 62 6c 65 20 21 77 69 6e 64 6f 77 66  capable !windowf
0220: 75 6e 63 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73  unc..execsql_tes
0230: 74 20 31 2e 30 20 7b 0a 20 20 44 52 4f 50 20 54  t 1.0 {.  DROP T
0240: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
0250: 33 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  3;.  CREATE TABL
0260: 45 20 74 33 28 61 20 54 45 58 54 20 50 52 49 4d  E t3(a TEXT PRIM
0270: 41 52 59 20 4b 45 59 29 3b 0a 20 20 49 4e 53 45  ARY KEY);.  INSE
0280: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
0290: 53 28 27 61 27 29 2c 20 28 27 62 27 29 2c 20 28  S('a'), ('b'), (
02a0: 27 63 27 29 2c 20 28 27 64 27 29 2c 20 28 27 65  'c'), ('d'), ('e
02b0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
02c0: 4f 20 74 33 20 56 41 4c 55 45 53 28 27 66 27 29  O t3 VALUES('f')
02d0: 2c 20 28 27 67 27 29 2c 20 28 27 68 27 29 2c 20  , ('g'), ('h'), 
02e0: 28 27 69 27 29 2c 20 28 27 6a 27 29 3b 0a 7d 0a  ('i'), ('j');.}.
02f0: 0a 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b  .for {set i 1} {
0300: 24 69 20 3c 20 32 30 7d 20 7b 69 6e 63 72 20 69  $i < 20} {incr i
0310: 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c 5f 74 65  } {.  execsql_te
0320: 73 74 20 31 2e 24 69 20 22 53 45 4c 45 43 54 20  st 1.$i "SELECT 
0330: 61 2c 20 6e 74 69 6c 65 28 24 69 29 20 4f 56 45  a, ntile($i) OVE
0340: 52 20 28 4f 52 44 45 52 20 42 59 20 61 29 20 46  R (ORDER BY a) F
0350: 52 4f 4d 20 74 33 22 0a 7d 0a 0a 65 78 65 63 73  ROM t3".}..execs
0360: 71 6c 5f 74 65 73 74 20 32 2e 30 20 7b 0a 20 20  ql_test 2.0 {.  
0370: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
0380: 49 53 54 53 20 74 34 3b 0a 20 20 43 52 45 41 54  ISTS t4;.  CREAT
0390: 45 20 54 41 42 4c 45 20 74 34 28 61 20 49 4e 54  E TABLE t4(a INT
03a0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
03b0: 2c 20 62 20 54 45 58 54 2c 20 63 20 49 4e 54 45  , b TEXT, c INTE
03c0: 47 45 52 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  GER);.  INSERT I
03d0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c  NTO t4 VALUES(1,
03e0: 20 27 41 27 2c 20 39 29 3b 0a 20 20 49 4e 53 45   'A', 9);.  INSE
03f0: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
0400: 53 28 32 2c 20 27 42 27 2c 20 33 29 3b 0a 20 20  S(2, 'B', 3);.  
0410: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
0420: 41 4c 55 45 53 28 33 2c 20 27 43 27 2c 20 32 29  ALUES(3, 'C', 2)
0430: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0440: 74 34 20 56 41 4c 55 45 53 28 34 2c 20 27 44 27  t4 VALUES(4, 'D'
0450: 2c 20 31 30 29 3b 0a 20 20 49 4e 53 45 52 54 20  , 10);.  INSERT 
0460: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 35  INTO t4 VALUES(5
0470: 2c 20 27 45 27 2c 20 35 29 3b 0a 20 20 49 4e 53  , 'E', 5);.  INS
0480: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
0490: 45 53 28 36 2c 20 27 46 27 2c 20 31 29 3b 0a 20  ES(6, 'F', 1);. 
04a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
04b0: 56 41 4c 55 45 53 28 37 2c 20 27 47 27 2c 20 31  VALUES(7, 'G', 1
04c0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
04d0: 20 74 34 20 56 41 4c 55 45 53 28 38 2c 20 27 48   t4 VALUES(8, 'H
04e0: 27 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  ', 2);.  INSERT 
04f0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 39  INTO t4 VALUES(9
0500: 2c 20 27 49 27 2c 20 31 30 29 3b 0a 20 20 49 4e  , 'I', 10);.  IN
0510: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
0520: 55 45 53 28 31 30 2c 20 27 4a 27 2c 20 34 29 3b  UES(10, 'J', 4);
0530: 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73 74  .}..execsql_test
0540: 20 32 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20   2.1 {.  SELECT 
0550: 61 2c 20 6e 74 68 5f 76 61 6c 75 65 28 62 2c 20  a, nth_value(b, 
0560: 63 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42  c) OVER (ORDER B
0570: 59 20 61 29 20 46 52 4f 4d 20 74 34 0a 7d 0a 0a  Y a) FROM t4.}..
0580: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 32  execsql_test 2.2
0590: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c  .1 {.  SELECT a,
05a0: 20 6c 65 61 64 28 62 29 20 4f 56 45 52 20 28 4f   lead(b) OVER (O
05b0: 52 44 45 52 20 42 59 20 61 29 20 46 52 4f 4d 20  RDER BY a) FROM 
05c0: 74 34 0a 7d 0a 65 78 65 63 73 71 6c 5f 74 65 73  t4.}.execsql_tes
05d0: 74 20 32 2e 32 2e 32 20 7b 0a 20 20 53 45 4c 45  t 2.2.2 {.  SELE
05e0: 43 54 20 61 2c 20 6c 65 61 64 28 62 2c 20 32 29  CT a, lead(b, 2)
05f0: 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20   OVER (ORDER BY 
0600: 61 29 20 46 52 4f 4d 20 74 34 0a 7d 0a 65 78 65  a) FROM t4.}.exe
0610: 63 73 71 6c 5f 74 65 73 74 20 32 2e 32 2e 33 20  csql_test 2.2.3 
0620: 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 6c 65  {.  SELECT a, le
0630: 61 64 28 62 2c 20 33 2c 20 27 61 62 63 27 29 20  ad(b, 3, 'abc') 
0640: 4f 56 45 52 20 28 4f 52 44 45 52 20 42 59 20 61  OVER (ORDER BY a
0650: 29 20 46 52 4f 4d 20 74 34 0a 7d 0a 0a 65 78 65  ) FROM t4.}..exe
0660: 63 73 71 6c 5f 74 65 73 74 20 32 2e 33 2e 31 20  csql_test 2.3.1 
0670: 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20 6c 61  {.  SELECT a, la
0680: 67 28 62 29 20 4f 56 45 52 20 28 4f 52 44 45 52  g(b) OVER (ORDER
0690: 20 42 59 20 61 29 20 46 52 4f 4d 20 74 34 0a 7d   BY a) FROM t4.}
06a0: 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e  .execsql_test 2.
06b0: 33 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  3.2 {.  SELECT a
06c0: 2c 20 6c 61 67 28 62 2c 20 32 29 20 4f 56 45 52  , lag(b, 2) OVER
06d0: 20 28 4f 52 44 45 52 20 42 59 20 61 29 20 46 52   (ORDER BY a) FR
06e0: 4f 4d 20 74 34 0a 7d 0a 65 78 65 63 73 71 6c 5f  OM t4.}.execsql_
06f0: 74 65 73 74 20 32 2e 33 2e 33 20 7b 0a 20 20 53  test 2.3.3 {.  S
0700: 45 4c 45 43 54 20 61 2c 20 6c 61 67 28 62 2c 20  ELECT a, lag(b, 
0710: 33 2c 20 27 61 62 63 27 29 20 4f 56 45 52 20 28  3, 'abc') OVER (
0720: 4f 52 44 45 52 20 42 59 20 61 29 20 46 52 4f 4d  ORDER BY a) FROM
0730: 20 74 34 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74   t4.}..execsql_t
0740: 65 73 74 20 32 2e 34 2e 31 20 7b 0a 20 20 53 45  est 2.4.1 {.  SE
0750: 4c 45 43 54 20 73 74 72 69 6e 67 5f 61 67 67 28  LECT string_agg(
0760: 62 2c 20 27 2e 27 29 20 4f 56 45 52 20 28 0a 20  b, '.') OVER (. 
0770: 20 20 20 4f 52 44 45 52 20 42 59 20 61 20 52 4f     ORDER BY a RO
0780: 57 53 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  WS BETWEEN CURRE
0790: 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
07a0: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20  NDED FOLLOWING. 
07b0: 20 29 20 46 52 4f 4d 20 74 34 0a 7d 0a 0a 65 78   ) FROM t4.}..ex
07c0: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 30 20 7b  ecsql_test 3.0 {
07d0: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46  .  DROP TABLE IF
07e0: 20 45 58 49 53 54 53 20 74 35 3b 0a 20 20 43 52   EXISTS t5;.  CR
07f0: 45 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 20  EATE TABLE t5(a 
0800: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
0810: 4b 45 59 2c 20 62 20 54 45 58 54 2c 20 63 20 54  KEY, b TEXT, c T
0820: 45 58 54 2c 20 64 20 49 4e 54 45 47 45 52 29 3b  EXT, d INTEGER);
0830: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0840: 35 20 56 41 4c 55 45 53 28 31 2c 20 27 41 27 2c  5 VALUES(1, 'A',
0850: 20 27 6f 6e 65 27 2c 20 20 20 35 29 3b 0a 20 20   'one',   5);.  
0860: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
0870: 41 4c 55 45 53 28 32 2c 20 27 42 27 2c 20 27 74  ALUES(2, 'B', 't
0880: 77 6f 27 2c 20 20 20 34 29 3b 0a 20 20 49 4e 53  wo',   4);.  INS
0890: 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55  ERT INTO t5 VALU
08a0: 45 53 28 33 2c 20 27 41 27 2c 20 27 74 68 72 65  ES(3, 'A', 'thre
08b0: 65 27 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54  e', 3);.  INSERT
08c0: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
08d0: 34 2c 20 27 42 27 2c 20 27 66 6f 75 72 27 2c 20  4, 'B', 'four', 
08e0: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
08f0: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 35 2c 20  TO t5 VALUES(5, 
0900: 27 41 27 2c 20 27 66 69 76 65 27 2c 20 20 31 29  'A', 'five',  1)
0910: 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73  ;.}..execsql_tes
0920: 74 20 33 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  t 3.1 {.  SELECT
0930: 20 61 2c 20 6e 74 68 5f 76 61 6c 75 65 28 63 2c   a, nth_value(c,
0940: 20 64 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20   d) OVER (ORDER 
0950: 42 59 20 62 29 20 46 52 4f 4d 20 74 35 0a 7d 0a  BY b) FROM t5.}.
0960: 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  .execsql_test 3.
0970: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 61 2c 20  2 {.  SELECT a, 
0980: 6e 74 68 5f 76 61 6c 75 65 28 63 2c 20 64 29 20  nth_value(c, d) 
0990: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
09a0: 42 59 20 62 20 4f 52 44 45 52 20 42 59 20 61 29  BY b ORDER BY a)
09b0: 20 46 52 4f 4d 20 74 35 0a 7d 0a 0a 65 78 65 63   FROM t5.}..exec
09c0: 73 71 6c 5f 74 65 73 74 20 33 2e 33 20 7b 0a 20  sql_test 3.3 {. 
09d0: 20 53 45 4c 45 43 54 20 61 2c 20 63 6f 75 6e 74   SELECT a, count
09e0: 28 2a 29 20 4f 56 45 52 20 61 62 63 2c 20 63 6f  (*) OVER abc, co
09f0: 75 6e 74 28 2a 29 20 4f 56 45 52 20 64 65 66 20  unt(*) OVER def 
0a00: 46 52 4f 4d 20 74 35 0a 20 20 57 49 4e 44 4f 57  FROM t5.  WINDOW
0a10: 20 61 62 63 20 41 53 20 28 4f 52 44 45 52 20 42   abc AS (ORDER B
0a20: 59 20 61 29 2c 20 0a 20 20 20 20 20 20 20 20 20  Y a), .         
0a30: 64 65 66 20 41 53 20 28 4f 52 44 45 52 20 42 59  def AS (ORDER BY
0a40: 20 61 20 44 45 53 43 29 0a 20 20 4f 52 44 45 52   a DESC).  ORDER
0a50: 20 42 59 20 61 3b 0a 7d 0a 0a 65 78 65 63 73 71   BY a;.}..execsq
0a60: 6c 5f 74 65 73 74 20 33 2e 34 20 7b 0a 20 20 53  l_test 3.4 {.  S
0a70: 45 4c 45 43 54 20 61 2c 20 6d 61 78 28 61 29 20  ELECT a, max(a) 
0a80: 46 49 4c 54 45 52 20 28 57 48 45 52 45 20 28 61  FILTER (WHERE (a
0a90: 25 32 29 3d 30 29 20 4f 56 45 52 20 77 20 46 52  %2)=0) OVER w FR
0aa0: 4f 4d 20 74 35 20 0a 20 20 57 49 4e 44 4f 57 20  OM t5 .  WINDOW 
0ab0: 77 20 41 53 20 28 4f 52 44 45 52 20 42 59 20 61  w AS (ORDER BY a
0ac0: 29 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73  ).}..execsql_tes
0ad0: 74 20 33 2e 35 2e 31 20 7b 0a 20 20 53 45 4c 45  t 3.5.1 {.  SELE
0ae0: 43 54 20 61 2c 20 6d 61 78 28 63 29 20 4f 56 45  CT a, max(c) OVE
0af0: 52 20 28 4f 52 44 45 52 20 42 59 20 61 20 52 4f  R (ORDER BY a RO
0b00: 57 53 20 42 45 54 57 45 45 4e 20 31 20 50 52 45  WS BETWEEN 1 PRE
0b10: 43 45 44 49 4e 47 20 41 4e 44 20 32 20 50 52 45  CEDING AND 2 PRE
0b20: 43 45 44 49 4e 47 29 0a 20 20 46 52 4f 4d 20 74  CEDING).  FROM t
0b30: 35 0a 7d 0a 65 78 65 63 73 71 6c 5f 74 65 73 74  5.}.execsql_test
0b40: 20 33 2e 35 2e 32 20 7b 0a 20 20 53 45 4c 45 43   3.5.2 {.  SELEC
0b50: 54 20 61 2c 20 6d 61 78 28 63 29 20 4f 56 45 52  T a, max(c) OVER
0b60: 20 28 4f 52 44 45 52 20 42 59 20 61 20 52 4f 57   (ORDER BY a ROW
0b70: 53 20 42 45 54 57 45 45 4e 20 31 20 50 52 45 43  S BETWEEN 1 PREC
0b80: 45 44 49 4e 47 20 41 4e 44 20 31 20 50 52 45 43  EDING AND 1 PREC
0b90: 45 44 49 4e 47 29 0a 20 20 46 52 4f 4d 20 74 35  EDING).  FROM t5
0ba0: 0a 7d 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20  .}.execsql_test 
0bb0: 33 2e 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  3.5.3 {.  SELECT
0bc0: 20 61 2c 20 6d 61 78 28 63 29 20 4f 56 45 52 20   a, max(c) OVER 
0bd0: 28 4f 52 44 45 52 20 42 59 20 61 20 52 4f 57 53  (ORDER BY a ROWS
0be0: 20 42 45 54 57 45 45 4e 20 30 20 50 52 45 43 45   BETWEEN 0 PRECE
0bf0: 44 49 4e 47 20 41 4e 44 20 30 20 50 52 45 43 45  DING AND 0 PRECE
0c00: 44 49 4e 47 29 0a 20 20 46 52 4f 4d 20 74 35 0a  DING).  FROM t5.
0c10: 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20  }..execsql_test 
0c20: 33 2e 36 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54  3.6.1 {.  SELECT
0c30: 20 61 2c 20 6d 61 78 28 63 29 20 4f 56 45 52 20   a, max(c) OVER 
0c40: 28 4f 52 44 45 52 20 42 59 20 61 20 52 4f 57 53  (ORDER BY a ROWS
0c50: 20 42 45 54 57 45 45 4e 20 32 20 46 4f 4c 4c 4f   BETWEEN 2 FOLLO
0c60: 57 49 4e 47 20 41 4e 44 20 31 20 46 4f 4c 4c 4f  WING AND 1 FOLLO
0c70: 57 49 4e 47 29 0a 20 20 46 52 4f 4d 20 74 35 0a  WING).  FROM t5.
0c80: 7d 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33  }.execsql_test 3
0c90: 2e 36 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20  .6.2 {.  SELECT 
0ca0: 61 2c 20 6d 61 78 28 63 29 20 4f 56 45 52 20 28  a, max(c) OVER (
0cb0: 4f 52 44 45 52 20 42 59 20 61 20 52 4f 57 53 20  ORDER BY a ROWS 
0cc0: 42 45 54 57 45 45 4e 20 31 20 46 4f 4c 4c 4f 57  BETWEEN 1 FOLLOW
0cd0: 49 4e 47 20 41 4e 44 20 31 20 46 4f 4c 4c 4f 57  ING AND 1 FOLLOW
0ce0: 49 4e 47 29 0a 20 20 46 52 4f 4d 20 74 35 0a 7d  ING).  FROM t5.}
0cf0: 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  .execsql_test 3.
0d00: 36 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 61  6.3 {.  SELECT a
0d10: 2c 20 6d 61 78 28 63 29 20 4f 56 45 52 20 28 4f  , max(c) OVER (O
0d20: 52 44 45 52 20 42 59 20 61 20 52 4f 57 53 20 42  RDER BY a ROWS B
0d30: 45 54 57 45 45 4e 20 30 20 46 4f 4c 4c 4f 57 49  ETWEEN 0 FOLLOWI
0d40: 4e 47 20 41 4e 44 20 30 20 46 4f 4c 4c 4f 57 49  NG AND 0 FOLLOWI
0d50: 4e 47 29 0a 20 20 46 52 4f 4d 20 74 35 0a 7d 0a  NG).  FROM t5.}.
0d60: 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 65 78 65  .==========..exe
0d70: 63 73 71 6c 5f 74 65 73 74 20 34 2e 30 20 7b 0a  csql_test 4.0 {.
0d80: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
0d90: 45 58 49 53 54 53 20 74 74 74 3b 0a 20 20 43 52  EXISTS ttt;.  CR
0da0: 45 41 54 45 20 54 41 42 4c 45 20 74 74 74 28 61  EATE TABLE ttt(a
0db0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0dc0: 20 4b 45 59 2c 20 62 20 49 4e 54 45 47 45 52 2c   KEY, b INTEGER,
0dd0: 20 63 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 49   c INTEGER);.  I
0de0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 74 74 20 56  NSERT INTO ttt V
0df0: 41 4c 55 45 53 28 31 2c 20 31 2c 20 31 29 3b 0a  ALUES(1, 1, 1);.
0e00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 74    INSERT INTO tt
0e10: 74 20 56 41 4c 55 45 53 28 32 2c 20 32 2c 20 32  t VALUES(2, 2, 2
0e20: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0e30: 20 74 74 74 20 56 41 4c 55 45 53 28 33 2c 20 33   ttt VALUES(3, 3
0e40: 2c 20 33 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  , 3);..  INSERT 
0e50: 49 4e 54 4f 20 74 74 74 20 56 41 4c 55 45 53 28  INTO ttt VALUES(
0e60: 34 2c 20 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45  4, 1, 2);.  INSE
0e70: 52 54 20 49 4e 54 4f 20 74 74 74 20 56 41 4c 55  RT INTO ttt VALU
0e80: 45 53 28 35 2c 20 32 2c 20 33 29 3b 0a 20 20 49  ES(5, 2, 3);.  I
0e90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 74 74 20 56  NSERT INTO ttt V
0ea0: 41 4c 55 45 53 28 36 2c 20 33 2c 20 34 29 3b 0a  ALUES(6, 3, 4);.
0eb0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0ec0: 74 74 20 56 41 4c 55 45 53 28 37 2c 20 31 2c 20  tt VALUES(7, 1, 
0ed0: 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  3);.  INSERT INT
0ee0: 4f 20 74 74 74 20 56 41 4c 55 45 53 28 38 2c 20  O ttt VALUES(8, 
0ef0: 32 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  2, 4);.  INSERT 
0f00: 49 4e 54 4f 20 74 74 74 20 56 41 4c 55 45 53 28  INTO ttt VALUES(
0f10: 39 2c 20 33 2c 20 35 29 3b 0a 7d 0a 0a 65 78 65  9, 3, 5);.}..exe
0f20: 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 20 7b 0a  csql_test 4.1 {.
0f30: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 63 29 2c    SELECT max(c),
0f40: 20 6d 61 78 28 62 29 20 4f 56 45 52 20 28 4f 52   max(b) OVER (OR
0f50: 44 45 52 20 42 59 20 62 29 20 46 52 4f 4d 20 74  DER BY b) FROM t
0f60: 74 74 20 47 52 4f 55 50 20 42 59 20 62 3b 0a 7d  tt GROUP BY b;.}
0f70: 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  ..execsql_test 4
0f80: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6d 61  .2 {.  SELECT ma
0f90: 78 28 62 29 20 4f 56 45 52 20 28 4f 52 44 45 52  x(b) OVER (ORDER
0fa0: 20 42 59 20 6d 61 78 28 63 29 29 20 46 52 4f 4d   BY max(c)) FROM
0fb0: 20 74 74 74 20 47 52 4f 55 50 20 42 59 20 62 3b   ttt GROUP BY b;
0fc0: 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73 74  .}..execsql_test
0fd0: 20 34 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20   4.3 {.  SELECT 
0fe0: 61 62 73 28 6d 61 78 28 62 29 20 4f 56 45 52 20  abs(max(b) OVER 
0ff0: 28 4f 52 44 45 52 20 42 59 20 62 29 29 20 46 52  (ORDER BY b)) FR
1000: 4f 4d 20 74 74 74 20 47 52 4f 55 50 20 42 59 20  OM ttt GROUP BY 
1010: 62 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65  b;.}..execsql_te
1020: 73 74 20 34 2e 34 20 7b 0a 20 20 53 45 4c 45 43  st 4.4 {.  SELEC
1030: 54 20 73 75 6d 28 62 29 20 4f 56 45 52 20 28 0a  T sum(b) OVER (.
1040: 20 20 20 20 4f 52 44 45 52 20 42 59 20 61 20 52      ORDER BY a R
1050: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52  ANGE BETWEEN CUR
1060: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
1070: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
1080: 0a 20 20 29 20 46 52 4f 4d 20 74 74 74 3b 0a 7d  .  ) FROM ttt;.}
1090: 0a 0a 73 65 74 20 6c 50 61 72 74 20 20 5b 6c 69  ..set lPart  [li
10a0: 73 74 20 22 50 41 52 54 49 54 49 4f 4e 20 42 59  st "PARTITION BY
10b0: 20 62 22 20 22 50 41 52 54 49 54 49 4f 4e 20 42   b" "PARTITION B
10c0: 59 20 62 2c 20 61 22 20 22 22 20 22 50 41 52 54  Y b, a" "" "PART
10d0: 49 54 49 4f 4e 20 42 59 20 61 22 5d 0a 73 65 74  ITION BY a"].set
10e0: 20 6c 4f 72 64 65 72 20 5b 6c 69 73 74 20 22 4f   lOrder [list "O
10f0: 52 44 45 52 20 42 59 20 61 22 20 22 4f 52 44 45  RDER BY a" "ORDE
1100: 52 20 42 59 20 61 20 44 45 53 43 22 20 22 22 20  R BY a DESC" "" 
1110: 22 4f 52 44 45 52 20 42 59 20 62 2c 20 61 22 5d  "ORDER BY b, a"]
1120: 0a 73 65 74 20 6c 52 61 6e 67 65 20 7b 0a 20 20  .set lRange {.  
1130: 20 20 22 52 41 4e 47 45 20 42 45 54 57 45 45 4e    "RANGE BETWEEN
1140: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1150: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1160: 20 52 4f 57 22 0a 20 20 20 20 22 52 41 4e 47 45   ROW".    "RANGE
1170: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
1180: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
1190: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
11a0: 57 49 4e 47 22 0a 20 20 20 20 22 52 41 4e 47 45  WING".    "RANGE
11b0: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
11c0: 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54   ROW AND CURRENT
11d0: 20 52 4f 57 22 0a 20 20 20 20 22 52 41 4e 47 45   ROW".    "RANGE
11e0: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
11f0: 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44   ROW AND UNBOUND
1200: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 0a 7d 0a  ED FOLLOWING".}.
1210: 0a 73 65 74 20 6c 52 6f 77 73 20 7b 0a 20 20 20  .set lRows {.   
1220: 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 33   "ROWS BETWEEN 3
1230: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 31   PRECEDING AND 1
1240: 20 46 4f 4c 4c 4f 57 49 4e 47 22 0a 20 20 20 20   FOLLOWING".    
1250: 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 33 20  "ROWS BETWEEN 3 
1260: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 32 20  PRECEDING AND 2 
1270: 46 4f 4c 4c 4f 57 49 4e 47 22 0a 20 20 20 20 22  FOLLOWING".    "
1280: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 31 20 50  ROWS BETWEEN 1 P
1290: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 31 20 50  RECEDING AND 1 P
12a0: 52 45 43 45 44 49 4e 47 22 0a 20 20 20 20 22 52  RECEDING".    "R
12b0: 4f 57 53 20 42 45 54 57 45 45 4e 20 30 20 50 52  OWS BETWEEN 0 PR
12c0: 45 43 45 44 49 4e 47 20 41 4e 44 20 31 20 50 52  ECEDING AND 1 PR
12d0: 45 43 45 44 49 4e 47 22 0a 20 20 20 20 22 52 4f  ECEDING".    "RO
12e0: 57 53 20 42 45 54 57 45 45 4e 20 31 20 46 4f 4c  WS BETWEEN 1 FOL
12f0: 4c 4f 57 49 4e 47 20 41 4e 44 20 35 30 30 20 46  LOWING AND 500 F
1300: 4f 4c 4c 4f 57 49 4e 47 22 0a 7d 0a 0a 73 65 74  OLLOWING".}..set
1310: 20 74 6e 20 31 0a 73 65 74 20 53 51 4c 20 7b 0a   tn 1.set SQL {.
1320: 20 20 53 45 4c 45 43 54 20 6d 61 78 28 63 29 20    SELECT max(c) 
1330: 4f 56 45 52 20 28 24 70 31 20 24 6f 31 20 24 72  OVER ($p1 $o1 $r
1340: 31 29 2c 20 0a 20 20 6d 69 6e 28 63 29 20 4f 56  1), .  min(c) OV
1350: 45 52 20 28 24 70 32 20 24 6f 32 20 24 72 32 29  ER ($p2 $o2 $r2)
1360: 0a 20 20 46 52 4f 4d 20 74 74 74 20 4f 52 44 45  .  FROM ttt ORDE
1370: 52 20 42 59 20 61 0a 7d 0a 73 65 74 20 53 51 4c  R BY a.}.set SQL
1380: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 73 75 6d  2 {.  SELECT sum
1390: 28 63 29 20 4f 56 45 52 20 28 24 70 31 20 24 6f  (c) OVER ($p1 $o
13a0: 31 20 24 72 31 29 2c 20 0a 20 20 20 20 20 20 20  1 $r1), .       
13b0: 20 20 73 75 6d 28 63 29 20 4f 56 45 52 20 28 24    sum(c) OVER ($
13c0: 70 32 20 24 6f 32 20 24 72 32 29 0a 20 20 46 52  p2 $o2 $r2).  FR
13d0: 4f 4d 20 74 74 74 20 4f 52 44 45 52 20 42 59 20  OM ttt ORDER BY 
13e0: 61 0a 7d 0a 0a 73 65 74 20 6f 31 20 5b 6c 69 6e  a.}..set o1 [lin
13f0: 64 65 78 20 24 6c 4f 72 64 65 72 20 30 5d 0a 73  dex $lOrder 0].s
1400: 65 74 20 6f 32 20 5b 6c 69 6e 64 65 78 20 24 6c  et o2 [lindex $l
1410: 4f 72 64 65 72 20 30 5d 0a 73 65 74 20 72 31 20  Order 0].set r1 
1420: 5b 6c 69 6e 64 65 78 20 24 6c 52 61 6e 67 65 20  [lindex $lRange 
1430: 30 5d 0a 73 65 74 20 72 32 20 5b 6c 69 6e 64 65  0].set r2 [linde
1440: 78 20 24 6c 52 61 6e 67 65 20 30 5d 0a 66 6f 72  x $lRange 0].for
1450: 65 61 63 68 20 70 31 20 24 6c 50 61 72 74 20 7b  each p1 $lPart {
1460: 20 66 6f 72 65 61 63 68 20 70 32 20 24 6c 50 61   foreach p2 $lPa
1470: 72 74 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 5f  rt { .  execsql_
1480: 74 65 73 74 20 34 2e 35 2e 24 74 6e 2e 31 20 5b  test 4.5.$tn.1 [
1490: 73 75 62 73 74 20 24 53 51 4c 5d 0a 20 20 65 78  subst $SQL].  ex
14a0: 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 35 2e 24  ecsql_test 4.5.$
14b0: 74 6e 2e 32 20 5b 73 75 62 73 74 20 24 53 51 4c  tn.2 [subst $SQL
14c0: 32 5d 0a 20 20 69 6e 63 72 20 74 6e 0a 7d 7d 0a  2].  incr tn.}}.
14d0: 0a 73 65 74 20 6f 31 20 5b 6c 69 6e 64 65 78 20  .set o1 [lindex 
14e0: 24 6c 4f 72 64 65 72 20 30 5d 0a 73 65 74 20 6f  $lOrder 0].set o
14f0: 32 20 5b 6c 69 6e 64 65 78 20 24 6c 4f 72 64 65  2 [lindex $lOrde
1500: 72 20 30 5d 0a 73 65 74 20 70 31 20 5b 6c 69 6e  r 0].set p1 [lin
1510: 64 65 78 20 24 6c 50 61 72 74 20 30 5d 0a 73 65  dex $lPart 0].se
1520: 74 20 70 32 20 5b 6c 69 6e 64 65 78 20 24 6c 50  t p2 [lindex $lP
1530: 61 72 74 20 30 5d 0a 66 6f 72 65 61 63 68 20 72  art 0].foreach r
1540: 31 20 24 6c 52 61 6e 67 65 20 7b 20 66 6f 72 65  1 $lRange { fore
1550: 61 63 68 20 72 32 20 24 6c 52 61 6e 67 65 20 7b  ach r2 $lRange {
1560: 20 0a 20 20 65 78 65 63 73 71 6c 5f 74 65 73 74   .  execsql_test
1570: 20 34 2e 35 2e 24 74 6e 2e 31 20 5b 73 75 62 73   4.5.$tn.1 [subs
1580: 74 20 24 53 51 4c 5d 0a 20 20 65 78 65 63 73 71  t $SQL].  execsq
1590: 6c 5f 74 65 73 74 20 34 2e 35 2e 24 74 6e 2e 32  l_test 4.5.$tn.2
15a0: 20 5b 73 75 62 73 74 20 24 53 51 4c 32 5d 0a 20   [subst $SQL2]. 
15b0: 20 69 6e 63 72 20 74 6e 0a 7d 7d 0a 66 6f 72 65   incr tn.}}.fore
15c0: 61 63 68 20 72 31 20 24 6c 52 6f 77 73 20 7b 20  ach r1 $lRows { 
15d0: 66 6f 72 65 61 63 68 20 72 32 20 24 6c 52 6f 77  foreach r2 $lRow
15e0: 73 20 7b 20 0a 20 20 65 78 65 63 73 71 6c 5f 74  s { .  execsql_t
15f0: 65 73 74 20 34 2e 35 2e 24 74 6e 2e 31 20 5b 73  est 4.5.$tn.1 [s
1600: 75 62 73 74 20 24 53 51 4c 5d 0a 20 20 65 78 65  ubst $SQL].  exe
1610: 63 73 71 6c 5f 74 65 73 74 20 34 2e 35 2e 24 74  csql_test 4.5.$t
1620: 6e 2e 32 20 5b 73 75 62 73 74 20 24 53 51 4c 32  n.2 [subst $SQL2
1630: 5d 0a 20 20 69 6e 63 72 20 74 6e 0a 7d 7d 0a 0a  ].  incr tn.}}..
1640: 73 65 74 20 72 31 20 5b 6c 69 6e 64 65 78 20 24  set r1 [lindex $
1650: 6c 52 61 6e 67 65 20 30 5d 0a 73 65 74 20 72 32  lRange 0].set r2
1660: 20 5b 6c 69 6e 64 65 78 20 24 6c 52 61 6e 67 65   [lindex $lRange
1670: 20 30 5d 0a 73 65 74 20 70 31 20 5b 6c 69 6e 64   0].set p1 [lind
1680: 65 78 20 24 6c 50 61 72 74 20 30 5d 0a 73 65 74  ex $lPart 0].set
1690: 20 70 32 20 5b 6c 69 6e 64 65 78 20 24 6c 50 61   p2 [lindex $lPa
16a0: 72 74 20 30 5d 0a 66 6f 72 65 61 63 68 20 6f 31  rt 0].foreach o1
16b0: 20 24 6c 4f 72 64 65 72 20 7b 20 66 6f 72 65 61   $lOrder { forea
16c0: 63 68 20 6f 32 20 24 6c 4f 72 64 65 72 20 7b 20  ch o2 $lOrder { 
16d0: 0a 20 20 65 78 65 63 73 71 6c 5f 74 65 73 74 20  .  execsql_test 
16e0: 34 2e 35 2e 24 74 6e 2e 31 20 5b 73 75 62 73 74  4.5.$tn.1 [subst
16f0: 20 24 53 51 4c 5d 0a 20 20 65 78 65 63 73 71 6c   $SQL].  execsql
1700: 5f 74 65 73 74 20 34 2e 35 2e 24 74 6e 2e 32 20  _test 4.5.$tn.2 
1710: 5b 73 75 62 73 74 20 24 53 51 4c 32 5d 0a 20 20  [subst $SQL2].  
1720: 69 6e 63 72 20 74 6e 0a 7d 7d 0a 0a 3d 3d 3d 3d  incr tn.}}..====
1730: 3d 3d 3d 3d 3d 3d 0a 0a 65 78 65 63 73 71 6c 5f  ======..execsql_
1740: 74 65 73 74 20 37 2e 30 20 7b 0a 20 20 44 52 4f  test 7.0 {.  DRO
1750: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
1760: 53 20 74 31 3b 0a 20 20 43 52 45 41 54 45 20 54  S t1;.  CREATE T
1770: 41 42 4c 45 20 74 31 28 78 20 49 4e 54 45 47 45  ABLE t1(x INTEGE
1780: 52 2c 20 79 20 49 4e 54 45 47 45 52 29 3b 0a 20  R, y INTEGER);. 
1790: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
17a0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
17b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
17c0: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 49  ALUES(3, 4);.  I
17d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
17e0: 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 49 4e  LUES(5, 6);.  IN
17f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1800: 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 49 4e 53  UES(7, 8);.  INS
1810: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1820: 45 53 28 39 2c 20 31 30 29 3b 0a 7d 0a 0a 65 78  ES(9, 10);.}..ex
1830: 65 63 73 71 6c 5f 74 65 73 74 20 37 2e 31 20 7b  ecsql_test 7.1 {
1840: 0a 20 20 53 45 4c 45 43 54 20 6c 65 61 64 28 79  .  SELECT lead(y
1850: 29 20 4f 56 45 52 20 77 69 6e 20 46 52 4f 4d 20  ) OVER win FROM 
1860: 74 31 0a 20 20 57 49 4e 44 4f 57 20 77 69 6e 20  t1.  WINDOW win 
1870: 41 53 20 28 4f 52 44 45 52 20 42 59 20 78 29 0a  AS (ORDER BY x).
1880: 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73 74 20  }..execsql_test 
1890: 37 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6c  7.2 {.  SELECT l
18a0: 65 61 64 28 79 2c 20 32 29 20 4f 56 45 52 20 77  ead(y, 2) OVER w
18b0: 69 6e 20 46 52 4f 4d 20 74 31 0a 20 20 57 49 4e  in FROM t1.  WIN
18c0: 44 4f 57 20 77 69 6e 20 41 53 20 28 4f 52 44 45  DOW win AS (ORDE
18d0: 52 20 42 59 20 78 29 0a 7d 0a 0a 65 78 65 63 73  R BY x).}..execs
18e0: 71 6c 5f 74 65 73 74 20 37 2e 33 20 7b 0a 20 20  ql_test 7.3 {.  
18f0: 53 45 4c 45 43 54 20 6c 65 61 64 28 79 2c 20 33  SELECT lead(y, 3
1900: 2c 20 2d 31 29 20 4f 56 45 52 20 77 69 6e 20 46  , -1) OVER win F
1910: 52 4f 4d 20 74 31 0a 20 20 57 49 4e 44 4f 57 20  ROM t1.  WINDOW 
1920: 77 69 6e 20 41 53 20 28 4f 52 44 45 52 20 42 59  win AS (ORDER BY
1930: 20 78 29 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74   x).}..execsql_t
1940: 65 73 74 20 37 2e 34 20 7b 0a 20 20 53 45 4c 45  est 7.4 {.  SELE
1950: 43 54 20 0a 20 20 20 20 6c 65 61 64 28 79 29 20  CT .    lead(y) 
1960: 4f 56 45 52 20 77 69 6e 2c 20 6c 65 61 64 28 79  OVER win, lead(y
1970: 29 20 4f 56 45 52 20 77 69 6e 0a 20 20 46 52 4f  ) OVER win.  FRO
1980: 4d 20 74 31 0a 20 20 57 49 4e 44 4f 57 20 77 69  M t1.  WINDOW wi
1990: 6e 20 41 53 20 28 4f 52 44 45 52 20 42 59 20 78  n AS (ORDER BY x
19a0: 29 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73  ).}..execsql_tes
19b0: 74 20 37 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54  t 7.5 {.  SELECT
19c0: 20 0a 20 20 20 20 6c 65 61 64 28 79 29 20 4f 56   .    lead(y) OV
19d0: 45 52 20 77 69 6e 2c 20 0a 20 20 20 20 6c 65 61  ER win, .    lea
19e0: 64 28 79 2c 20 32 29 20 4f 56 45 52 20 77 69 6e  d(y, 2) OVER win
19f0: 2c 20 0a 20 20 20 20 6c 65 61 64 28 79 2c 20 33  , .    lead(y, 3
1a00: 2c 20 2d 31 29 20 4f 56 45 52 20 77 69 6e 0a 20  , -1) OVER win. 
1a10: 20 46 52 4f 4d 20 74 31 0a 20 20 57 49 4e 44 4f   FROM t1.  WINDO
1a20: 57 20 77 69 6e 20 41 53 20 28 4f 52 44 45 52 20  W win AS (ORDER 
1a30: 42 59 20 78 29 0a 7d 0a 0a 3d 3d 3d 3d 3d 3d 3d  BY x).}..=======
1a40: 3d 3d 3d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73  ===..execsql_tes
1a50: 74 20 38 2e 30 20 7b 0a 20 20 44 52 4f 50 20 54  t 8.0 {.  DROP T
1a60: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
1a70: 31 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  1;.  CREATE TABL
1a80: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 2c 20  E t1(a INTEGER, 
1a90: 62 20 49 4e 54 45 47 45 52 2c 20 63 20 49 4e 54  b INTEGER, c INT
1aa0: 45 47 45 52 2c 20 64 20 49 4e 54 45 47 45 52 29  EGER, d INTEGER)
1ab0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1ac0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  t1 VALUES(1, 2, 
1ad0: 33 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52 54 20  3, 4);.  INSERT 
1ae0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
1af0: 2c 20 36 2c 20 37 2c 20 38 29 3b 0a 20 20 49 4e  , 6, 7, 8);.  IN
1b00: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1b10: 55 45 53 28 39 2c 20 31 30 2c 20 31 31 2c 20 31  UES(9, 10, 11, 1
1b20: 32 29 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74  2);.}..execsql_t
1b30: 65 73 74 20 38 2e 31 20 7b 0a 20 20 53 45 4c 45  est 8.1 {.  SELE
1b40: 43 54 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20  CT row_number() 
1b50: 4f 56 45 52 20 77 69 6e 2c 0a 20 20 20 20 20 20  OVER win,.      
1b60: 20 20 20 6e 74 68 5f 76 61 6c 75 65 28 64 2c 32     nth_value(d,2
1b70: 29 20 4f 56 45 52 20 77 69 6e 2c 0a 20 20 20 20  ) OVER win,.    
1b80: 20 20 20 20 20 6c 65 61 64 28 64 29 20 4f 56 45       lead(d) OVE
1b90: 52 20 77 69 6e 0a 20 20 46 52 4f 4d 20 74 31 0a  R win.  FROM t1.
1ba0: 20 20 57 49 4e 44 4f 57 20 77 69 6e 20 41 53 20    WINDOW win AS 
1bb0: 28 4f 52 44 45 52 20 42 59 20 61 29 0a 7d 0a 0a  (ORDER BY a).}..
1bc0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 38 2e 32  execsql_test 8.2
1bd0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f   {.    SELECT ro
1be0: 77 5f 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20  w_number() OVER 
1bf0: 77 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  win,.           
1c00: 72 61 6e 6b 28 29 20 4f 56 45 52 20 77 69 6e 2c  rank() OVER win,
1c10: 0a 20 20 20 20 20 20 20 20 20 20 20 64 65 6e 73  .           dens
1c20: 65 5f 72 61 6e 6b 28 29 20 4f 56 45 52 20 77 69  e_rank() OVER wi
1c30: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6e 74  n,.           nt
1c40: 69 6c 65 28 32 29 20 4f 56 45 52 20 77 69 6e 2c  ile(2) OVER win,
1c50: 0a 20 20 20 20 20 20 20 20 20 20 20 66 69 72 73  .           firs
1c60: 74 5f 76 61 6c 75 65 28 64 29 20 4f 56 45 52 20  t_value(d) OVER 
1c70: 77 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  win,.           
1c80: 6c 61 73 74 5f 76 61 6c 75 65 28 64 29 20 4f 56  last_value(d) OV
1c90: 45 52 20 77 69 6e 2c 0a 20 20 20 20 20 20 20 20  ER win,.        
1ca0: 20 20 20 6e 74 68 5f 76 61 6c 75 65 28 64 2c 32     nth_value(d,2
1cb0: 29 20 4f 56 45 52 20 77 69 6e 2c 0a 20 20 20 20  ) OVER win,.    
1cc0: 20 20 20 20 20 20 20 6c 65 61 64 28 64 29 20 4f         lead(d) O
1cd0: 56 45 52 20 77 69 6e 2c 0a 20 20 20 20 20 20 20  VER win,.       
1ce0: 20 20 20 20 6c 61 67 28 64 29 20 4f 56 45 52 20      lag(d) OVER 
1cf0: 77 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  win,.           
1d00: 6d 61 78 28 64 29 20 4f 56 45 52 20 77 69 6e 2c  max(d) OVER win,
1d10: 0a 20 20 20 20 20 20 20 20 20 20 20 6d 69 6e 28  .           min(
1d20: 64 29 20 4f 56 45 52 20 77 69 6e 0a 20 20 20 20  d) OVER win.    
1d30: 46 52 4f 4d 20 74 31 0a 20 20 20 20 57 49 4e 44  FROM t1.    WIND
1d40: 4f 57 20 77 69 6e 20 41 53 20 28 4f 52 44 45 52  OW win AS (ORDER
1d50: 20 42 59 20 61 29 0a 7d 0a 0a 3d 3d 3d 3d 3d 3d   BY a).}..======
1d60: 3d 3d 3d 3d 0a 0a 65 78 65 63 73 71 6c 5f 74 65  ====..execsql_te
1d70: 73 74 20 39 2e 30 20 7b 0a 20 20 44 52 4f 50 20  st 9.0 {.  DROP 
1d80: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
1d90: 74 32 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  t2;.  CREATE TAB
1da0: 4c 45 20 74 32 28 78 20 49 4e 54 45 47 45 52 29  LE t2(x INTEGER)
1db0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1dc0: 74 32 20 56 41 4c 55 45 53 28 31 29 2c 20 28 31  t2 VALUES(1), (1
1dd0: 29 2c 20 28 31 29 2c 20 28 34 29 2c 20 28 34 29  ), (1), (4), (4)
1de0: 2c 20 28 36 29 2c 20 28 37 29 3b 0a 7d 0a 0a 65  , (6), (7);.}..e
1df0: 78 65 63 73 71 6c 5f 74 65 73 74 20 39 2e 31 20  xecsql_test 9.1 
1e00: 7b 0a 20 20 53 45 4c 45 43 54 20 72 61 6e 6b 28  {.  SELECT rank(
1e10: 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d 20 74  ) OVER () FROM t
1e20: 32 0a 7d 0a 65 78 65 63 73 71 6c 5f 74 65 73 74  2.}.execsql_test
1e30: 20 39 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20   9.2 {.  SELECT 
1e40: 64 65 6e 73 65 5f 72 61 6e 6b 28 29 20 4f 56 45  dense_rank() OVE
1e50: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
1e60: 78 29 20 46 52 4f 4d 20 74 32 0a 7d 0a 65 78 65  x) FROM t2.}.exe
1e70: 63 73 71 6c 5f 66 6c 6f 61 74 5f 74 65 73 74 20  csql_float_test 
1e80: 39 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 78  9.3 {.  SELECT x
1e90: 2c 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28 29  , percent_rank()
1ea0: 20 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e   OVER (PARTITION
1eb0: 20 42 59 20 78 20 4f 52 44 45 52 20 42 59 20 78   BY x ORDER BY x
1ec0: 29 20 46 52 4f 4d 20 74 32 0a 7d 0a 0a 65 78 65  ) FROM t2.}..exe
1ed0: 63 73 71 6c 5f 74 65 73 74 20 39 2e 34 20 7b 0a  csql_test 9.4 {.
1ee0: 20 20 53 45 4c 45 43 54 20 78 2c 20 72 61 6e 6b    SELECT x, rank
1ef0: 28 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42  () OVER (ORDER B
1f00: 59 20 78 29 20 46 52 4f 4d 20 74 32 20 4f 52 44  Y x) FROM t2 ORD
1f10: 45 52 20 42 59 20 31 2c 32 0a 7d 0a 0a 65 78 65  ER BY 1,2.}..exe
1f20: 63 73 71 6c 5f 74 65 73 74 20 39 2e 35 20 7b 0a  csql_test 9.5 {.
1f30: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
1f40: 54 20 78 2c 20 72 61 6e 6b 28 29 20 4f 56 45 52  T x, rank() OVER
1f50: 20 28 4f 52 44 45 52 20 42 59 20 78 29 20 46 52   (ORDER BY x) FR
1f60: 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20 31  OM t2 ORDER BY 1
1f70: 2c 32 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 66 6c  ,2.}..execsql_fl
1f80: 6f 61 74 5f 74 65 73 74 20 39 2e 36 20 7b 0a 20  oat_test 9.6 {. 
1f90: 20 53 45 4c 45 43 54 20 70 65 72 63 65 6e 74 5f   SELECT percent_
1fa0: 72 61 6e 6b 28 29 20 4f 56 45 52 20 28 29 20 46  rank() OVER () F
1fb0: 52 4f 4d 20 74 31 0a 7d 0a 0a 65 78 65 63 73 71  ROM t1.}..execsq
1fc0: 6c 5f 66 6c 6f 61 74 5f 74 65 73 74 20 39 2e 37  l_float_test 9.7
1fd0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 75 6d 65   {.  SELECT cume
1fe0: 5f 64 69 73 74 28 29 20 4f 56 45 52 20 28 29 20  _dist() OVER () 
1ff0: 46 52 4f 4d 20 74 31 0a 7d 0a 0a 65 78 65 63 73  FROM t1.}..execs
2000: 71 6c 5f 74 65 73 74 20 31 30 2e 30 20 7b 0a 20  ql_test 10.0 {. 
2010: 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45   DROP TABLE IF E
2020: 58 49 53 54 53 20 74 37 3b 0a 20 20 43 52 45 41  XISTS t7;.  CREA
2030: 54 45 20 54 41 42 4c 45 20 74 37 28 69 64 20 49  TE TABLE t7(id I
2040: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2050: 45 59 2c 20 61 20 49 4e 54 45 47 45 52 2c 20 62  EY, a INTEGER, b
2060: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 49 4e 53   INTEGER);.  INS
2070: 45 52 54 20 49 4e 54 4f 20 74 37 28 69 64 2c 20  ERT INTO t7(id, 
2080: 61 2c 20 62 29 20 56 41 4c 55 45 53 0a 20 20 20  a, b) VALUES.   
2090: 20 28 31 2c 20 31 2c 20 32 29 2c 20 28 32 2c 20   (1, 1, 2), (2, 
20a0: 31 2c 20 4e 55 4c 4c 29 2c 20 28 33 2c 20 31 2c  1, NULL), (3, 1,
20b0: 20 34 29 2c 0a 20 20 20 20 28 34 2c 20 33 2c 20   4),.    (4, 3, 
20c0: 4e 55 4c 4c 29 2c 20 28 35 2c 20 33 2c 20 38 29  NULL), (5, 3, 8)
20d0: 2c 20 28 36 2c 20 33 2c 20 31 29 3b 0a 7d 0a 65  , (6, 3, 1);.}.e
20e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30 2e 31  xecsql_test 10.1
20f0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 64 2c 20   {.  SELECT id, 
2100: 6d 69 6e 28 62 29 20 4f 56 45 52 20 28 50 41 52  min(b) OVER (PAR
2110: 54 49 54 49 4f 4e 20 42 59 20 61 20 4f 52 44 45  TITION BY a ORDE
2120: 52 20 42 59 20 69 64 29 20 46 52 4f 4d 20 74 37  R BY id) FROM t7
2130: 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73  ;.}..execsql_tes
2140: 74 20 31 30 2e 32 20 7b 0a 20 20 53 45 4c 45 43  t 10.2 {.  SELEC
2150: 54 20 69 64 2c 20 6c 65 61 64 28 62 2c 20 2d 31  T id, lead(b, -1
2160: 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f  ) OVER (PARTITIO
2170: 4e 20 42 59 20 61 20 4f 52 44 45 52 20 42 59 20  N BY a ORDER BY 
2180: 69 64 29 20 46 52 4f 4d 20 74 37 3b 0a 7d 0a 65  id) FROM t7;.}.e
2190: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 30 2e 33  xecsql_test 10.3
21a0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 64 2c 20   {.  SELECT id, 
21b0: 6c 61 67 28 62 2c 20 2d 31 29 20 4f 56 45 52 20  lag(b, -1) OVER 
21c0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
21d0: 4f 52 44 45 52 20 42 59 20 69 64 29 20 46 52 4f  ORDER BY id) FRO
21e0: 4d 20 74 37 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c  M t7;.}..execsql
21f0: 5f 74 65 73 74 20 31 31 2e 30 20 7b 0a 20 20 44  _test 11.0 {.  D
2200: 52 4f 50 20 56 49 45 57 20 49 46 20 45 58 49 53  ROP VIEW IF EXIS
2210: 54 53 20 76 38 3b 0a 20 20 44 52 4f 50 20 54 41  TS v8;.  DROP TA
2220: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 38  BLE IF EXISTS t8
2230: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
2240: 20 74 38 28 74 20 49 4e 54 2c 20 74 6f 74 61 6c   t8(t INT, total
2250: 20 49 4e 54 29 3b 0a 20 20 49 4e 53 45 52 54 20   INT);.  INSERT 
2260: 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28 30  INTO t8 VALUES(0
2270: 2c 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  ,2);.  INSERT IN
2280: 54 4f 20 74 38 20 56 41 4c 55 45 53 28 35 2c 31  TO t8 VALUES(5,1
2290: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
22a0: 20 74 38 20 56 41 4c 55 45 53 28 31 30 2c 31 29   t8 VALUES(10,1)
22b0: 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c 5f 74 65 73  ;.}..execsql_tes
22c0: 74 20 31 31 2e 31 20 7b 0a 20 20 53 45 4c 45 43  t 11.1 {.  SELEC
22d0: 54 20 4e 54 49 4c 45 28 32 35 36 29 20 4f 56 45  T NTILE(256) OVE
22e0: 52 20 28 4f 52 44 45 52 20 42 59 20 74 6f 74 61  R (ORDER BY tota
22f0: 6c 29 20 2d 20 31 20 41 53 20 6e 74 20 46 52 4f  l) - 1 AS nt FRO
2300: 4d 20 74 38 3b 0a 7d 0a 0a 65 78 65 63 73 71 6c  M t8;.}..execsql
2310: 5f 74 65 73 74 20 31 31 2e 32 20 7b 0a 20 20 43  _test 11.2 {.  C
2320: 52 45 41 54 45 20 56 49 45 57 20 76 38 20 41 53  REATE VIEW v8 AS
2330: 20 53 45 4c 45 43 54 20 4e 54 49 4c 45 28 32 35   SELECT NTILE(25
2340: 36 29 20 4f 56 45 52 20 28 4f 52 44 45 52 20 42  6) OVER (ORDER B
2350: 59 20 74 6f 74 61 6c 29 20 2d 20 31 20 41 53 20  Y total) - 1 AS 
2360: 6e 74 20 46 52 4f 4d 20 74 38 3b 0a 7d 0a 0a 65  nt FROM t8;.}..e
2370: 78 65 63 73 71 6c 5f 74 65 73 74 20 31 31 2e 33  xecsql_test 11.3
2380: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
2390: 4f 4d 20 76 38 3b 0a 7d 0a 0a 65 78 65 63 73 71  OM v8;.}..execsq
23a0: 6c 5f 74 65 73 74 20 31 31 2e 34 20 7b 0a 20 20  l_test 11.4 {.  
23b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 0a  SELECT * FROM (.
23c0: 20 20 20 20 53 45 4c 45 43 54 20 4e 54 49 4c 45      SELECT NTILE
23d0: 28 32 35 36 29 20 4f 56 45 52 20 28 4f 52 44 45  (256) OVER (ORDE
23e0: 52 20 42 59 20 74 6f 74 61 6c 29 20 2d 20 31 20  R BY total) - 1 
23f0: 41 53 20 6e 74 20 46 52 4f 4d 20 74 38 0a 20 20  AS nt FROM t8.  
2400: 29 20 73 75 62 3b 0a 7d 0a 0a 65 78 65 63 73 71  ) sub;.}..execsq
2410: 6c 5f 74 65 73 74 20 31 32 2e 30 20 7b 0a 20 20  l_test 12.0 {.  
2420: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
2430: 49 53 54 53 20 74 32 3b 0a 20 20 43 52 45 41 54  ISTS t2;.  CREAT
2440: 45 20 54 41 42 4c 45 20 74 32 28 61 20 49 4e 54  E TABLE t2(a INT
2450: 45 47 45 52 29 3b 0a 20 20 49 4e 53 45 52 54 20  EGER);.  INSERT 
2460: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
2470: 29 2c 20 28 32 29 2c 20 28 33 29 3b 0a 7d 0a 0a  ), (2), (3);.}..
2480: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 32 2e  execsql_test 12.
2490: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 28 53 45  1 {.  SELECT (SE
24a0: 4c 45 43 54 20 6d 69 6e 28 61 29 20 4f 56 45 52  LECT min(a) OVER
24b0: 20 28 29 29 20 46 52 4f 4d 20 74 32 0a 7d 0a 0a   ()) FROM t2.}..
24c0: 65 78 65 63 73 71 6c 5f 66 6c 6f 61 74 5f 74 65  execsql_float_te
24d0: 73 74 20 31 32 2e 32 20 7b 0a 20 20 53 45 4c 45  st 12.2 {.  SELE
24e0: 43 54 20 28 53 45 4c 45 43 54 20 61 76 67 28 61  CT (SELECT avg(a
24f0: 29 29 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  )) FROM t2 ORDER
2500: 20 42 59 20 31 0a 7d 0a 0a 65 78 65 63 73 71 6c   BY 1.}..execsql
2510: 5f 66 6c 6f 61 74 5f 74 65 73 74 20 31 32 2e 33  _float_test 12.3
2520: 20 7b 0a 20 20 53 45 4c 45 43 54 20 0a 20 20 20   {.  SELECT .   
2530: 20 28 53 45 4c 45 43 54 20 61 76 67 28 61 29 20   (SELECT avg(a) 
2540: 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 6d 69 6e  UNION SELECT min
2550: 28 61 29 20 4f 56 45 52 20 28 29 29 20 0a 20 20  (a) OVER ()) .  
2560: 46 52 4f 4d 20 74 32 20 47 52 4f 55 50 20 42 59  FROM t2 GROUP BY
2570: 20 61 0a 20 20 4f 52 44 45 52 20 42 59 20 31 0a   a.  ORDER BY 1.
2580: 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a  }..finish_test..