/ Hex Artifact Content
Login

Artifact 0d5d4bcddd2dacc75eeb191435cdf6b202859ab4e00da60b49473ecf82b310da:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 7d 0a 73 74 61 74 69   (*p)++;.}.stati
16e0: 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65  c void row_numbe
16f0: 72 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  rValueFunc(sqlit
1700: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
1710: 29 7b 0a 20 20 69 36 34 20 2a 70 20 3d 20 28 69  ){.  i64 *p = (i
1720: 36 34 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  64*)sqlite3_aggr
1730: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1740: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1750: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
1760: 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 28 70  t_int64(pCtx, (p
1770: 20 3f 20 2a 70 20 3a 20 30 29 29 3b 0a 7d 0a 0a   ? *p : 0));.}..
1780: 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62  /*.** Context ob
1790: 6a 65 63 74 20 74 79 70 65 20 75 73 65 64 20 62  ject type used b
17a0: 79 20 72 61 6e 6b 28 29 2c 20 64 65 6e 73 65 5f  y rank(), dense_
17b0: 72 61 6e 6b 28 29 2c 20 70 65 72 63 65 6e 74 5f  rank(), percent_
17c0: 72 61 6e 6b 28 29 20 61 6e 64 0a 2a 2a 20 63 75  rank() and.** cu
17d0: 6d 65 5f 64 69 73 74 28 29 2e 0a 2a 2f 0a 73 74  me_dist()..*/.st
17e0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 7b  ruct CallCount {
17f0: 0a 20 20 69 36 34 20 6e 56 61 6c 75 65 3b 0a 20  .  i64 nValue;. 
1800: 20 69 36 34 20 6e 53 74 65 70 3b 0a 20 20 69 36   i64 nStep;.  i6
1810: 34 20 6e 54 6f 74 61 6c 3b 0a 7d 3b 0a 0a 2f 2a  4 nTotal;.};../*
1820: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1830: 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77  on of built-in w
1840: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 64  indow function d
1850: 65 6e 73 65 5f 72 61 6e 6b 28 29 2e 20 41 73 73  ense_rank(). Ass
1860: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  umes that.** the
1870: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
1880: 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a  s been set to:.*
1890: 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54  *.**   RANGE BET
18a0: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
18b0: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
18c0: 52 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61  RENT ROW .*/.sta
18d0: 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65 5f 72  tic void dense_r
18e0: 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20 20 73  ankStepFunc(.  s
18f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1900: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1910: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1920: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1930: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
1940: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
1950: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71  ct CallCount*)sq
1960: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
1970: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
1980: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
1990: 20 70 20 29 20 70 2d 3e 6e 53 74 65 70 20 3d 20   p ) p->nStep = 
19a0: 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  1;.}.static void
19b0: 20 64 65 6e 73 65 5f 72 61 6e 6b 56 61 6c 75 65   dense_rankValue
19c0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
19d0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
19e0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
19f0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
1a00: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
1a10: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1a20: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
1a30: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
1a40: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
1a50: 6e 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20 70  nStep ){.      p
1a60: 2d 3e 6e 56 61 6c 75 65 2b 2b 3b 0a 20 20 20 20  ->nValue++;.    
1a70: 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a    p->nStep = 0;.
1a80: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a90: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
1aa0: 43 74 78 2c 20 70 2d 3e 6e 56 61 6c 75 65 29 3b  Ctx, p->nValue);
1ab0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
1ac0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1ad0: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
1ae0: 66 75 6e 63 74 69 6f 6e 20 72 61 6e 6b 28 29 2e  function rank().
1af0: 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   Assumes that.**
1b00: 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
1b10: 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20 74  e has been set t
1b20: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45  o:.**.**   RANGE
1b30: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
1b40: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
1b50: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2f   CURRENT ROW .*/
1b60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e  .static void ran
1b70: 6b 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c  kStepFunc(.  sql
1b80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1b90: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
1ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1bb0: 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74   **apArg.){.  st
1bc0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a  ruct CallCount *
1bd0: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
1be0: 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69   CallCount*)sqli
1bf0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
1c00: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
1c10: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
1c20: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70   ){.    p->nStep
1c30: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ++;.    if( p->n
1c40: 56 61 6c 75 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Value==0 ){.    
1c50: 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20 70 2d    p->nValue = p-
1c60: 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 0a 20 20  >nStep;.    }.  
1c70: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1c80: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
1c90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1ca0: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
1cb0: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1cc0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1cd0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1ce0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1cf0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1d00: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1d10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1d20: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
1d30: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
1d40: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
1d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1d60: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1d70: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1d80: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
1d90: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
1da0: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
1db0: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
1dc0: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41  t to:.**.**   RA
1dd0: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
1de0: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
1df0: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
1e00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e10: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
1e20: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1e30: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1e40: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1e50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1e60: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
1e70: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1e80: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1e90: 29 3b 0a 0a 20 20 70 20 3d 20 28 73 74 72 75 63  );..  p = (struc
1ea0: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
1eb0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1ec0: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
1ed0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
1ee0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
1ef0: 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  nTotal==0 ){.   
1f00: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73     p->nTotal = s
1f10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1f20: 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20  64(apArg[0]);.  
1f30: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70    }.    p->nStep
1f40: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ++;.    if( p->n
1f50: 56 61 6c 75 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Value==0 ){.    
1f60: 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20 70 2d    p->nValue = p-
1f70: 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 0a 20 20  >nStep;.    }.  
1f80: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1f90: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56 61 6c 75  percent_rankValu
1fa0: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
1fb0: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
1fc0: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
1fd0: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
1fe0: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71  ct CallCount*)sq
1ff0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
2000: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
2010: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
2020: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
2030: 3e 6e 54 6f 74 61 6c 3e 31 20 29 7b 0a 20 20 20  >nTotal>1 ){.   
2040: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 28 64     double r = (d
2050: 6f 75 62 6c 65 29 28 70 2d 3e 6e 56 61 6c 75 65  ouble)(p->nValue
2060: 2d 31 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  -1) / (double)(p
2070: 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a 20 20 20  ->nTotal-1);.   
2080: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2090: 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72  t_double(pCtx, r
20a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
20c0: 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20  lt_double(pCtx, 
20d0: 30 2e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  0.0);.    }.    
20e0: 70 2d 3e 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20  p->nValue = 0;. 
20f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
2100: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75  ementation of bu
2110: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
2120: 6e 63 74 69 6f 6e 20 63 75 6d 65 5f 64 69 73 74  nction cume_dist
2130: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2140: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2150: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2160: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41  t to:.**.**   RA
2170: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
2180: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
2190: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
21a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21b0: 63 75 6d 65 5f 64 69 73 74 53 74 65 70 46 75 6e  cume_distStepFun
21c0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
21d0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
21e0: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
21f0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2200: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  .){.  struct Cal
2210: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 61 73 73  lCount *p;.  ass
2220: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
2230: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43  .  p = (struct C
2240: 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65  allCount*)sqlite
2250: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2260: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2270: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
2280: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f  {.    if( p->nTo
2290: 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tal==0 ){.      
22a0: 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69  p->nTotal = sqli
22b0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
22c0: 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d  apArg[0]);.    }
22d0: 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b  .    p->nStep++;
22e0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
22f0: 69 64 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75  id cume_distValu
2300: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
2310: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
2320: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
2330: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
2340: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71  ct CallCount*)sq
2350: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
2360: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
2370: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
2380: 20 70 20 26 26 20 70 2d 3e 6e 54 6f 74 61 6c 20   p && p->nTotal 
2390: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20  ){.    double r 
23a0: 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53  = (double)(p->nS
23b0: 74 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28  tep) / (double)(
23c0: 70 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20  p->nTotal);.    
23d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
23e0: 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a  ouble(pCtx, r);.
23f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
2400: 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20  text object for 
2410: 6e 74 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66  ntile() window f
2420: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75  unction..*/.stru
2430: 63 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20  ct NtileCtx {.  
2440: 69 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20  i64 nTotal;     
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 2f 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e  /* Total rows in
2470: 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20   partition */.  
2480: 69 36 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20  i64 nParam;     
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 70 61 73  /* Parameter pas
24b0: 73 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20  sed to ntile(N) 
24c0: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20  */.  i64 iRow;  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
24f0: 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  row */.};../*.**
2500: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2510: 6f 66 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73  of ntile(). This
2520: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
2530: 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68  e window frame h
2540: 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63  as.** been coerc
2550: 65 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  ed to:.**.**   R
2560: 4f 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  OWS UNBOUNDED PR
2570: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
2580: 45 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69  ENT ROW.*/.stati
2590: 63 20 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70  c void ntileStep
25a0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
25b0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
25c0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
25d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
25e0: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
25f0: 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61  NtileCtx *p;.  a
2600: 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
2610: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
2620: 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65  NtileCtx*)sqlite
2630: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2640: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2650: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
2660: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f  {.    if( p->nTo
2670: 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tal==0 ){.      
2680: 70 2d 3e 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69  p->nParam = sqli
2690: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
26a0: 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  apArg[0]);.     
26b0: 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c   p->nTotal = sql
26c0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
26d0: 28 61 70 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (apArg[1]);.    
26e0: 20 20 69 66 28 20 70 2d 3e 6e 50 61 72 61 6d 3c    if( p->nParam<
26f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2700: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2710: 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  or(.            
2720: 70 43 74 78 2c 20 22 61 72 67 75 6d 65 6e 74 20  pCtx, "argument 
2730: 6f 66 20 6e 74 69 6c 65 20 6d 75 73 74 20 62 65  of ntile must be
2740: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
2750: 67 65 72 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  ger", -1.       
2760: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2770: 7d 0a 20 20 20 20 70 2d 3e 69 52 6f 77 2b 2b 3b  }.    p->iRow++;
2780: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
2790: 69 64 20 6e 74 69 6c 65 56 61 6c 75 65 46 75 6e  id ntileValueFun
27a0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
27b0: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
27c0: 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a  ct NtileCtx *p;.
27d0: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4e 74    p = (struct Nt
27e0: 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f  ileCtx*)sqlite3_
27f0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
2800: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
2810: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  p));.  if( p && 
2820: 70 2d 3e 6e 50 61 72 61 6d 3e 30 20 29 7b 0a 20  p->nParam>0 ){. 
2830: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 28     int nSize = (
2840: 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20 70 2d 3e 6e  p->nTotal / p->n
2850: 50 61 72 61 6d 29 3b 0a 20 20 20 20 69 66 28 20  Param);.    if( 
2860: 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
2870: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2880: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
2890: 69 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iRow);.    }else
28a0: 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 4c 61 72  {.      i64 nLar
28b0: 67 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c 20 2d  ge = p->nTotal -
28c0: 20 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69 7a 65   p->nParam*nSize
28d0: 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 6d 61  ;.      i64 iSma
28e0: 6c 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e 53 69  ll = nLarge*(nSi
28f0: 7a 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 36 34  ze+1);.      i64
2900: 20 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f 77 2d   iRow = p->iRow-
2910: 31 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  1;..      assert
2920: 28 20 28 6e 4c 61 72 67 65 2a 28 6e 53 69 7a 65  ( (nLarge*(nSize
2930: 2b 31 29 20 2b 20 28 70 2d 3e 6e 50 61 72 61 6d  +1) + (p->nParam
2940: 2d 6e 4c 61 72 67 65 29 2a 6e 53 69 7a 65 29 3d  -nLarge)*nSize)=
2950: 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29 3b 0a 0a 20  =p->nTotal );.. 
2960: 20 20 20 20 20 69 66 28 20 69 52 6f 77 3c 69 53       if( iRow<iS
2970: 6d 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  mall ){.        
2980: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2990: 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b 20 69  nt64(pCtx, 1 + i
29a0: 52 6f 77 2f 28 6e 53 69 7a 65 2b 31 29 29 3b 0a  Row/(nSize+1));.
29b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
29d0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
29e0: 31 20 2b 20 6e 4c 61 72 67 65 20 2b 20 28 69 52  1 + nLarge + (iR
29f0: 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e 53 69 7a 65  ow-iSmall)/nSize
2a00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
2a20: 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72  ntext object for
2a30: 20 6c 61 73 74 5f 76 61 6c 75 65 28 29 20 77 69   last_value() wi
2a40: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ndow function..*
2a50: 2f 0a 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c  /.struct LastVal
2a60: 75 65 43 74 78 20 7b 0a 20 20 73 71 6c 69 74 65  ueCtx {.  sqlite
2a70: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
2a80: 20 69 6e 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f   int nVal;.};../
2a90: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2aa0: 69 6f 6e 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75  ion of last_valu
2ab0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
2ac0: 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 53 74  oid last_valueSt
2ad0: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
2ae0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2af0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2b00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2b10: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2b20: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2b30: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
2b40: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
2b50: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2b60: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2b70: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2b80: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
2b90: 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d  e3_value_free(p-
2ba0: 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70  >pVal);.    p->p
2bb0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
2bc0: 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30 5d  lue_dup(apArg[0]
2bd0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 56  );.    if( p->pV
2be0: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
2bf0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2c00: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
2c10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c20: 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20 20    p->nVal++;.   
2c30: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2c40: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 49  void last_valueI
2c50: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
2c60: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2c70: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2c80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2c90: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2ca0: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2cb0: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
2cc0: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
2cd0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2ce0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2cf0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2d00: 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a 20  ( ALWAYS(p) ){. 
2d10: 20 20 20 70 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20     p->nVal--;.  
2d20: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30    if( p->nVal==0
2d30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d40: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
2d50: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e  pVal);.      p->
2d60: 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pVal = 0;.    }.
2d70: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2d80: 64 20 6c 61 73 74 5f 76 61 6c 75 65 56 61 6c 75  d last_valueValu
2d90: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
2da0: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
2db0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2dc0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2dd0: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
2de0: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
2df0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
2e00: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
2e10: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70  .  if( p && p->p
2e20: 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Val ){.    sqlit
2e30: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
2e40: 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a  pCtx, p->pVal);.
2e50: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2e60: 64 20 6c 61 73 74 5f 76 61 6c 75 65 46 69 6e 61  d last_valueFina
2e70: 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33  lizeFunc(sqlite3
2e80: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2e90: 0a 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61  .  struct LastVa
2ea0: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2eb0: 20 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c   (struct LastVal
2ec0: 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61  ueCtx*)sqlite3_a
2ed0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2ee0: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
2ef0: 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  ));.  if( p && p
2f00: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
2f10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
2f20: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
2f30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
2f40: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
2f50: 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61 6c 20  l);.    p->pVal 
2f60: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
2f70: 2a 20 53 74 61 74 69 63 20 6e 61 6d 65 73 20 66  * Static names f
2f80: 6f 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  or the built-in 
2f90: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
2fa0: 6e 61 6d 65 73 2e 20 20 54 68 65 73 65 20 73 74  names.  These st
2fb0: 61 74 69 63 0a 2a 2a 20 6e 61 6d 65 73 20 61 72  atic.** names ar
2fc0: 65 20 75 73 65 64 2c 20 72 61 74 68 65 72 20 74  e used, rather t
2fd0: 68 61 6e 20 73 74 72 69 6e 67 20 6c 69 74 65 72  han string liter
2fe0: 61 6c 73 2c 20 73 6f 20 74 68 61 74 20 46 75 6e  als, so that Fun
2ff0: 63 44 65 66 20 6f 62 6a 65 63 74 73 0a 2a 2a 20  cDef objects.** 
3000: 63 61 6e 20 62 65 20 61 73 73 6f 63 69 61 74 65  can be associate
3010: 64 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75  d with a particu
3020: 6c 61 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  lar window funct
3030: 69 6f 6e 20 62 79 20 64 69 72 65 63 74 0a 2a 2a  ion by direct.**
3040: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
3050: 68 65 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 65 72  he zName pointer
3060: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
3070: 2a 20 20 20 20 20 20 20 69 66 28 20 70 46 75 6e  *       if( pFun
3080: 63 44 65 66 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77  cDef->zName==row
3090: 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 20 2e 2e  _valueName ){ ..
30a0: 2e 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  . }.*/.static co
30b0: 6e 73 74 20 63 68 61 72 20 72 6f 77 5f 6e 75 6d  nst char row_num
30c0: 62 65 72 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 72  berName[] =   "r
30d0: 6f 77 5f 6e 75 6d 62 65 72 22 3b 0a 73 74 61 74  ow_number";.stat
30e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 64 65  ic const char de
30f0: 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d  nse_rankName[] =
3100: 20 20 20 22 64 65 6e 73 65 5f 72 61 6e 6b 22 3b     "dense_rank";
3110: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3120: 61 72 20 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20  ar rankName[] = 
3130: 20 20 20 20 20 20 20 20 22 72 61 6e 6b 22 3b 0a          "rank";.
3140: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3150: 72 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61  r percent_rankNa
3160: 6d 65 5b 5d 20 3d 20 22 70 65 72 63 65 6e 74 5f  me[] = "percent_
3170: 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f  rank";.static co
3180: 6e 73 74 20 63 68 61 72 20 63 75 6d 65 5f 64 69  nst char cume_di
3190: 73 74 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 22 63  stName[] =    "c
31a0: 75 6d 65 5f 64 69 73 74 22 3b 0a 73 74 61 74 69  ume_dist";.stati
31b0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 74 69  c const char nti
31c0: 6c 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20  leName[] =      
31d0: 20 20 22 6e 74 69 6c 65 22 3b 0a 73 74 61 74 69    "ntile";.stati
31e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 61 73  c const char las
31f0: 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  t_valueName[] = 
3200: 20 20 22 6c 61 73 74 5f 76 61 6c 75 65 22 3b 0a    "last_value";.
3210: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3220: 72 20 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 5b  r nth_valueName[
3230: 5d 20 3d 20 20 20 20 22 6e 74 68 5f 76 61 6c 75  ] =    "nth_valu
3240: 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  e";.static const
3250: 20 63 68 61 72 20 66 69 72 73 74 5f 76 61 6c 75   char first_valu
3260: 65 4e 61 6d 65 5b 5d 20 3d 20 20 22 66 69 72 73  eName[] =  "firs
3270: 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  t_value";.static
3280: 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 65 61 64   const char lead
3290: 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20 20  Name[] =        
32a0: 20 22 6c 65 61 64 22 3b 0a 73 74 61 74 69 63 20   "lead";.static 
32b0: 63 6f 6e 73 74 20 63 68 61 72 20 6c 61 67 4e 61  const char lagNa
32c0: 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 20  me[] =          
32d0: 22 6c 61 67 22 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  "lag";../*.** No
32e0: 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  -op implementati
32f0: 6f 6e 73 20 6f 66 20 78 53 74 65 70 28 29 20 61  ons of xStep() a
3300: 6e 64 20 78 46 69 6e 61 6c 69 7a 65 28 29 2e 20  nd xFinalize(). 
3310: 20 55 73 65 64 20 61 73 20 70 6c 61 63 65 2d 68   Used as place-h
3320: 6f 6c 64 65 72 73 0a 2a 2a 20 66 6f 72 20 62 75  olders.** for bu
3330: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
3340: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 6e 65 76  nctions that nev
3350: 65 72 20 63 61 6c 6c 20 74 68 6f 73 65 20 69 6e  er call those in
3360: 74 65 72 66 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  terfaces..**.** 
3370: 54 68 65 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  The noopValueFun
3380: 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62 75  c() is called bu
3390: 74 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  t is expected to
33a0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 54 68   do nothing.  Th
33b0: 65 0a 2a 2a 20 6e 6f 6f 70 53 74 65 70 46 75 6e  e.** noopStepFun
33c0: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
33d0: 6c 65 64 2c 20 61 6e 64 20 73 6f 20 69 74 20 69  led, and so it i
33e0: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 4e 4f  s marked with NO
33f0: 5f 54 45 53 54 20 74 6f 0a 2a 2a 20 6c 65 74 20  _TEST to.** let 
3400: 74 68 65 20 74 65 73 74 20 63 6f 76 65 72 61 67  the test coverag
3410: 65 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 20 6e  e routine know n
3420: 6f 74 20 74 6f 20 65 78 70 65 63 74 20 74 68 69  ot to expect thi
3430: 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  s function to be
3440: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a  .** invoked..*/.
3450: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70  static void noop
3460: 53 74 65 70 46 75 6e 63 28 20 20 20 20 2f 2a 4e  StepFunc(    /*N
3470: 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71 6c 69 74  O_TEST*/.  sqlit
3480: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 20  e3_context *p,  
3490: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
34a0: 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34c0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71 6c  *NO_TEST*/.  sql
34d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 20 20  ite3_value **a  
34e0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
34f0: 54 2a 2f 0a 29 7b 20 20 20 20 20 20 20 20 20 20  T*/.){          
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3510: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 61   /*NO_TEST*/.  a
3520: 73 73 65 72 74 28 30 29 3b 20 20 20 20 20 20 20  ssert(0);       
3530: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
3540: 45 53 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20 20  EST*/.}         
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 73     /*NO_TEST*/.s
3570: 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70 56  tatic void noopV
3580: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
3590: 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 20 2f 2a  _context *p){ /*
35a0: 6e 6f 2d 6f 70 2a 2f 3b 20 7d 0a 0a 2f 2a 20 57  no-op*/; }../* W
35b0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
35c0: 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77 69 6e  that use all win
35d0: 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73 3a 20  dow interfaces: 
35e0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 0a 2a  xStep, xFinal,.*
35f0: 2a 20 78 56 61 6c 75 65 2c 20 61 6e 64 20 78 49  * xValue, and xI
3600: 6e 76 65 72 73 65 20 2a 2f 0a 23 64 65 66 69 6e  nverse */.#defin
3610: 65 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28  e WINDOWFUNCALL(
3620: 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29  name,nArg,extra)
3630: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28       \.  nArg, (
3660: 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49  SQLITE_UTF8|SQLI
3670: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65  TE_FUNC_WINDOW|e
3680: 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20  xtra), 0, 0,    
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 53 74    \.  name ## St
36b0: 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  epFunc, name ## 
36c0: 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20 6e 61  FinalizeFunc, na
36d0: 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c  me ## ValueFunc,
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
36f0: 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76 46 75  .  name ## InvFu
3700: 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d 65  nc, name ## Name
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
3740: 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74  ./* Window funct
3750: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6d  ions that are im
3760: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
3770: 62 79 74 65 63 6f 64 65 20 61 6e 64 20 74 68 75  bytecode and thu
3780: 73 20 68 61 76 65 0a 2a 2a 20 6e 6f 2d 6f 70 20  s have.** no-op 
3790: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65  routines for the
37a0: 69 72 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 64  ir methods */.#d
37b0: 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43  efine WINDOWFUNC
37c0: 4e 4f 4f 50 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  NOOP(name,nArg,e
37d0: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72           \.  nAr
3800: 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c  g, (SQLITE_UTF8|
3810: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
3820: 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c  OW|extra), 0, 0,
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74        \.  noopSt
3850: 65 70 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c 75  epFunc, noopValu
3860: 65 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c 75 65  eFunc, noopValue
3870: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46     \.  noopStepF
38a0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d  unc, name ## Nam
38b0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66  \.}../* Window f
38f0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73  unctions that us
3900: 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69 6e 74  e all window int
3910: 65 72 66 61 63 65 73 3a 20 78 53 74 65 70 2c 20  erfaces: xStep, 
3920: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72 6f 75 74  the.** same rout
3930: 69 6e 65 20 66 6f 72 20 78 46 69 6e 61 6c 69 7a  ine for xFinaliz
3940: 65 20 61 6e 64 20 78 56 61 6c 75 65 20 61 6e 64  e and xValue and
3950: 20 77 68 69 63 68 20 6e 65 76 65 72 20 63 61 6c   which never cal
3960: 6c 0a 2a 2a 20 78 49 6e 76 65 72 73 65 2e 20 2a  l.** xInverse. *
3970: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57  /.#define WINDOW
3980: 46 55 4e 43 58 28 6e 61 6d 65 2c 6e 41 72 67 2c  FUNCX(name,nArg,
3990: 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20  extra) {        
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
39c0: 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f 55   nArg, (SQLITE_U
39d0: 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  TF8|SQLITE_FUNC_
39e0: 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20 30  WINDOW|extra), 0
39f0: 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 0,            
3a00: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
3a10: 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63 2c 20  me ## StepFunc, 
3a20: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
3a30: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
3a40: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
3a50: 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53         \.  noopS
3a60: 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  tepFunc, name ##
3a70: 20 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   Name           
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20      \.}.../*.** 
3ab0: 52 65 67 69 73 74 65 72 20 74 68 6f 73 65 20 62  Register those b
3ac0: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
3ad0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72  unctions that ar
3ae0: 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67 72 65  e not also aggre
3af0: 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  gates..*/.void s
3b00: 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75 6e 63  qlite3WindowFunc
3b10: 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 73  tions(void){.  s
3b20: 74 61 74 69 63 20 46 75 6e 63 44 65 66 20 61 57  tatic FuncDef aW
3b30: 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d 20 7b  indowFuncs[] = {
3b40: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58  .    WINDOWFUNCX
3b50: 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30 2c 20  (row_number, 0, 
3b60: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
3b70: 4e 43 58 28 64 65 6e 73 65 5f 72 61 6e 6b 2c 20  NCX(dense_rank, 
3b80: 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  0, 0),.    WINDO
3b90: 57 46 55 4e 43 58 28 72 61 6e 6b 2c 20 30 2c 20  WFUNCX(rank, 0, 
3ba0: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
3bb0: 4e 43 58 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b  NCX(percent_rank
3bc0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  , 0, SQLITE_FUNC
3bd0: 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20  _WINDOW_SIZE),. 
3be0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 63     WINDOWFUNCX(c
3bf0: 75 6d 65 5f 64 69 73 74 2c 20 30 2c 20 53 51 4c  ume_dist, 0, SQL
3c00: 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f  ITE_FUNC_WINDOW_
3c10: 53 49 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f  SIZE),.    WINDO
3c20: 57 46 55 4e 43 58 28 6e 74 69 6c 65 2c 20 31 2c  WFUNCX(ntile, 1,
3c30: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
3c40: 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57  DOW_SIZE),.    W
3c50: 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6c 61 73  INDOWFUNCALL(las
3c60: 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a  t_value, 1, 0),.
3c70: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
3c80: 4f 50 28 6e 74 68 5f 76 61 6c 75 65 2c 20 32 2c  OP(nth_value, 2,
3c90: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
3ca0: 55 4e 43 4e 4f 4f 50 28 66 69 72 73 74 5f 76 61  UNCNOOP(first_va
3cb0: 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20  lue, 1, 0),.    
3cc0: 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c  WINDOWFUNCNOOP(l
3cd0: 65 61 64 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20  ead, 1, 0),.    
3ce0: 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c  WINDOWFUNCNOOP(l
3cf0: 65 61 64 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20  ead, 2, 0),.    
3d00: 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c  WINDOWFUNCNOOP(l
3d10: 65 61 64 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20  ead, 3, 0),.    
3d20: 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c  WINDOWFUNCNOOP(l
3d30: 61 67 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57  ag, 1, 0),.    W
3d40: 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61  INDOWFUNCNOOP(la
3d50: 67 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  g, 2, 0),.    WI
3d60: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67  NDOWFUNCNOOP(lag
3d70: 2c 20 33 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20  , 3, 0),.  };.  
3d80: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 42 75 69  sqlite3InsertBui
3d90: 6c 74 69 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f  ltinFuncs(aWindo
3da0: 77 46 75 6e 63 73 2c 20 41 72 72 61 79 53 69 7a  wFuncs, ArraySiz
3db0: 65 28 61 57 69 6e 64 6f 77 46 75 6e 63 73 29 29  e(aWindowFuncs))
3dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3dd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
3de0: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
3df0: 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67 20 74  fter resolving t
3e00: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
3e10: 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e 64 6f 77  .** for a window
3e20: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 69 6e   function within
3e30: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
3e40: 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c  ent. Argument pL
3e50: 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c 69 6e 6b  ist is a.** link
3e60: 65 64 20 6c 69 73 74 20 6f 66 20 57 49 4e 44 4f  ed list of WINDO
3e70: 57 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 66 6f  W definitions fo
3e80: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  r the current SE
3e90: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
3ea0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 46 75 6e  ** Argument pFun
3eb0: 63 20 69 73 20 74 68 65 20 66 75 6e 63 74 69 6f  c is the functio
3ec0: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6a 75 73  n definition jus
3ed0: 74 20 72 65 73 6f 6c 76 65 64 20 61 6e 64 20 70  t resolved and p
3ee0: 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65 20 57 69  Win.** is the Wi
3ef0: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72 65 70 72  ndow object repr
3f00: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 61 73 73  esenting the ass
3f10: 6f 63 69 61 74 65 64 20 4f 56 45 52 20 63 6c 61  ociated OVER cla
3f20: 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  use. This.** fun
3f30: 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68  ction updates th
3f40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 57  e contents of pW
3f50: 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  in as follows:.*
3f60: 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
3f70: 4f 56 45 52 20 63 6c 61 75 73 65 20 72 65 66 65  OVER clause refe
3f80: 72 65 64 20 74 6f 20 61 20 6e 61 6d 65 64 20 77  red to a named w
3f90: 69 6e 64 6f 77 20 28 61 73 20 69 6e 20 22 6d 61  indow (as in "ma
3fa0: 78 28 78 29 20 4f 56 45 52 20 77 69 6e 22 29 2c  x(x) OVER win"),
3fb0: 0a 2a 2a 20 20 20 20 20 73 65 61 72 63 68 20 6c  .**     search l
3fc0: 69 73 74 20 70 4c 69 73 74 20 66 6f 72 20 61 20  ist pList for a 
3fd0: 6d 61 74 63 68 69 6e 67 20 57 49 4e 44 4f 57 20  matching WINDOW 
3fe0: 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61 6e 64 20  definition, and 
3ff0: 75 70 64 61 74 65 20 70 57 69 6e 0a 2a 2a 20 20  update pWin.**  
4000: 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20     accordingly. 
4010: 49 66 20 6e 6f 20 73 75 63 68 20 57 49 4e 44 4f  If no such WINDO
4020: 57 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65 20  W clause can be 
4030: 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20 61 6e 20  found, leave an 
4040: 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20 69 6e 20  error.**     in 
4050: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  pParse..**.**   
4060: 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f  * If the functio
4070: 6e 20 69 73 20 61 20 62 75 69 6c 74 2d 69 6e 20  n is a built-in 
4080: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
4090: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
40a0: 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f 77 20  e.**     window 
40b0: 74 6f 20 62 65 20 63 6f 65 72 63 65 64 20 28 73  to be coerced (s
40c0: 65 65 20 22 42 55 49 4c 54 2d 49 4e 20 57 49 4e  ee "BUILT-IN WIN
40d0: 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53 22 20 61  DOW FUNCTIONS" a
40e0: 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20 20 20  t the top.**    
40f0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 29 2c 20   of this file), 
4100: 70 57 69 6e 20 69 73 20 75 70 64 61 74 65 64 20  pWin is updated 
4110: 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  here..*/.void sq
4120: 6c 69 74 65 33 57 69 6e 64 6f 77 55 70 64 61 74  lite3WindowUpdat
4130: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4140: 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se, .  Window *p
4150: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
4160: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4170: 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77 73 20  f named windows 
4180: 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
4190: 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  */.  Window *pWi
41a0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
41b0: 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 66       /* Window f
41c0: 72 61 6d 65 20 74 6f 20 75 70 64 61 74 65 20 2a  rame to update *
41d0: 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75  /.  FuncDef *pFu
41e0: 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
41f0: 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 66 75      /* Window fu
4200: 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
4210: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 57  n */.){.  if( pW
4220: 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20 70 57 69  in->zName && pWi
4230: 6e 2d 3e 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  n->eType==0 ){. 
4240: 20 20 20 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20     Window *p;.  
4250: 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
4260: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69 6e 29  ; p=p->pNextWin)
4270: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
4280: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e  te3StrICmp(p->zN
4290: 61 6d 65 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65  ame, pWin->zName
42a0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
42b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 3d 3d 30    }.    if( p==0
42c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
42d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
42e0: 2c 20 22 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f  , "no such windo
42f0: 77 3a 20 25 73 22 2c 20 70 57 69 6e 2d 3e 7a 4e  w: %s", pWin->zN
4300: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
4310: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  rn;.    }.    pW
4320: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d  in->pPartition =
4330: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4340: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
4350: 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30  p->pPartition, 0
4360: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72  );.    pWin->pOr
4370: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
4380: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
4390: 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
43a0: 42 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e  By, 0);.    pWin
43b0: 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
43c0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
43d0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c  ->db, p->pStart,
43e0: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70   0);.    pWin->p
43f0: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70  End = sqlite3Exp
4400: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
4410: 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20   p->pEnd, 0);.  
4420: 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d    pWin->eStart =
4430: 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20   p->eStart;.    
4440: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e  pWin->eEnd = p->
4450: 65 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  eEnd;.    pWin->
4460: 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65  eType = p->eType
4470: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 75 6e  ;.  }.  if( pFun
4480: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
4490: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
44a0: 57 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  W ){.    sqlite3
44b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
44c0: 62 3b 0a 20 20 20 20 69 66 28 20 70 57 69 6e 2d  b;.    if( pWin-
44d0: 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  >pFilter ){.    
44e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
44f0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
4500: 20 20 20 20 20 22 46 49 4c 54 45 52 20 63 6c 61       "FILTER cla
4510: 75 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  use may only be 
4520: 75 73 65 64 20 77 69 74 68 20 61 67 67 72 65 67  used with aggreg
4530: 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ate window funct
4540: 69 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b 0a 20  ions".      );. 
4550: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28     }else.    if(
4560: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 72   pFunc->zName==r
4570: 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d 65 20 7c 7c  ow_numberName ||
4580: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
4590: 74 69 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20  tileName ){.    
45a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
45b0: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53  ete(db, pWin->pS
45c0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
45d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
45e0: 62 2c 20 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a  b, pWin->pEnd);.
45f0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61        pWin->pSta
4600: 72 74 20 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20  rt = pWin->pEnd 
4610: 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  = 0;.      pWin-
4620: 3e 65 54 79 70 65 20 3d 20 54 4b 5f 52 4f 57 53  >eType = TK_ROWS
4630: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 53  ;.      pWin->eS
4640: 74 61 72 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e  tart = TK_UNBOUN
4650: 44 45 44 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  DED;.      pWin-
4660: 3e 65 45 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45  >eEnd = TK_CURRE
4670: 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20  NT;.    }else.. 
4680: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e     if( pFunc->zN
4690: 61 6d 65 3d 3d 64 65 6e 73 65 5f 72 61 6e 6b 4e  ame==dense_rankN
46a0: 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  ame || pFunc->zN
46b0: 61 6d 65 3d 3d 72 61 6e 6b 4e 61 6d 65 0a 20 20  ame==rankName.  
46c0: 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61     || pFunc->zNa
46d0: 6d 65 3d 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b  me==percent_rank
46e0: 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a  Name || pFunc->z
46f0: 4e 61 6d 65 3d 3d 63 75 6d 65 5f 64 69 73 74 4e  Name==cume_distN
4700: 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ame.    ){.     
4710: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4720: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74  te(db, pWin->pSt
4730: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
4740: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4750: 2c 20 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20  , pWin->pEnd);. 
4760: 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72       pWin->pStar
4770: 74 20 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d  t = pWin->pEnd =
4780: 20 30 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e   0;.      pWin->
4790: 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45  eType = TK_RANGE
47a0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 53  ;.      pWin->eS
47b0: 74 61 72 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e  tart = TK_UNBOUN
47c0: 44 45 44 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  DED;.      pWin-
47d0: 3e 65 45 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45  >eEnd = TK_CURRE
47e0: 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  NT;.    }.  }.  
47f0: 70 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46  pWin->pFunc = pF
4800: 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  unc;.}../*.** Co
4810: 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73  ntext object pas
4820: 73 65 64 20 74 68 72 6f 75 67 68 20 73 71 6c 69  sed through sqli
4830: 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
4840: 29 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69  ) to.** selectWi
4850: 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43  ndowRewriteExprC
4860: 62 28 29 20 62 79 20 73 65 6c 65 63 74 57 69 6e  b() by selectWin
4870: 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28  dowRewriteEList(
4880: 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  )..*/.typedef st
4890: 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69  ruct WindowRewri
48a0: 74 65 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te WindowRewrite
48b0: 3b 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52  ;.struct WindowR
48c0: 65 77 72 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f  ewrite {.  Windo
48d0: 77 20 2a 70 57 69 6e 3b 0a 20 20 45 78 70 72 4c  w *pWin;.  ExprL
48e0: 69 73 74 20 2a 70 53 75 62 3b 0a 7d 3b 0a 0a 2f  ist *pSub;.};../
48f0: 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75  *.** Callback fu
4900: 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20 73  nction used by s
4910: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
4920: 74 65 45 4c 69 73 74 28 29 2e 20 49 66 20 6e 65  teEList(). If ne
4930: 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74 68 69 73  cessary,.** this
4940: 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
4950: 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  s to the output 
4960: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
4970: 61 6e 64 20 75 70 64 61 74 65 73 20 0a 2a 2a 20  and updates .** 
4980: 65 78 70 72 65 73 73 69 6f 6e 20 28 2a 70 70 45  expression (*ppE
4990: 78 70 72 29 20 69 6e 20 70 6c 61 63 65 2e 0a 2a  xpr) in place..*
49a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
49b0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
49c0: 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
49d0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
49e0: 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74 20 57  xpr){.  struct W
49f0: 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20  indowRewrite *p 
4a00: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65  = pWalker->u.pRe
4a10: 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65 20 2a  write;.  Parse *
4a20: 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
4a30: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 73 77 69  ->pParse;..  swi
4a40: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
4a50: 7b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  {..    case TK_F
4a60: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
4a70: 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d 3d  f( pExpr->pWin==
4a80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
4a90: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
4aa0: 0a 20 20 20 20 20 20 20 20 57 69 6e 64 6f 77 20  .        Window 
4ab0: 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 20 20 66  *pWin;.        f
4ac0: 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b  or(pWin=p->pWin;
4ad0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
4ae0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
4af0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
4b00: 2d 3e 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a  ->pWin==pWin ){.
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
4b20: 72 74 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  rt( pWin->pOwner
4b30: 3d 3d 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ==pExpr );.     
4b40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
4b50: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20  C_Prune;.       
4b60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
4b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
4b80: 46 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a  Fall through.  *
4b90: 2f 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  /..    case TK_A
4ba0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
4bb0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
4bc0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
4bd0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
4be0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
4bf0: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
4c00: 20 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69    p->pSub = sqli
4c10: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
4c20: 64 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75  d(pParse, p->pSu
4c30: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
4c40: 69 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20  if( p->pSub ){. 
4c50: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45         assert( E
4c60: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4c70: 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
4c80: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ==0 );.        E
4c90: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
4ca0: 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
4cb0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4cc0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
4cd0: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
4ce0: 20 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61          ExprClea
4cf0: 72 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  rProperty(pExpr,
4d00: 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20   EP_Static);.   
4d10: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70       memset(pExp
4d20: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  r, 0, sizeof(Exp
4d30: 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45  r));..        pE
4d40: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
4d50: 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78  UMN;.        pEx
4d60: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d  pr->iColumn = p-
4d70: 3e 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a  >pSub->nExpr-1;.
4d80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4d90: 54 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d  Table = p->pWin-
4da0: 3e 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20  >iEphCsr;.      
4db0: 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
4dc0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75      }..    defau
4dd0: 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  lt: /* no-op */.
4de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
4df0: 0a 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ..  return WRC_C
4e00: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
4e10: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4e20: 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43  owRewriteSelectC
4e30: 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  b(Walker *pWalke
4e40: 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
4e50: 63 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 57 52  ct){.  return WR
4e60: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  C_Prune;.}.../*.
4e70: 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  ** Iterate throu
4e80: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
4e90: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
4ea0: 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f  -list pEList. Fo
4eb0: 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  r each:.**.**   
4ec0: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20  * TK_COLUMN,.** 
4ed0: 20 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75    * aggregate fu
4ee0: 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20  nction, or.**   
4ef0: 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
4f00: 6e 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20  n with a Window 
4f10: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e  object that is n
4f20: 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ot a member of t
4f30: 68 65 20 0a 2a 2a 20 20 20 20 20 6c 69 6e 6b 65  he .**     linke
4f40: 64 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  d list passed as
4f50: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
4f60: 6d 65 6e 74 20 28 70 57 69 6e 29 0a 2a 2a 0a 2a  ment (pWin).**.*
4f70: 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64  * Append the nod
4f80: 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70 72  e to output expr
4f90: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70 70  ession-list (*pp
4fa0: 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61 63  Sub). And replac
4fb0: 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20 54  e it.** with a T
4fc0: 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65  K_COLUMN that re
4fd0: 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68 20  ads the (N-1)th 
4fe0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c 65  element of table
4ff0: 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68 43   .** pWin->iEphC
5000: 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  sr, where N is t
5010: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
5020: 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75 62  ments in (*ppSub
5030: 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65 6e  ) after.** appen
5040: 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65  ding the new one
5050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5060: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
5070: 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72  riteEList(.  Par
5080: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57  se *pParse, .  W
5090: 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 45  indow *pWin,.  E
50a0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
50c0: 2a 20 52 65 77 72 69 74 65 20 65 78 70 72 65 73  * Rewrite expres
50d0: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c 69  sions in this li
50e0: 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  st */.  ExprList
50f0: 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20 20   **ppSub        
5100: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
5110: 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65 78  T: Sub-select ex
5120: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f  pression-list */
5130: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  .){.  Walker sWa
5140: 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65  lker;.  WindowRe
5150: 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b 0a  write sRewrite;.
5160: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
5170: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61  er, 0, sizeof(Wa
5180: 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  lker));.  memset
5190: 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73  (&sRewrite, 0, s
51a0: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72  izeof(WindowRewr
51b0: 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69  ite));..  sRewri
51c0: 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62  te.pSub = *ppSub
51d0: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69  ;.  sRewrite.pWi
51e0: 6e 20 3d 20 70 57 69 6e 3b 0a 0a 20 20 73 57 61  n = pWin;..  sWa
51f0: 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
5200: 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
5210: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
5220: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5230: 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  iteExprCb;.  sWa
5240: 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
5250: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e  back = selectWin
5260: 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74  dowRewriteSelect
5270: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
5280: 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77  pRewrite = &sRew
5290: 72 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73  rite;..  (void)s
52a0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
52b0: 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c  st(&sWalker, pEL
52c0: 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20  ist);..  *ppSub 
52d0: 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b  = sRewrite.pSub;
52e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
52f0: 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
5300: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78  expression in ex
5310: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41  pression-list pA
5320: 70 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72  ppend to.** expr
5330: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
5340: 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  t. Return a poin
5350: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ter to the resul
5360: 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
5370: 63 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72  c ExprList *expr
5380: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a  ListAppendList(.
5390: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
53a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
53b0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
53c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
53d0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
53e0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
53f0: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
5400: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
5410: 74 20 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20  t *pAppend      
5420: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
5430: 65 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  es to append. Mi
5440: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
5450: 7b 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64 20  {.  if( pAppend 
5460: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5470: 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c    int nInit = pL
5480: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
5490: 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  pr : 0;.    for(
54a0: 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e  i=0; i<pAppend->
54b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
54c0: 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20     Expr *pDup = 
54d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
54e0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65  Parse->db, pAppe
54f0: 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  nd->a[i].pExpr, 
5500: 30 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  0);.      pList 
5510: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5520: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
5530: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
5540: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
5550: 70 4c 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69  pList->a[nInit+i
5560: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41  ].sortOrder = pA
5570: 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74  ppend->a[i].sort
5580: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
5590: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
55a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
55b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
55c0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
55d0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
55e0: 64 6f 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a  does not invoke.
55f0: 2a 2a 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f  ** any SQL windo
5600: 77 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69  w functions, thi
5610: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
5620: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
5630: 2c 20 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65  , it .** rewrite
5640: 73 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  s the SELECT sta
5650: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
5660: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78  indow function x
5670: 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  Step functions.*
5680: 2a 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e  * are invoked in
5690: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
56a0: 65 72 20 61 73 20 64 65 73 63 72 69 62 65 64 20  er as described 
56b0: 75 6e 64 65 72 20 22 53 45 4c 45 43 54 20 52 45  under "SELECT RE
56c0: 57 52 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74  WRITING".** at t
56d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
56e0: 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ile..*/.int sqli
56f0: 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te3WindowRewrite
5700: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5710: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5720: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5730: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  ;.  if( p->pWin 
5740: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
5750: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5760: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
5770: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5780: 65 2d 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63  e->db;.    Selec
5790: 74 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  t *pSub = 0;    
57a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
57b0: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
57c0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
57d0: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70  p->pSrc;.    Exp
57e0: 72 20 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  r *pWhere = p->p
57f0: 57 68 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c  Where;.    ExprL
5800: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20  ist *pGroupBy = 
5810: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
5820: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d   Expr *pHaving =
5830: 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
5840: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74   ExprList *pSort
5850: 20 3d 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c   = 0;..    ExprL
5860: 69 73 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20  ist *pSublist = 
5870: 30 3b 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  0;       /* Expr
5880: 65 73 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  ession list for 
5890: 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20  sub-query */.   
58a0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
58b0: 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f   p->pWin;      /
58c0: 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20  * Master window 
58d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69  object */.    Wi
58e0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20  ndow *pWin;     
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
5900: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65  indow object ite
5910: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d  rator */..    p-
5920: 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
5930: 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
5940: 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
5950: 30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  0;.    p->pHavin
5960: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  g = 0;..    /* C
5970: 72 65 61 74 65 20 74 68 65 20 4f 52 44 45 52 20  reate the ORDER 
5980: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
5990: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68  e sub-select. Th
59a0: 69 73 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74  is is the concat
59b0: 65 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f  enation.    ** o
59c0: 66 20 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52  f the window PAR
59d0: 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52  TITION and ORDER
59e0: 20 42 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65   BY clauses. The
59f0: 6e 2c 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73  n, if this makes
5a00: 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e   it.    ** redun
5a10: 64 61 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  dant, remove the
5a20: 20 4f 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74   ORDER BY from t
5a30: 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
5a40: 2e 20 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20  .  */.    pSort 
5a50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5a60: 74 44 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e  tDup(db, pMWin->
5a70: 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
5a80: 20 20 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72      pSort = expr
5a90: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
5aa0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d  Parse, pSort, pM
5ab0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  Win->pOrderBy);.
5ac0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26 26      if( pSort &&
5ad0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
5ae0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5af0: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
5b00: 28 70 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65  (pSort, p->pOrde
5b10: 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
5b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5b30: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
5b40: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
5b50: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
5b60: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
5b70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73      }..    /* As
5b80: 73 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75  sign a cursor nu
5b90: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 65 70 68  mber for the eph
5ba0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
5bb0: 64 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73  d to buffer rows
5bc0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65  ..    ** The Ope
5bd0: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
5be0: 75 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20  uction is coded 
5bf0: 6c 61 74 65 72 2c 20 61 66 74 65 72 20 69 74 20  later, after it 
5c00: 69 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20  is known how.   
5c10: 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   ** many columns
5c20: 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20   the table will 
5c30: 68 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d  have.  */.    pM
5c40: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70  Win->iEphCsr = p
5c50: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a  Parse->nTab++;..
5c60: 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77      selectWindow
5c70: 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61  RewriteEList(pPa
5c80: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70  rse, pMWin, p->p
5c90: 45 4c 69 73 74 2c 20 26 70 53 75 62 6c 69 73 74  EList, &pSublist
5ca0: 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e  );.    selectWin
5cb0: 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28  dowRewriteEList(
5cc0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70  pParse, pMWin, p
5cd0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53 75  ->pOrderBy, &pSu
5ce0: 62 6c 69 73 74 29 3b 0a 20 20 20 20 70 4d 57 69  blist);.    pMWi
5cf0: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20  n->nBufferCol = 
5d00: 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62  (pSublist ? pSub
5d10: 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  list->nExpr : 0)
5d20: 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  ;..    /* Append
5d30: 20 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20 42   the PARTITION B
5d40: 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65  Y and ORDER BY e
5d50: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 74 68  xpressions to th
5d60: 65 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  e to the .    **
5d70: 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72   sub-select expr
5d80: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65  ession list. The
5d90: 79 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  y are required t
5da0: 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68 65  o figure out whe
5db0: 72 65 20 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64  re .    ** bound
5dc0: 61 72 69 65 73 20 66 6f 72 20 70 61 72 74 69 74  aries for partit
5dd0: 69 6f 6e 73 20 61 6e 64 20 73 65 74 73 20 6f 66  ions and sets of
5de0: 20 70 65 65 72 20 72 6f 77 73 20 6c 69 65 2e 20   peer rows lie. 
5df0: 20 2a 2f 0a 20 20 20 20 70 53 75 62 6c 69 73 74   */.    pSublist
5e00: 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e   = exprListAppen
5e10: 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  dList(pParse, pS
5e20: 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70  ublist, pMWin->p
5e30: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
5e40: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
5e50: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
5e60: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
5e70: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29  pMWin->pOrderBy)
5e80: 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  ;..    /* Append
5e90: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70   the arguments p
5ea0: 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 77 69  assed to each wi
5eb0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ndow function to
5ec0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d   the.    ** sub-
5ed0: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
5ee0: 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c  n list. Also all
5ef0: 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73 74  ocate two regist
5f00: 65 72 73 20 66 6f 72 20 65 61 63 68 0a 20 20 20  ers for each.   
5f10: 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   ** window funct
5f20: 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68  ion - one for th
5f30: 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61  e accumulator, a
5f40: 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e 74 65 72  nother for inter
5f50: 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  im.    ** result
5f60: 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  s.  */.    for(p
5f70: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
5f80: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
5f90: 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 70 57 69  tWin){.      pWi
5fa0: 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28 70 53  n->iArgCol = (pS
5fb0: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
5fc0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
5fd0: 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20       pSublist = 
5fe0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
5ff0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
6000: 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  ist, pWin->pOwne
6010: 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
6020: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69     if( pWin->pFi
6030: 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
6040: 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d 20  Expr *pFilter = 
6050: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6060: 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  b, pWin->pFilter
6070: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 53  , 0);.        pS
6080: 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ublist = sqlite3
6090: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
60a0: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
60b0: 20 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 20   pFilter);.     
60c0: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72   }.      pWin->r
60d0: 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72  egAccum = ++pPar
60e0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
60f0: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20  pWin->regResult 
6100: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6110: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6120: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6130: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
6140: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a  egAccum);.    }.
6150: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
6160: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
6170: 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20  or PARTITION BY 
6180: 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20  clause, and the 
6190: 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75  window.    ** fu
61a0: 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20 7a  nction accepts z
61b0: 65 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 61  ero arguments, a
61c0: 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
61d0: 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20  other columns.  
61e0: 20 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28 65    ** selected (e
61f0: 2e 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77 5f  .g. "SELECT row_
6200: 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28 29  number() OVER ()
6210: 20 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20 69   FROM t1"), it i
6220: 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a  s possible.    *
6230: 2a 20 74 68 61 74 20 70 53 75 62 6c 69 73 74 20  * that pSublist 
6240: 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65  is still NULL he
6250: 72 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74 61  re. Add a consta
6260: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68 65  nt expression he
6270: 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65  re to .    ** ke
6280: 65 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c 65  ep everything le
6290: 67 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65  gal in this case
62a0: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
62b0: 28 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b  ( pSublist==0 ){
62c0: 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20  .      pSublist 
62d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
62e0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
62f0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  0, .          sq
6300: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
6310: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
6320: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
6330: 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29 3b  [0], 0).      );
6340: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75 62  .    }..    pSub
6350: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
6360: 4e 65 77 28 0a 20 20 20 20 20 20 20 20 70 50 61  New(.        pPa
6370: 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70  rse, pSublist, p
6380: 53 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47 72  Src, pWhere, pGr
6390: 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20  oupBy, pHaving, 
63a0: 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20 20  pSort, 0, 0.    
63b0: 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  );.    p->pSrc =
63c0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
63d0: 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
63e0: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
63f0: 70 2d 3e 70 53 72 63 20 7c 7c 20 64 62 2d 3e 6d  p->pSrc || db->m
6400: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6410: 20 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29     if( p->pSrc )
6420: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 2d  {.      p->pSrc-
6430: 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[0].pSelect = 
6440: 70 53 75 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  pSub;.      sqli
6450: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
6460: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
6470: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  p->pSrc);.      
6480: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e  if( sqlite3Expan
6490: 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  dSubquery(pParse
64a0: 2c 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  , &p->pSrc->a[0]
64b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
64c0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
64d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
64e0: 20 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c       pSub->selFl
64f0: 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
6500: 65 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  ed;.        p->s
6510: 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41  elFlags &= ~SF_A
6520: 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20  ggregate;.      
6530: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
6540: 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 75 62  rep(pParse, pSub
6550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
6560: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6570: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6580: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4d 57 69  nEphemeral, pMWi
6590: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 53 75 62  n->iEphCsr, pSub
65a0: 6c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  list->nExpr);.  
65b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
65c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
65d0: 74 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20  te(db, pSub);.  
65e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
65f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
6600: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6610: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
6620: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
6630: 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a  e the Window obj
6640: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
6650: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6660: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6670: 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 73  e3WindowDelete(s
6680: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64  qlite3 *db, Wind
6690: 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  ow *p){.  if( p 
66a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
66b0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
66c0: 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 73 71  pFilter);.    sq
66d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
66e0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74  ete(db, p->pPart
66f0: 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ition);.    sqli
6700: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
6710: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
6720: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
6730: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
6740: 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  >pEnd);.    sqli
6750: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6760: 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20  , p->pStart);.  
6770: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6780: 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  db, p->zName);. 
6790: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
67a0: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, p);.  }.}..
67b0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 6c  /*.** Free the l
67c0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69  inked list of Wi
67d0: 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 73 74 61  ndow objects sta
67e0: 72 74 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  rting at the sec
67f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
6800: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
6810: 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 73 71  dowListDelete(sq
6820: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f  lite3 *db, Windo
6830: 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  w *p){.  while( 
6840: 70 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20  p ){.    Window 
6850: 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  *pNext = p->pNex
6860: 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  tWin;.    sqlite
6870: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64 62  3WindowDelete(db
6880: 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e  , p);.    p = pN
6890: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
68a0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 65  * The argument e
68b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
68c0: 50 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c  PRECEDING or FOL
68d0: 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74 2e 20 20  LOWING offset.  
68e0: 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 68 6f  The.** value sho
68f0: 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67  uld be a non-neg
6900: 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20 20  ative integer.  
6910: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
6920: 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73 74 61 6e  not a.** constan
6930: 74 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f 20  t, change it to 
6940: 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61 63 74 20  NULL.  The fact 
6950: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 6e 20  that it is then 
6960: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 0a 2a  a non-negative.*
6970: 2a 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62  * integer will b
6980: 65 20 63 61 75 67 68 74 20 6c 61 74 65 72 2e 20  e caught later. 
6990: 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
69a0: 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c 65 61 76  tant not to leav
69b0: 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 76 61  e.** variable va
69c0: 6c 75 65 73 20 69 6e 20 74 68 65 20 65 78 70 72  lues in the expr
69d0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
69e0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 71 6c  static Expr *sql
69f0: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
6a00: 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
6a10: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
6a20: 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  {.  if( 0==sqlit
6a30: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
6a40: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
6a50: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6a60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
6a70: 70 72 29 3b 0a 20 20 20 20 70 45 78 70 72 20 3d  pr);.    pExpr =
6a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
6a90: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  c(pParse->db, TK
6aa0: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20 20  _NULL, 0, 0);.  
6ab0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
6ac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
6ad0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
6ae0: 20 6e 65 77 20 57 69 6e 64 6f 77 20 6f 62 6a 65   new Window obje
6af0: 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 61 20  ct describing a 
6b00: 57 69 6e 64 6f 77 20 44 65 66 69 6e 69 74 69 6f  Window Definitio
6b10: 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71  n..*/.Window *sq
6b20: 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63  lite3WindowAlloc
6b30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6b40: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
6b50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
6b60: 74 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  t eType,        
6b70: 2f 2a 20 46 72 61 6d 65 20 74 79 70 65 2e 20 54  /* Frame type. T
6b80: 4b 5f 52 41 4e 47 45 20 6f 72 20 54 4b 5f 52 4f  K_RANGE or TK_RO
6b90: 57 53 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61  WS */.  int eSta
6ba0: 72 74 2c 20 20 20 20 20 20 20 2f 2a 20 53 74 61  rt,       /* Sta
6bb0: 72 74 20 74 79 70 65 3a 20 43 55 52 52 45 4e 54  rt type: CURRENT
6bc0: 2c 20 50 52 45 43 45 44 49 4e 47 2c 20 46 4f 4c  , PRECEDING, FOL
6bd0: 4c 4f 57 49 4e 47 2c 20 55 4e 42 4f 55 4e 44 45  LOWING, UNBOUNDE
6be0: 44 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  D */.  Expr *pSt
6bf0: 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72  art,     /* Star
6c00: 74 20 77 69 6e 64 6f 77 20 73 69 7a 65 20 69 66  t window size if
6c10: 20 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 6f 72   TK_PRECEDING or
6c20: 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20   FOLLOWING */.  
6c30: 69 6e 74 20 65 45 6e 64 2c 20 20 20 20 20 20 20  int eEnd,       
6c40: 20 20 2f 2a 20 45 6e 64 20 74 79 70 65 3a 20 43    /* End type: C
6c50: 55 52 52 45 4e 54 2c 20 46 4f 4c 4c 4f 57 49 4e  URRENT, FOLLOWIN
6c60: 47 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c  G, TK_UNBOUNDED,
6c70: 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20   PRECEDING */.  
6c80: 45 78 70 72 20 2a 70 45 6e 64 20 20 20 20 20 20  Expr *pEnd      
6c90: 20 20 2f 2a 20 45 6e 64 20 77 69 6e 64 6f 77 20    /* End window 
6ca0: 73 69 7a 65 20 69 66 20 54 4b 5f 46 4f 4c 4c 4f  size if TK_FOLLO
6cb0: 57 49 4e 47 20 6f 72 20 50 52 45 43 45 44 49 4e  WING or PRECEDIN
6cc0: 47 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  G */.){.  Window
6cd0: 20 2a 70 57 69 6e 20 3d 20 30 3b 0a 0a 20 20 2f   *pWin = 0;..  /
6ce0: 2a 20 50 61 72 73 65 72 20 61 73 73 75 72 65 73  * Parser assures
6cf0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20   the following: 
6d00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
6d10: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 7c 7c 20  pe==TK_RANGE || 
6d20: 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 29  eType==TK_ROWS )
6d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 53 74 61  ;.  assert( eSta
6d40: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c  rt==TK_CURRENT |
6d50: 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45  | eStart==TK_PRE
6d60: 43 45 44 49 4e 47 0a 20 20 20 20 20 20 20 20 20  CEDING.         
6d70: 20 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f    || eStart==TK_
6d80: 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65 53 74  UNBOUNDED || eSt
6d90: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
6da0: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  G );.  assert( e
6db0: 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  End==TK_CURRENT 
6dc0: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  || eEnd==TK_FOLL
6dd0: 4f 57 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20  OWING.          
6de0: 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42   || eEnd==TK_UNB
6df0: 4f 55 4e 44 45 44 20 7c 7c 20 65 45 6e 64 3d 3d  OUNDED || eEnd==
6e00: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 3b 0a  TK_PRECEDING );.
6e10: 20 20 61 73 73 65 72 74 28 20 28 65 53 74 61 72    assert( (eStar
6e20: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
6e30: 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  || eStart==TK_FO
6e40: 4c 4c 4f 57 49 4e 47 29 3d 3d 28 70 53 74 61 72  LLOWING)==(pStar
6e50: 74 21 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  t!=0) );.  asser
6e60: 74 28 20 28 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  t( (eEnd==TK_FOL
6e70: 4c 4f 57 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d  LOWING || eEnd==
6e80: 54 4b 5f 50 52 45 43 45 44 49 4e 47 29 3d 3d 28  TK_PRECEDING)==(
6e90: 70 45 6e 64 21 3d 30 29 20 29 3b 0a 0a 0a 20 20  pEnd!=0) );...  
6ea0: 2f 2a 20 49 66 20 61 20 66 72 61 6d 65 20 69 73  /* If a frame is
6eb0: 20 64 65 63 6c 61 72 65 64 20 22 52 41 4e 47 45   declared "RANGE
6ec0: 22 20 28 6e 6f 74 20 22 52 4f 57 53 22 29 2c 20  " (not "ROWS"), 
6ed0: 74 68 65 6e 20 69 74 20 6d 61 79 20 6e 6f 74 20  then it may not 
6ee0: 75 73 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  use.  ** either 
6ef0: 22 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e  "<expr> PRECEDIN
6f00: 47 22 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f  G" or "<expr> FO
6f10: 4c 4c 4f 57 49 4e 47 22 2e 0a 20 20 2a 2f 0a 20  LLOWING"..  */. 
6f20: 20 69 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52   if( eType==TK_R
6f30: 41 4e 47 45 20 26 26 20 28 70 53 74 61 72 74 21  ANGE && (pStart!
6f40: 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 29 20 29  =0 || pEnd!=0) )
6f50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6f60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 52  orMsg(pParse, "R
6f70: 41 4e 47 45 20 6d 75 73 74 20 75 73 65 20 6f 6e  ANGE must use on
6f80: 6c 79 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20  ly UNBOUNDED or 
6f90: 43 55 52 52 45 4e 54 20 52 4f 57 22 29 3b 0a 20  CURRENT ROW");. 
6fa0: 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c     goto windowAl
6fb0: 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  locErr;.  }..  /
6fc0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
6fd0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e  the.  ** startin
6fe0: 67 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20  g boundary type 
6ff0: 6d 61 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61  may not occur ea
7000: 72 6c 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c  rlier in the fol
7010: 6c 6f 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e  lowing list than
7020: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67  .  ** the ending
7030: 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a   boundary type:.
7040: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f    **.  **   UNBO
7050: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a  UNDED PRECEDING.
7060: 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52    **   <expr> PR
7070: 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43  ECEDING.  **   C
7080: 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20  URRENT ROW.  ** 
7090: 20 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49    <expr> FOLLOWI
70a0: 4e 47 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e  NG.  **   UNBOUN
70b0: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20  DED FOLLOWING.  
70c0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73  **.  ** The pars
70d0: 65 72 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  er ensures that 
70e0: 22 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45  "UNBOUNDED PRECE
70f0: 44 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20  DING" cannot be 
7100: 75 73 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e  used as an endin
7110: 67 0a 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c  g.  ** boundary,
7120: 20 61 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55   and than "UNBOU
7130: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20  NDED FOLLOWING" 
7140: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61  cannot be used a
7150: 73 20 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  s a starting.  *
7160: 2a 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79  * frame boundary
7170: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53  ..  */.  if( (eS
7180: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
7190: 20 26 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45   && eEnd==TK_PRE
71a0: 43 45 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65  CEDING).   || (e
71b0: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
71c0: 49 4e 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b  ING && (eEnd==TK
71d0: 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45  _PRECEDING || eE
71e0: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29  nd==TK_CURRENT))
71f0: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
7200: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7210: 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66  , "unsupported f
7220: 72 61 6d 65 20 64 65 6c 69 6d 69 74 65 72 20 66  rame delimiter f
7230: 6f 72 20 52 4f 57 53 22 29 3b 0a 20 20 20 20 67  or ROWS");.    g
7240: 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45  oto windowAllocE
7250: 72 72 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e 20  rr;.  }..  pWin 
7260: 3d 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74  = (Window*)sqlit
7270: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
7280: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
7290: 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66  f(Window));.  if
72a0: 28 20 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74 6f  ( pWin==0 ) goto
72b0: 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b   windowAllocErr;
72c0: 0a 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d  .  pWin->eType =
72d0: 20 65 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e   eType;.  pWin->
72e0: 65 53 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b  eStart = eStart;
72f0: 0a 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20  .  pWin->eEnd = 
7300: 65 45 6e 64 3b 0a 20 20 70 57 69 6e 2d 3e 70 45  eEnd;.  pWin->pE
7310: 6e 64 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  nd = sqlite3Wind
7320: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61  owOffsetExpr(pPa
7330: 72 73 65 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57  rse, pEnd);.  pW
7340: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  in->pStart = sql
7350: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
7360: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 53 74  Expr(pParse, pSt
7370: 61 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  art);.  return p
7380: 57 69 6e 3b 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f  Win;..windowAllo
7390: 63 45 72 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  cErr:.  sqlite3E
73a0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
73b0: 2d 3e 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 73  ->db, pEnd);.  s
73c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
73d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74  (pParse->db, pSt
73e0: 61 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  art);.  return 0
73f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63  ;.}../*.** Attac
7400: 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  h window object 
7410: 70 57 69 6e 20 74 6f 20 65 78 70 72 65 73 73 69  pWin to expressi
7420: 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  on p..*/.void sq
7430: 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61 63  lite3WindowAttac
7440: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
7450: 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f 77   Expr *p, Window
7460: 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20 70   *pWin){.  if( p
7470: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 69 6e   ){.    if( pWin
7480: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 69   ){.      p->pWi
7490: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20  n = pWin;.      
74a0: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70  pWin->pOwner = p
74b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
74c0: 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
74d0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
74e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
74f0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
7500: 20 22 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f   "DISTINCT is no
7510: 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
7520: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
7530: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
7540: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
7550: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7560: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
7570: 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Win);.  }.}../*.
7580: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  ** Return 0 if t
7590: 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62  he two window ob
75a0: 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69  jects are identi
75b0: 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cal, or non-zero
75c0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49   otherwise..** I
75d0: 64 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20  dentical window 
75e0: 6f 62 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70  objects can be p
75f0: 72 6f 63 65 73 73 65 64 20 69 6e 20 61 20 73 69  rocessed in a si
7600: 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e  ngle scan..*/.in
7610: 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  t sqlite3WindowC
7620: 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50  ompare(Parse *pP
7630: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31  arse, Window *p1
7640: 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20  , Window *p2){. 
7650: 20 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d   if( p1->eType!=
7660: 70 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75  p2->eType ) retu
7670: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e  rn 1;.  if( p1->
7680: 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61  eStart!=p2->eSta
7690: 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rt ) return 1;. 
76a0: 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70   if( p1->eEnd!=p
76b0: 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e  2->eEnd ) return
76c0: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
76d0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
76e0: 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c  rse, p1->pStart,
76f0: 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29   p2->pStart, -1)
7700: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7710: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
7720: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
7730: 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64  ->pEnd, p2->pEnd
7740: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
7750: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
7760: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
7770: 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70  1->pPartition, p
7780: 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d  2->pPartition, -
7790: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
77a0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
77b0: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e  ListCompare(p1->
77c0: 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f  pOrderBy, p2->pO
77d0: 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65  rderBy, -1) ) re
77e0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
77f0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   0;.}.../*.** Th
7800: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  is is called by 
7810: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
7820: 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73   before it calls
7830: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
7840: 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e  in().** to begin
7850: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
7860: 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  gh the sub-query
7870: 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20   results. It is 
7880: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
7890: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
78a0: 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ze registers and
78b0: 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62 79   cursors used by
78c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
78d0: 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  deStep()..*/.voi
78e0: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  d sqlite3WindowC
78f0: 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70  odeInit(Parse *p
7900: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
7910: 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20  MWin){.  Window 
7920: 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  *pWin;.  Vdbe *v
7930: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
7940: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
7950: 20 6e 50 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d   nPart = (pMWin-
7960: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d  >pPartition ? pM
7970: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d  Win->pPartition-
7980: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e  >nExpr : 0);.  n
7990: 50 61 72 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e  Part += (pMWin->
79a0: 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e  pOrderBy ? pMWin
79b0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
79c0: 72 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 50  r : 0);.  if( nP
79d0: 61 72 74 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e  art ){.    pMWin
79e0: 2d 3e 72 65 67 50 61 72 74 20 3d 20 70 50 61 72  ->regPart = pPar
79f0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7a00: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
7a10: 6e 50 61 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  nPart;.    sqlit
7a20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7a30: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69  OP_Null, 0, pMWi
7a40: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69  n->regPart, pMWi
7a50: 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61 72 74  n->regPart+nPart
7a60: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  -1);.  }..  for(
7a70: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
7a80: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
7a90: 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63  xtWin){.    Func
7aa0: 44 65 66 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70  Def *p = pWin->p
7ab0: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 28 70  Func;.    if( (p
7ac0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
7ad0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
7ae0: 29 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72  ) && pWin->eStar
7af0: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
7b00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
7b10: 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f 6e 73 20  inline versions 
7b20: 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  of min() and max
7b30: 28 29 20 72 65 71 75 69 72 65 20 61 20 73 69 6e  () require a sin
7b40: 67 6c 65 20 65 70 68 65 6d 65 72 61 6c 0a 20 20  gle ephemeral.  
7b50: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
7b60: 20 33 20 72 65 67 69 73 74 65 72 73 2e 20 54 68   3 registers. Th
7b70: 65 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  e registers are 
7b80: 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  used as follows:
7b90: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
7ba0: 2a 2a 20 20 20 72 65 67 41 70 70 2b 30 3a 20 73  **   regApp+0: s
7bb0: 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28  lot to copy min(
7bc0: 29 2f 6d 61 78 28 29 20 61 72 67 75 6d 65 6e 74  )/max() argument
7bd0: 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f   to for MakeReco
7be0: 72 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  rd.      **   re
7bf0: 67 41 70 70 2b 31 3a 20 69 6e 74 65 67 65 72 20  gApp+1: integer 
7c00: 76 61 6c 75 65 20 75 73 65 64 20 74 6f 20 65 6e  value used to en
7c10: 73 75 72 65 20 6b 65 79 73 20 61 72 65 20 75 6e  sure keys are un
7c20: 69 71 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20  ique.      **   
7c30: 72 65 67 41 70 70 2b 32 3a 20 6f 75 74 70 75 74  regApp+2: output
7c40: 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20   of MakeRecord. 
7c50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
7c60: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
7c70: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
7c80: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 4b 65 79  pList;.      Key
7c90: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
7ca0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
7cb0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
7cc0: 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c 20 30 29  se, pList, 0, 0)
7cd0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73  ;.      pWin->cs
7ce0: 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rApp = pParse->n
7cf0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69  Tab++;.      pWi
7d00: 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72  n->regApp = pPar
7d10: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7d20: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
7d30: 3d 20 33 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 3;.      if( p
7d40: 4b 65 79 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d  KeyInfo && pWin-
7d50: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d  >pFunc->zName[1]
7d60: 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 20  =='i' ){.       
7d70: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
7d80: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  o->aSortOrder[0]
7d90: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
7da0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
7db0: 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20  der[0] = 1;.    
7dc0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7dd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7de0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
7df0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32   pWin->csrApp, 2
7e00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7e10: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
7e20: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
7e30: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c  INFO);.      sql
7e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7e50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
7e60: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29   pWin->regApp+1)
7e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
7e80: 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e   if( p->zName==n
7e90: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20  th_valueName || 
7ea0: 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f  p->zName==first_
7eb0: 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20  valueName ){.   
7ec0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
7ed0: 77 6f 20 72 65 67 69 73 74 65 72 73 20 61 74 20  wo registers at 
7ee0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e 20 54 68  pWin->regApp. Th
7ef0: 65 73 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ese will be used
7f00: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f   to.      ** sto
7f10: 72 65 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  re the start and
7f20: 20 65 6e 64 20 69 6e 64 65 78 20 6f 66 20 74 68   end index of th
7f30: 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e  e current frame.
7f40: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
7f50: 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t( pMWin->iEphCs
7f60: 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  r );.      pWin-
7f70: 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72 73 65  >regApp = pParse
7f80: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
7f90: 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70  pWin->csrApp = p
7fa0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
7fb0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
7fc0: 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  m += 2;.      sq
7fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7fe0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7ff0: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57  Win->csrApp, pMW
8000: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
8010: 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28    }.    else if(
8020: 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e   p->zName==leadN
8030: 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d  ame || p->zName=
8040: 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20  =lagName ){.    
8050: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
8060: 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20  >iEphCsr );.    
8070: 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d    pWin->csrApp =
8080: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
8090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
80a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
80b0: 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73  penDup, pWin->cs
80c0: 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rApp, pMWin->iEp
80d0: 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hCsr);.    }.  }
80e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45  .}../*.** A "PRE
80f0: 43 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28  CEDING <expr>" (
8100: 65 43 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f  eCond==0) or "FO
8110: 4c 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20  LLOWING <expr>" 
8120: 28 65 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68  (eCond==1) or th
8130: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
8140: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8150: 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29  t to nth_value()
8160: 20 28 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20   (eCond==2) has 
8170: 6a 75 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61  just been.** eva
8180: 6c 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  luated and the r
8190: 65 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65  esult left in re
81a0: 67 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73  gister reg. This
81b0: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
81c0: 74 65 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74  tes VM.** code t
81d0: 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
81e0: 20 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d   value is a non-
81f0: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
8200: 20 61 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a   and throws an.*
8210: 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69  * exception if i
8220: 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  t is not..*/.sta
8230: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
8240: 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 50 61 72  heckIntValue(Par
8250: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
8260: 72 65 67 2c 20 69 6e 74 20 65 43 6f 6e 64 29 7b  reg, int eCond){
8270: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
8280: 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20  char *azErr[] = 
8290: 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  {.    "frame sta
82a0: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
82b0: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
82c0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
82d0: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
82e0: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
82f0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
8300: 74 65 67 65 72 22 2c 0a 20 20 20 20 22 73 65 63  teger",.    "sec
8310: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
8320: 6e 74 68 5f 76 61 6c 75 65 20 6d 75 73 74 20 62  nth_value must b
8330: 65 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74  e a positive int
8340: 65 67 65 72 22 0a 20 20 7d 3b 0a 20 20 73 74 61  eger".  };.  sta
8350: 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d 20  tic int aOp[] = 
8360: 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c 20  { OP_Ge, OP_Ge, 
8370: 4f 50 5f 47 74 20 7d 3b 0a 20 20 56 64 62 65 20  OP_Gt };.  Vdbe 
8380: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
8390: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
83a0: 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c  nt regZero = sql
83b0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
83c0: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
83d0: 28 20 65 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43  ( eCond==0 || eC
83e0: 6f 6e 64 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d  ond==1 || eCond=
83f0: 3d 32 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =2 );.  sqlite3V
8400: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8410: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 5a  Integer, 0, regZ
8420: 65 72 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ero);.  sqlite3V
8430: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8440: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 2c 20  MustBeInt, reg, 
8450: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
8460: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
8470: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8480: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
8490: 64 4f 70 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e  dOp3(v, aOp[eCon
84a0: 64 5d 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c  d], regZero, sql
84b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
84c0: 64 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a  ddr(v)+2, reg);.
84d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
84e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
84f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c  AddOp2(v, OP_Hal
8500: 74 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  t, SQLITE_ERROR,
8510: 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71   OE_Abort);.  sq
8520: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
8530: 34 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72  4(v, (void*)azEr
8540: 72 5b 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41  r[eCond], P4_STA
8550: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  TIC);.  sqlite3R
8560: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
8570: 61 72 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a  arse, regZero);.
8580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8590: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  the number of ar
85a0: 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
85b0: 6f 20 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e  o the window-fun
85c0: 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ction associated
85d0: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a  .** with the obj
85e0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
85f0: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
8600: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
8610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8620: 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57  windowArgCount(W
8630: 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20  indow *pWin){.  
8640: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
8650: 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  = pWin->pOwner->
8660: 78 2e 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72  x.pList;.  retur
8670: 6e 20 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  n (pList ? pList
8680: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a  ->nExpr : 0);.}.
8690: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
86a0: 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b  VM code to invok
86b0: 65 20 65 69 74 68 65 72 20 78 53 74 65 70 28 29  e either xStep()
86c0: 20 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73   (if bInverse is
86d0: 20 30 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65   0) or .** xInve
86e0: 72 73 65 20 28 69 66 20 62 49 6e 76 65 72 73 65  rse (if bInverse
86f0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f   is non-zero) fo
8700: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
8710: 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a  nction in the .*
8720: 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  * linked list st
8730: 61 72 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e  arting at pMWin.
8740: 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69   Or, for built-i
8750: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
8760: 6e 73 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f  ns.** that do no
8770: 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61  t use the standa
8780: 72 64 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c  rd function API,
8790: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65   generate the re
87a0: 71 75 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65  quired.** inline
87b0: 20 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20   VM code..**.** 
87c0: 49 66 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20  If argument csr 
87d0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
87e0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74  or equal to 0, t
87f0: 68 65 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67  hen argument reg
8800: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
8810: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20   register in an 
8820: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
8830: 72 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  rs guaranteed to
8840: 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
8850: 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
8860: 61 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  array of argumen
8870: 74 73 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63  ts for each func
8880: 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
8890: 73 65 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  se.** the argume
88a0: 6e 74 73 20 61 72 65 20 65 78 74 72 61 63 74 65  nts are extracte
88b0: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
88c0: 6e 74 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e  nt row of csr in
88d0: 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  to the.** array 
88e0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65 66  of registers bef
88f0: 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f  ore invoking OP_
8900: 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67  AggStep or OP_Ag
8910: 67 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f  gInverse.**.** O
8920: 72 2c 20 69 66 20 63 73 72 20 69 73 20 6c 65 73  r, if csr is les
8930: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
8940: 6e 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72  n the array of r
8950: 65 67 69 73 74 65 72 73 20 61 74 20 72 65 67 20  egisters at reg 
8960: 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f  is.** already po
8970: 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c  pulated with all
8980: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
8990: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
89a0: 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
89b0: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
89c0: 74 20 72 65 67 50 61 72 74 53 69 7a 65 20 69 73  t regPartSize is
89d0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
89e0: 69 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72  it is a register
89f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a   containing the.
8a00: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
8a10: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
8a20: 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73   partition..*/.s
8a30: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
8a40: 77 41 67 67 53 74 65 70 28 0a 20 20 50 61 72 73  wAggStep(.  Pars
8a50: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69  e *pParse, .  Wi
8a60: 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20  ndow *pMWin,    
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a80: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
8a90: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
8aa0: 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20   */.  int csr,  
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72        /* Read ar
8ad0: 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69  guments from thi
8ae0: 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  s cursor */.  in
8af0: 74 20 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20  t bInverse,     
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b10: 20 54 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20   True to invoke 
8b20: 78 49 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64  xInverse instead
8b30: 20 6f 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69   of xStep */.  i
8b40: 6e 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20  nt reg,         
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b60: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73  * Array of regis
8b70: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ters */.  int re
8b80: 67 50 61 72 74 53 69 7a 65 20 20 20 20 20 20 20  gPartSize       
8b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
8ba0: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
8bb0: 20 73 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69   size of partiti
8bc0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  on */.){.  Vdbe 
8bd0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
8be0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
8bf0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
8c00: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
8c10: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
8c20: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69  pNextWin){.    i
8c30: 6e 74 20 66 6c 61 67 73 20 3d 20 70 57 69 6e 2d  nt flags = pWin-
8c40: 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
8c50: 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 72  s;.    int regAr
8c60: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20  g;.    int nArg 
8c70: 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  = windowArgCount
8c80: 28 70 57 69 6e 29 3b 0a 0a 20 20 20 20 69 66 28  (pWin);..    if(
8c90: 20 63 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20   csr>=0 ){.     
8ca0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
8cb0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
8cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
8cd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8ce0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72  , OP_Column, csr
8cf0: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b  , pWin->iArgCol+
8d00: 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20  i, reg+i);.     
8d10: 20 7d 0a 20 20 20 20 20 20 72 65 67 41 72 67 20   }.      regArg 
8d20: 3d 20 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28  = reg;.      if(
8d30: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
8d40: 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45  FUNC_WINDOW_SIZE
8d50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
8d60: 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nArg==0 ){.     
8d70: 20 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65       regArg = re
8d80: 67 50 61 72 74 53 69 7a 65 3b 0a 20 20 20 20 20  gPartSize;.     
8d90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8da0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8db0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
8dc0: 79 2c 20 72 65 67 50 61 72 74 53 69 7a 65 2c 20  y, regPartSize, 
8dd0: 72 65 67 2b 6e 41 72 67 29 3b 0a 20 20 20 20 20  reg+nArg);.     
8de0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 72     }.        nAr
8df0: 67 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g++;.      }.   
8e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
8e10: 73 65 72 74 28 20 21 28 66 6c 61 67 73 20 26 20  sert( !(flags & 
8e20: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
8e30: 4f 57 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20  OW_SIZE) );.    
8e40: 20 20 72 65 67 41 72 67 20 3d 20 72 65 67 20 2b    regArg = reg +
8e50: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a   pWin->iArgCol;.
8e60: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
8e70: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
8e80: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
8e90: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20  FUNC_MINMAX) .  
8ea0: 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74      && pWin->eSt
8eb0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
8ec0: 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  D .    ){.      
8ed0: 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d  int addrIsNull =
8ee0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ef0: 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
8f00: 20 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20   regArg);.      
8f10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8f20: 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 76 65  .      if( bInve
8f30: 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rse==0 ){.      
8f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8f50: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
8f60: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
8f70: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
8f80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8f90: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67  v, OP_SCopy, reg
8fa0: 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Arg, pWin->regAp
8fb0: 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
8fc0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8fd0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8fe0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c  pWin->regApp, 2,
8ff0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29   pWin->regApp+2)
9000: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9010: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9020: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69  P_IdxInsert, pWi
9030: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d  n->csrApp, pWin-
9040: 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20  >regApp+2);.    
9050: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9070: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b  p4Int(v, OP_Seek
9080: 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  GE, pWin->csrApp
9090: 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b  , 0, regArg, 1);
90a0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
90b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
90c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
90d0: 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
90e0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b  , pWin->csrApp);
90f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9100: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
9110: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9120: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
9130: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9140: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9150: 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a  v, addrIsNull);.
9160: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
9170: 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20  in->regApp ){.  
9180: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
9190: 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ->pFunc->zName==
91a0: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  nth_valueName.  
91b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69 6e           || pWin
91c0: 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ->pFunc->zName==
91d0: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a  first_valueName.
91e0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
91f0: 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d  ssert( bInverse=
9200: 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d  =0 || bInverse==
9210: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
9220: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9230: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d  OP_AddImm, pWin-
9240: 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72  >regApp+1-bInver
9250: 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  se, 1);.    }els
9260: 65 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e  e if( pWin->pFun
9270: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61  c->zName==leadNa
9280: 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  me.           ||
9290: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e   pWin->pFunc->zN
92a0: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a 20 20 20  ame==lagName.   
92b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d   ){.      /* no-
92c0: 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  op */.    }else{
92d0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
92e0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  f = 0;.      if(
92f0: 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29   pWin->pFilter )
9300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
9310: 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  gTmp;.        as
9320: 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c  sert( nArg==0 ||
9330: 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77   nArg==pWin->pOw
9340: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  ner->x.pList->nE
9350: 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61  xpr );.        a
9360: 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20 70  ssert( nArg || p
9370: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
9380: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
9390: 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a     if( csr>0 ){.
93a0: 20 20 20 20 20 20 20 20 20 20 72 65 67 54 6d 70            regTmp
93b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
93c0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
93d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
93e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
93f0: 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69  Column, csr, pWi
9400: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72 67 2c  n->iArgCol+nArg,
9410: 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20  regTmp);.       
9420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9430: 20 20 72 65 67 54 6d 70 20 3d 20 72 65 67 41 72    regTmp = regAr
9440: 67 20 2b 20 6e 41 72 67 3b 0a 20 20 20 20 20 20  g + nArg;.      
9450: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
9460: 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  If = sqlite3Vdbe
9470: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
9480: 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20 31  ot, regTmp, 0, 1
9490: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
94a0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
94b0: 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b      if( csr>0 ){
94c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
94d0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
94e0: 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70 29  (pParse, regTmp)
94f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9500: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57    }.      if( pW
9510: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
9520: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
9530: 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
9540: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
9550: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61  pColl;.        a
9560: 73 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29 3b  ssert( nArg>0 );
9570: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
9580: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f   sqlite3ExprNNCo
9590: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 57  llSeq(pParse, pW
95a0: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
95b0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
95c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
95d0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
95e0: 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30  P_CollSeq, 0,0,0
95f0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
9600: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
9610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9630: 70 33 28 76 2c 20 62 49 6e 76 65 72 73 65 3f 20  p3(v, bInverse? 
9640: 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 20 3a 20  OP_AggInverse : 
9650: 4f 50 5f 41 67 67 53 74 65 70 2c 20 0a 20 20 20  OP_AggStep, .   
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 20 20 20 62 49 6e 76 65 72 73 65 2c 20 72       bInverse, r
9680: 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67  egArg, pWin->reg
9690: 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73 71  Accum);.      sq
96a0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
96b0: 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63  4(v, pWin->pFunc
96c0: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
96d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96e0: 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
96f0: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  nArg);.      if(
9700: 20 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65   addrIf ) sqlite
9710: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
9720: 20 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a   addrIf);.    }.
9730: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
9740: 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f  erate VM code to
9750: 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78   invoke either x
9760: 56 61 6c 75 65 28 29 20 28 62 46 69 6e 61 6c 3d  Value() (bFinal=
9770: 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c 69 7a 65  =0) or xFinalize
9780: 28 29 0a 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d 31  ().** (bFinal==1
9790: 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  ) for each windo
97a0: 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  w function in th
97b0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
97c0: 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70 4d 57  arting at.** pMW
97d0: 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c  in. Or, for buil
97e0: 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63  t-in window-func
97f0: 74 69 6f 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f  tions that do no
9800: 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61  t use the standa
9810: 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e 65 72  rd.** API, gener
9820: 61 74 65 20 74 68 65 20 65 71 75 69 76 61 6c 65  ate the equivale
9830: 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a 73  nt VM code..*/.s
9840: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
9850: 77 41 67 67 46 69 6e 61 6c 28 50 61 72 73 65 20  wAggFinal(Parse 
9860: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
9870: 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46 69 6e  *pMWin, int bFin
9880: 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  al){.  Vdbe *v =
9890: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
98a0: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
98b0: 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28  w *pWin;..  for(
98c0: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
98d0: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
98e0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20  xtWin){.    if( 
98f0: 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75  (pWin->pFunc->fu
9900: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
9910: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20  _FUNC_MINMAX) . 
9920: 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74      && pWin->eSt
9930: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
9940: 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  D .    ){.      
9950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9960: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
9970: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
9980: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9990: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
99a0: 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72  _Last, pWin->csr
99b0: 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  App);.      Vdbe
99c0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
99d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
99e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
99f0: 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  n, pWin->csrApp,
9a00: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
9a10: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
9a20: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9a30: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
9a40: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b  rrentAddr(v)-2);
9a50: 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61  .      if( bFina
9a60: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
9a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
9a80: 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
9a90: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b  , pWin->csrApp);
9aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
9ab0: 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67  se if( pWin->reg
9ac0: 41 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c 73 65  App ){.    }else
9ad0: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e  {.      if( bFin
9ae0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
9af0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9b00: 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
9b10: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20  pWin->regAccum, 
9b20: 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70  windowArgCount(p
9b30: 57 69 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 73  Win));.        s
9b40: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
9b50: 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e  P4(v, pWin->pFun
9b60: 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
9b70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9b80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9b90: 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41  Copy, pWin->regA
9ba0: 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52  ccum, pWin->regR
9bb0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
9bc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9bd0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
9be0: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
9bf0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9c00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9c10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
9c20: 67 67 56 61 6c 75 65 2c 20 70 57 69 6e 2d 3e 72  ggValue, pWin->r
9c30: 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41  egAccum, windowA
9c40: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 2c 0a 20  rgCount(pWin),. 
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 69 6e              pWin
9c70: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
9c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9c90: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69  eAppendP4(v, pWi
9ca0: 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  n->pFunc, P4_FUN
9cb0: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  CDEF);.      }. 
9cc0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9cd0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9ce0: 67 65 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64  generates VM cod
9cf0: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  e to invoke the 
9d00: 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 61  sub-routine at a
9d10: 64 64 72 65 73 73 0a 2a 2a 20 6c 62 6c 46 6c 75  ddress.** lblFlu
9d20: 73 68 50 61 72 74 20 6f 6e 63 65 20 66 6f 72 20  shPart once for 
9d30: 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 77  each partition w
9d40: 69 74 68 20 74 68 65 20 65 6e 74 69 72 65 20 70  ith the entire p
9d50: 61 72 74 69 74 69 6f 6e 20 63 61 63 68 65 64 20  artition cached 
9d60: 69 6e 0a 2a 2a 20 74 68 65 20 57 69 6e 64 6f 77  in.** the Window
9d70: 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20 74 61  .iEphCsr temp ta
9d80: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
9d90: 6f 69 64 20 77 69 6e 64 6f 77 50 61 72 74 69 74  oid windowPartit
9da0: 69 6f 6e 43 61 63 68 65 28 0a 20 20 50 61 72 73  ionCache(.  Pars
9db0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 65 6c  e *pParse,.  Sel
9dc0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9de0: 54 68 65 20 72 65 77 72 69 74 74 65 6e 20 53 45  The rewritten SE
9df0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
9e00: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
9e10: 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  WInfo,          
9e20: 20 20 20 20 2f 2a 20 57 68 65 72 65 49 6e 66 6f      /* WhereInfo
9e30: 20 74 6f 20 63 61 6c 6c 20 57 68 65 72 65 45 6e   to call WhereEn
9e40: 64 28 29 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  d() on */.  int 
9e50: 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 20 20  regFlushPart,   
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9e70: 65 67 69 73 74 65 72 20 74 6f 20 75 73 65 20 77  egister to use w
9e80: 69 74 68 20 47 6f 73 75 62 20 6c 62 6c 46 6c 75  ith Gosub lblFlu
9e90: 73 68 50 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20  shPart */.  int 
9ea0: 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 20 20  lblFlushPart,   
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9ec0: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 47 6f 73  ubroutine to Gos
9ed0: 75 62 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a  ub to */.  int *
9ee0: 70 52 65 67 53 69 7a 65 20 20 20 20 20 20 20 20  pRegSize        
9ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
9f00: 54 3a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  T: Register cont
9f10: 61 69 6e 69 6e 67 20 70 61 72 74 69 74 69 6f 6e  aining partition
9f20: 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 57 69   size */.){.  Wi
9f30: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
9f40: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
9f50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
9f60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
9f70: 20 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53   iSubCsr = p->pS
9f80: 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
9f90: 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70  ;.  int nSub = p
9fa0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
9fb0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b  b->nCol;.  int k
9fc0: 3b 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70  ;..  int reg = p
9fd0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9fe0: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d   int regRecord =
9ff0: 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74   reg+nSub;.  int
a000: 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52   regRowid = regR
a010: 65 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70 52 65  ecord+1;..  *pRe
a020: 67 53 69 7a 65 20 3d 20 72 65 67 52 6f 77 69 64  gSize = regRowid
a030: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
a040: 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20   += nSub + 2;.. 
a050: 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20   /* Martial the 
a060: 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20  row returned by 
a070: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69  the sub-select i
a080: 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
a090: 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 2e  .  ** registers.
a0a0: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
a0b0: 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20  <nSub; k++){.   
a0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a0d0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
a0e0: 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67   iSubCsr, k, reg
a0f0: 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  +k);.  }.  sqlit
a100: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a110: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
a120: 65 67 2c 20 6e 53 75 62 2c 20 72 65 67 52 65 63  eg, nSub, regRec
a130: 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ord);..  /* Chec
a140: 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  k if this is the
a150: 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20   start of a new 
a160: 70 61 72 74 69 74 69 6f 6e 2e 20 49 66 20 73 6f  partition. If so
a170: 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
a180: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20  flush_partition 
a190: 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 20 2a 2f  sub-routine.  */
a1a0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50  .  if( pMWin->pP
a1b0: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20  artition ){.    
a1c0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78  int addr;.    Ex
a1d0: 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20  prList *pPart = 
a1e0: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
a1f0: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74  n;.    int nPart
a200: 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b   = pPart->nExpr;
a210: 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50  .    int regNewP
a220: 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57 69  art = reg + pMWi
a230: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20  n->nBufferCol;. 
a240: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
a250: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
a260: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
a270: 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c  t(pParse, pPart,
a280: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61 64 64   0, 0);..    add
a290: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
a2a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
a2b0: 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c  are, regNewPart,
a2c0: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
a2d0: 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  nPart);.    sqli
a2e0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
a2f0: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
a300: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
a310: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a320: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
a330: 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b  p, addr+2, addr+
a340: 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  4, addr+2);.    
a350: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a370: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
a380: 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  y, regNewPart, p
a390: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e  MWin->regPart, n
a3a0: 50 61 72 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Part-1);.    sql
a3b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a3c0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46  , OP_Gosub, regF
a3d0: 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75  lushPart, lblFlu
a3e0: 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20  shPart);.  }..  
a3f0: 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63 75  /* Buffer the cu
a400: 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68 65  rrent row in the
a410: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
a420: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  . */.  sqlite3Vd
a430: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
a440: 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e  ewRowid, pMWin->
a450: 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f 77 69  iEphCsr, regRowi
a460: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
a470: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
a480: 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  sert, pMWin->iEp
a490: 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  hCsr, regRecord,
a4a0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f   regRowid);..  /
a4b0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 69 6e 70  * End of the inp
a4c0: 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  ut loop */.  sql
a4d0: 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
a4e0: 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  nfo);..  /* Invo
a4f0: 6b 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74  ke "flush_partit
a500: 69 6f 6e 22 20 74 6f 20 64 65 61 6c 20 77 69 74  ion" to deal wit
a510: 68 20 74 68 65 20 66 69 6e 61 6c 20 28 6f 72 20  h the final (or 
a520: 6f 6e 6c 79 29 20 70 61 72 74 69 74 69 6f 6e 20  only) partition 
a530: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
a540: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
a550: 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  ub, regFlushPart
a560: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
a570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
a580: 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
a590: 20 61 74 20 72 65 67 47 6f 73 75 62 20 28 67 65   at regGosub (ge
a5a0: 6e 65 72 61 74 65 64 20 62 79 20 63 6f 64 65 20  nerated by code 
a5b0: 69 6e 20 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a  in select.c) to.
a5c0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  ** return the cu
a5d0: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e  rrent row of Win
a5e0: 64 6f 77 2e 69 45 70 68 43 73 72 2e 20 49 66 20  dow.iEphCsr. If 
a5f0: 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  all window funct
a600: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67 72  ions are.** aggr
a610: 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e  egate window fun
a620: 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20  ctions that use 
a630: 74 68 65 20 73 74 61 6e 64 61 72 64 20 41 50 49  the standard API
a640: 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50  , a single.** OP
a650: 5f 47 6f 73 75 62 20 69 6e 73 74 72 75 63 74 69  _Gosub instructi
a660: 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61 74 20 74  on is all that t
a670: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
a680: 72 61 74 65 73 2e 20 45 78 74 72 61 20 56 4d 20  rates. Extra VM 
a690: 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d  code.** for per-
a6a0: 72 6f 77 20 70 72 6f 63 65 73 73 69 6e 67 20 69  row processing i
a6b0: 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64  s only generated
a6c0: 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69   for the followi
a6d0: 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  ng built-in wind
a6e0: 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  ow.** functions:
a6f0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c  .**.**   nth_val
a700: 75 65 28 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f  ue().**   first_
a710: 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67  value().**   lag
a720: 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a  ().**   lead().*
a730: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
a740: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
a750: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a760: 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  e,.  Window *pMW
a770: 69 6e 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73  in,.  int regGos
a780: 75 62 2c 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  ub,.  int addrGo
a790: 73 75 62 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76  sub.){.  Vdbe *v
a7a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a7b0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
a7c0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72  dow *pWin;.  for
a7d0: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
a7e0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
a7f0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e  extWin){.    Fun
a800: 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57  cDef *pFunc = pW
a810: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69  in->pFunc;.    i
a820: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
a830: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  =nth_valueName. 
a840: 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e      || pFunc->zN
a850: 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  ame==first_value
a860: 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Name.    ){.    
a870: 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e    int csr = pWin
a880: 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20  ->csrApp;.      
a890: 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65  int lbl = sqlite
a8a0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a8b0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70  );.      int tmp
a8c0: 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
a8d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a8e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a8f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
a900: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
a910: 67 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20  gResult);..     
a920: 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d   if( pFunc->zNam
a930: 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
a940: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a950: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a960: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69   OP_Column, pMWi
a970: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 57 69 6e  n->iEphCsr, pWin
a980: 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52  ->iArgCol+1,tmpR
a990: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  eg);.        win
a9a0: 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65  dowCheckIntValue
a9b0: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 2c  (pParse, tmpReg,
a9c0: 20 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   2);.      }else
a9d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a9e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a9f0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d  P_Integer, 1, tm
aa00: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pReg);.      }. 
aa10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aa20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
aa30: 2c 20 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e  , tmpReg, pWin->
aa40: 72 65 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b  regApp, tmpReg);
aa50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aa60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47  beAddOp3(v, OP_G
aa70: 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  t, pWin->regApp+
aa80: 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b  1, lbl, tmpReg);
aa90: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
aaa0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
aab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
aac0: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
aad0: 20 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65   csr, lbl, tmpRe
aae0: 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
aaf0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
ab00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab10: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
ab20: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
ab30: 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  Col, pWin->regRe
ab40: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
ab50: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
ab60: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
ab70: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ab80: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ab90: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d  , tmpReg);.    }
aba0: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46  .    else if( pF
abb0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
abc0: 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a  Name || pFunc->z
abd0: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b  Name==lagName ){
abe0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20  .      int nArg 
abf0: 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  = pWin->pOwner->
ac00: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  x.pList->nExpr;.
ac10: 20 20 20 20 20 20 69 6e 74 20 69 45 70 68 20 3d        int iEph =
ac20: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b   pMWin->iEphCsr;
ac30: 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d  .      int csr =
ac40: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20   pWin->csrApp;. 
ac50: 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73       int lbl = s
ac60: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ac70: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
ac80: 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74  t tmpReg = sqlit
ac90: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
aca0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  rse);..      if(
acb0: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 20   nArg<3 ){.     
acc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
acd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
ace0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
acf0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
ad00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
ad10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ad20: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
ad30: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32   pWin->iArgCol+2
ad40: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
ad50: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
ad60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ad70: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
ad80: 20 69 45 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a   iEph, tmpReg);.
ad90: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
ada0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
adb0: 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e  val = (pFunc->zN
adc0: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20  ame==leadName ? 
add0: 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  1 : -1);.       
ade0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
adf0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
ae00: 20 74 6d 70 52 65 67 2c 20 76 61 6c 29 3b 0a 20   tmpReg, val);. 
ae10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ae20: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 46      int op = (pF
ae30: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
ae40: 4e 61 6d 65 20 3f 20 4f 50 5f 41 64 64 20 3a 20  Name ? OP_Add : 
ae50: 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a 20 20  OP_Subtract);.  
ae60: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67        int tmpReg
ae70: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
ae80: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
ae90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aea0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
aeb0: 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69  olumn, iEph, pWi
aec0: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d  n->iArgCol+1, tm
aed0: 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20  pReg2);.        
aee0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aef0: 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32  3(v, op, tmpReg2
af00: 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65 67  , tmpReg, tmpReg
af10: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
af20: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
af30: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 32  (pParse, tmpReg2
af40: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
af50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
af60: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
af70: 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74  wid, csr, lbl, t
af80: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64  mpReg);.      Vd
af90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
afa0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
afb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
afc0: 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e  umn, csr, pWin->
afd0: 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72  iArgCol, pWin->r
afe0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
aff0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b000: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
b010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b020: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b030: 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20  arse, tmpReg);. 
b040: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
b050: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b060: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
b070: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
b080: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
b090: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
b0a0: 65 64 20 62 79 20 77 69 6e 64 6f 77 52 65 74 75  ed by windowRetu
b0b0: 72 6e 4f 6e 65 52 6f 77 28 29 20 61 6e 64 2c 20  rnOneRow() and, 
b0c0: 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a  optionally, the.
b0d0: 2a 2a 20 78 49 6e 76 65 72 73 65 28 29 20 66 75  ** xInverse() fu
b0e0: 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  nction for each 
b0f0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2c  window function,
b100: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
b110: 20 72 6f 77 73 0a 2a 2a 20 66 72 6f 6d 20 74 68   rows.** from th
b120: 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72  e Window.iEphCsr
b130: 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 54 68 69   temp table. Thi
b140: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
b150: 74 65 73 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 73  tes VM code.** s
b160: 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
b170: 20 20 20 77 68 69 6c 65 28 20 72 65 67 43 74 72     while( regCtr
b180: 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 67  >0 ){.**     reg
b190: 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20 20 20 77 69  Ctr--;.**     wi
b1a0: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
b1b0: 28 29 0a 2a 2a 20 20 20 20 20 69 66 28 20 62 49  ().**     if( bI
b1c0: 6e 76 65 72 73 65 20 29 7b 0a 2a 2a 20 20 20 20  nverse ){.**    
b1d0: 20 20 20 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a     AggInverse.**
b1e0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 4e 65       }.**     Ne
b1f0: 78 74 20 28 57 69 6e 64 6f 77 2e 69 45 70 68 43  xt (Window.iEphC
b200: 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 73 74  sr).**   }.*/.st
b210: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
b220: 52 65 74 75 72 6e 52 6f 77 73 28 0a 20 20 50 61  ReturnRows(.  Pa
b230: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57  rse *pParse,.  W
b240: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20  indow *pMWin,   
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b260: 2a 20 4c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77  * List of window
b270: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
b280: 69 6e 74 20 72 65 67 43 74 72 2c 20 20 20 20 20  int regCtr,     
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  /* Register cont
b2b0: 61 69 6e 69 6e 67 20 6e 75 6d 62 65 72 20 6f 66  aining number of
b2c0: 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 72   rows */.  int r
b2d0: 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20  egGosub,        
b2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b2f0: 67 69 73 74 65 72 20 66 6f 72 20 47 6f 73 75 62  gister for Gosub
b300: 20 61 64 64 72 47 6f 73 75 62 20 2a 2f 0a 20 20   addrGosub */.  
b310: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 2c 20 20  int addrGosub,  
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 73 75  /* Address of su
b340: 62 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20 52 65  b-routine for Re
b350: 74 75 72 6e 4f 6e 65 52 6f 77 20 2a 2f 0a 20 20  turnOneRow */.  
b360: 69 6e 74 20 72 65 67 49 6e 76 41 72 67 2c 20 20  int regInvArg,  
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67 69  /* Array of regi
b390: 73 74 65 72 73 20 66 6f 72 20 78 49 6e 76 65 72  sters for xInver
b3a0: 73 65 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74  se args */.  int
b3b0: 20 72 65 67 49 6e 76 53 69 7a 65 20 20 20 20 20   regInvSize     
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b3d0: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
b3e0: 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61 72 74  ing size of part
b3f0: 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ition */.){.  in
b400: 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65 20 2a  t addr;.  Vdbe *
b410: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
b420: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 77 69  be(pParse);.  wi
b430: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
b440: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a  rse, pMWin, 0);.
b450: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
b460: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b470: 5f 49 66 50 6f 73 2c 20 72 65 67 43 74 72 2c 20  _IfPos, regCtr, 
b480: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
b490: 6e 74 41 64 64 72 28 76 29 2b 32 20 2c 31 29 3b  ntAddr(v)+2 ,1);
b4a0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
b4b0: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
b4c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
b4d0: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 77 69 6e  to, 0, 0);.  win
b4e0: 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28  dowReturnOneRow(
b4f0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72  pParse, pMWin, r
b500: 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
b510: 75 62 29 3b 0a 20 20 69 66 28 20 72 65 67 49 6e  ub);.  if( regIn
b520: 76 41 72 67 20 29 7b 0a 20 20 20 20 77 69 6e 64  vArg ){.    wind
b530: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
b540: 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e  , pMWin, pMWin->
b550: 69 45 70 68 43 73 72 2c 20 31 2c 20 72 65 67 49  iEphCsr, 1, regI
b560: 6e 76 41 72 67 2c 20 72 65 67 49 6e 76 53 69 7a  nvArg, regInvSiz
b570: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
b580: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b590: 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69  P_Next, pMWin->i
b5a0: 45 70 68 43 73 72 2c 20 61 64 64 72 29 3b 0a 20  EphCsr, addr);. 
b5b0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b5c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
b5d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 2b  umpHere(v, addr+
b5e0: 31 29 3b 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f  1);   /* The OP_
b5f0: 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  Goto */.}../*.**
b600: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b610: 6f 20 73 65 74 20 74 68 65 20 61 63 63 75 6d 75  o set the accumu
b620: 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66  lator register f
b630: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
b640: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
b650: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 70 61  e linked list pa
b660: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
b670: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 4e  nd argument to N
b680: 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66 6f 72 6d  ULL. And perform
b690: 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76 61 6c 65  .** any equivale
b6a0: 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nt initializatio
b6b0: 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 61 6e  n required by an
b6c0: 79 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  y built-in windo
b6d0: 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69  w functions.** i
b6e0: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
b6f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77  tatic int window
b700: 49 6e 69 74 41 63 63 75 6d 28 50 61 72 73 65 20  InitAccum(Parse 
b710: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
b720: 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64 62 65 20  *pMWin){.  Vdbe 
b730: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b740: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
b750: 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74  nt regArg;.  int
b760: 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 57 69 6e   nArg = 0;.  Win
b770: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72  dow *pWin;.  for
b780: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
b790: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
b7a0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e  extWin){.    Fun
b7b0: 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57  cDef *pFunc = pW
b7c0: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 73  in->pFunc;.    s
b7d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b7e0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
b7f0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
b800: 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d 41 58 28  .    nArg = MAX(
b810: 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41 72 67 43  nArg, windowArgC
b820: 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20 20  ount(pWin));.   
b830: 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d   if( pFunc->zNam
b840: 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
b850: 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e  .     || pFunc->
b860: 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c  zName==first_val
b870: 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20  ueName.    ){.  
b880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b890: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b8a0: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
b8b0: 67 41 70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  gApp);.      sql
b8c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b8d0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
b8e0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29   pWin->regApp+1)
b8f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
b900: 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61   (pFunc->funcFla
b910: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
b920: 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e  _MINMAX) && pWin
b930: 2d 3e 63 73 72 41 70 70 20 29 7b 0a 20 20 20 20  ->csrApp ){.    
b940: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e    assert( pWin->
b950: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
b960: 4e 44 45 44 20 29 3b 0a 20 20 20 20 20 20 73 71  NDED );.      sq
b970: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b980: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
b990: 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  r, pWin->csrApp)
b9a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b9b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b9c0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
b9d0: 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20  ->regApp+1);.   
b9e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 67 41 72 67 20   }.  }.  regArg 
b9f0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
ba00: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
ba10: 20 2b 3d 20 6e 41 72 67 3b 0a 20 20 72 65 74 75   += nArg;.  retu
ba20: 72 6e 20 72 65 67 41 72 67 3b 0a 7d 0a 0a 0a 2f  rn regArg;.}.../
ba30: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ba40: 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  on does the work
ba50: 20 6f 66 20 73 71 6c 69 74 65 33 57 69 6e 64 6f   of sqlite3Windo
ba60: 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72 20  wCodeStep() for 
ba70: 61 6c 6c 20 22 52 4f 57 53 22 0a 2a 2a 20 77 69  all "ROWS".** wi
ba80: 6e 64 6f 77 20 66 72 61 6d 65 20 74 79 70 65 73  ndow frame types
ba90: 20 65 78 63 65 70 74 20 66 6f 72 20 22 42 45 54   except for "BET
baa0: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
bab0: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
bac0: 52 45 4e 54 0a 2a 2a 20 52 4f 57 22 2e 20 50 73  RENT.** ROW". Ps
bad0: 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20 65 61  eudo-code for ea
bae0: 63 68 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a  ch follows..**.*
baf0: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
bb00: 65 78 70 72 31 3e 20 50 52 45 43 45 44 49 4e 47  expr1> PRECEDING
bb10: 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c   AND <expr2> FOL
bb20: 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  LOWING.**.**    
bb30: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66   ....**       if
bb40: 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
bb50: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ){.**         Go
bb60: 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74  sub flush_partit
bb70: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ion.**       }.*
bb80: 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 28  *       Insert (
bb90: 72 65 63 6f 72 64 20 69 6e 20 65 70 68 2d 74 61  record in eph-ta
bba0: 62 6c 65 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  ble).**     sqli
bbb0: 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
bbc0: 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
bbd0: 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 0a  _partition.**  .
bbe0: 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69  **   flush_parti
bbf0: 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63  tion:.**     Onc
bc00: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65  e {.**       Ope
bc10: 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e  nDup (iEphCsr ->
bc20: 20 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20   csrStart).**   
bc30: 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70      OpenDup (iEp
bc40: 68 43 73 72 20 2d 3e 20 63 73 72 45 6e 64 29 0a  hCsr -> csrEnd).
bc50: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
bc60: 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
bc70: 31 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1>              
bc80: 20 20 2f 2f 20 50 52 45 43 45 44 49 4e 47 20 65    // PRECEDING e
bc90: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20  xpression.**    
bca0: 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
bcb0: 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
bcc0: 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20     // FOLLOWING 
bcd0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20  expression.**   
bce0: 20 20 69 66 28 20 72 65 67 53 74 61 72 74 3c 30    if( regStart<0
bcf0: 20 7c 7c 20 72 65 67 45 6e 64 3c 30 20 29 7b 20   || regEnd<0 ){ 
bd00: 65 72 72 6f 72 21 20 7d 0a 2a 2a 20 20 20 20 20  error! }.**     
bd10: 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53  Rewind (csr,csrS
bd20: 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 20  tart,csrEnd)    
bd30: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
bd40: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
bd50: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 4e  _done.**       N
bd60: 65 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20  ext(csrEnd)     
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd80: 2f 20 69 66 20 45 4f 46 20 73 6b 69 70 20 41 67  / if EOF skip Ag
bd90: 67 73 74 65 70 0a 2a 2a 20 20 20 20 20 20 20 41  gstep.**       A
bda0: 67 67 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a  ggstep (csrEnd).
bdb0: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65  **       if( (re
bdc0: 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a  gEnd--)<=0 ){.**
bdd0: 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e 61           AggFina
bde0: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
bdf0: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
be00: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20  Gosub.**        
be10: 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20   Next(csr)      
be20: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20            // if 
be30: 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70  EOF goto flush_p
be40: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a  artition_done.**
be50: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
be60: 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
be70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
be80: 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61 72  Inverse (csrStar
be90: 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
bea0: 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a  Next(csrStart).*
beb0: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
bec0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73       }.**   flus
bed0: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
bee0: 3a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f  :.**     ResetSo
bef0: 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20  rter (csr).**   
bf00: 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52    Return.**.** R
bf10: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
bf20: 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20  r> PRECEDING    
bf30: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  AND CURRENT ROW.
bf40: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
bf50: 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20 20 20  CURRENT ROW     
bf60: 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46      AND <expr> F
bf70: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53  OLLOWING.** ROWS
bf80: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
bf90: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
bfa0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
bfb0: 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20  G.**.**   These 
bfc0: 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  are similar to t
bfd0: 68 65 20 61 62 6f 76 65 2e 20 46 6f 72 20 22 43  he above. For "C
bfe0: 55 52 52 45 4e 54 20 52 4f 57 22 2c 20 69 6e 74  URRENT ROW", int
bff0: 69 61 6c 69 7a 65 20 74 68 65 0a 2a 2a 20 20 20  ialize the.**   
c000: 72 65 67 69 73 74 65 72 20 74 6f 20 30 2e 20 46  register to 0. F
c010: 6f 72 20 22 55 4e 42 4f 55 4e 44 45 44 20 50 52  or "UNBOUNDED PR
c020: 45 43 45 44 49 4e 47 22 20 74 6f 20 69 6e 66 69  ECEDING" to infi
c030: 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  nity..**.** ROWS
c040: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
c050: 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44  PRECEDING    AND
c060: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
c070: 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54  WING.** ROWS BET
c080: 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
c090: 20 20 20 20 20 20 20 20 20 41 4e 44 20 55 4e 42           AND UNB
c0a0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
c0b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e  .**.**     Rewin
c0c0: 64 20 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c  d (csr,csrStart,
c0d0: 63 73 72 45 6e 64 29 20 20 20 20 2f 2f 20 69 66  csrEnd)    // if
c0e0: 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f   EOF goto flush_
c0f0: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a  partition_done.*
c100: 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  *     while( 1 )
c110: 7b 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28  {.**       Next(
c120: 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20 20  csrEnd)         
c130: 20 20 20 20 20 20 20 20 20 2f 2f 20 45 78 69 74           // Exit
c140: 20 77 68 69 6c 65 28 31 29 20 61 74 20 45 4f 46   while(1) at EOF
c150: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73 74 65  .**       Aggste
c160: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
c170: 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65    }.**     while
c180: 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
c190: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
c1a0: 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62  ).**       Gosub
c1b0: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
c1c0: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
c1f0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
c200: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 69  _done.**       i
c210: 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
c220: 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
c230: 20 41 67 67 49 6e 76 65 72 73 65 20 28 63 73 72   AggInverse (csr
c240: 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20  Start).**       
c250: 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29    Next(csrStart)
c260: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
c270: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72     }.**.**   For
c280: 20 74 68 65 20 22 43 55 52 52 45 4e 54 20 52 4f   the "CURRENT RO
c290: 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
c2a0: 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 73 65 2c  FOLLOWING" case,
c2b0: 20 74 68 65 20 66 69 6e 61 6c 20 69 66 28 29 20   the final if() 
c2c0: 0a 2a 2a 20 20 20 63 6f 6e 64 69 74 69 6f 6e 20  .**   condition 
c2d0: 69 73 20 61 6c 77 61 79 73 20 74 72 75 65 20 28  is always true (
c2e0: 61 73 20 69 66 20 72 65 67 53 74 61 72 74 20 77  as if regStart w
c2f0: 65 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ere initialized 
c300: 74 6f 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e  to 0)..**.** RAN
c310: 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  GE BETWEEN CURRE
c320: 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
c330: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
c340: 2a 20 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20  * .**   This is 
c350: 74 68 65 20 6f 6e 6c 79 20 52 41 4e 47 45 20 63  the only RANGE c
c360: 61 73 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74  ase handled by t
c370: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 49 74 20  his routine. It 
c380: 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 2a 2a 20  modifies the.** 
c390: 20 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 20    second while( 
c3a0: 31 20 29 20 6c 6f 6f 70 20 69 6e 20 22 52 4f 57  1 ) loop in "ROW
c3b0: 53 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  S BETWEEN CURREN
c3c0: 54 20 2e 2e 2e 20 55 4e 42 4f 55 4e 44 45 44 2e  T ... UNBOUNDED.
c3d0: 2e 2e 22 20 74 6f 0a 2a 2a 20 20 20 62 65 3a 0a  .." to.**   be:.
c3e0: 2a 2a 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28  **.**     while(
c3f0: 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41   1 ){.**       A
c400: 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29  ggFinal (xValue)
c410: 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
c420: 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20   1 ){.**        
c430: 20 72 65 67 50 65 65 72 2b 2b 0a 2a 2a 20 20 20   regPeer++.**   
c440: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
c450: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20  Gosub.**        
c460: 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20   Next(csr)      
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c480: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
c490: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c4a0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  ne.**         if
c4b0: 28 20 6e 65 77 20 70 65 65 72 20 29 20 62 72 65  ( new peer ) bre
c4c0: 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ak;.**       }.*
c4d0: 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  *       while( (
c4e0: 72 65 67 50 65 65 72 2d 2d 29 3e 30 20 29 7b 0a  regPeer--)>0 ){.
c4f0: 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 49 6e  **         AggIn
c500: 76 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29  verse (csrStart)
c510: 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74  .**         Next
c520: 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
c530: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a      }.**     }.*
c540: 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  *.** ROWS BETWEE
c550: 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  N <expr> FOLLOWI
c560: 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e  NG    AND <expr>
c570: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
c580: 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67 45     regEnd = regE
c590: 6e 64 20 2d 20 72 65 67 53 74 61 72 74 0a 2a 2a  nd - regStart.**
c5a0: 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63     Rewind (csr,c
c5b0: 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20  srStart,csrEnd) 
c5c0: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
c5d0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
c5e0: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 41 67 67  _done.**     Agg
c5f0: 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a  step (csrEnd).**
c600: 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64       Next(csrEnd
c610: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
c620: 20 20 2f 2f 20 69 66 20 45 4f 46 20 66 61 6c 6c    // if EOF fall
c630: 2d 74 68 72 6f 75 67 68 0a 2a 2a 20 20 20 20 20  -through.**     
c640: 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
c650: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  0 ){.**       if
c660: 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
c670: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
c680: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
c690: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  ).**         Gos
c6a0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
c6b0: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
c6c0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
c6d0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
c6e0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c6f0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  ne.**       }.**
c700: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
c710: 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  e (csrStart).** 
c720: 20 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 53        Next (csrS
c730: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a  tart).**     }.*
c740: 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  *.** ROWS BETWEE
c750: 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49  N <expr> PRECEDI
c760: 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e  NG    AND <expr>
c770: 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a 0a 2a 2a   PRECEDING.**.**
c780: 20 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 62     Replace the b
c790: 69 74 20 61 66 74 65 72 20 22 52 65 77 69 6e 64  it after "Rewind
c7a0: 22 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 77  " in the above w
c7b0: 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69  ith:.**.**     i
c7c0: 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
c7d0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
c7e0: 53 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a  Step (csrEnd).**
c7f0: 20 20 20 20 20 20 20 4e 65 78 74 20 28 63 73 72         Next (csr
c800: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  End).**     }.**
c810: 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
c820: 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f  Value).**     Go
c830: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
c840: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66  // if EOF goto f
c870: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
c880: 6f 6e 65 0a 2a 2a 20 20 20 20 20 69 66 28 20 28  one.**     if( (
c890: 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29  regStart--)<=0 )
c8a0: 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 49 6e  {.**       AggIn
c8b0: 76 65 72 73 65 20 28 63 73 72 32 29 0a 2a 2a 20  verse (csr2).** 
c8c0: 20 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 32        Next (csr2
c8d0: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f  ).**     }.**.*/
c8e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
c8f0: 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74  dowCodeRowExprSt
c900: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
c910: 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
c920: 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
c930: 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
c940: 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
c950: 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
c960: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
c970: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
c980: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c990: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
c9a0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 3b 20 20   regFlushPart;  
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c9c0: 52 65 67 69 73 74 65 72 20 66 6f 72 20 22 47 6f  Register for "Go
c9d0: 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74  sub flush_partit
c9e0: 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62  ion" */.  int lb
c9f0: 6c 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  lFlushPart;     
ca00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62            /* Lab
ca10: 65 6c 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  el for "Gosub fl
ca20: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
ca30: 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  /.  int lblFlush
ca40: 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Done;           
ca50: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
ca60: 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61   "Gosub flush_pa
ca70: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f  rtition_done" */
ca80: 0a 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ..  int regArg;.
ca90: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
caa0: 74 20 63 73 72 53 74 61 72 74 20 3d 20 70 50 61  t csrStart = pPa
cab0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
cac0: 6e 74 20 63 73 72 45 6e 64 20 3d 20 70 50 61 72  nt csrEnd = pPar
cad0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e  se->nTab++;.  in
cae0: 74 20 72 65 67 53 74 61 72 74 3b 20 20 20 20 20  t regStart;     
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb00: 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
cb10: 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20  > PRECEDING */. 
cb20: 20 69 6e 74 20 72 65 67 45 6e 64 3b 20 20 20 20   int regEnd;    
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65    /* Value of <e
cb50: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a  xpr> FOLLOWING *
cb60: 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f  /.  int addrGoto
cb70: 3b 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  ;.  int addrTop;
cb80: 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50 6f 73  .  int addrIfPos
cb90: 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50  1;.  int addrIfP
cba0: 6f 73 32 3b 0a 20 20 69 6e 74 20 72 65 67 53 69  os2;.  int regSi
cbb0: 7a 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ze = 0;..  asser
cbc0: 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  t( pMWin->eStart
cbd0: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a  ==TK_PRECEDING .
cbe0: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
cbf0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
cc00: 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ENT .       || p
cc10: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
cc20: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20  _FOLLOWING .    
cc30: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
cc40: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
cc50: 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  D .  );.  assert
cc60: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
cc70: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20  K_FOLLOWING .   
cc80: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
cc90: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  nd==TK_CURRENT .
cca0: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
ccb0: 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
ccc0: 44 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  DED .       || p
ccd0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
cce0: 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 0a  RECEDING .  );..
ccf0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
cd00: 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c  gister and label
cd10: 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f   for the "flush_
cd20: 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72  partition" sub-r
cd30: 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67  outine. */.  reg
cd40: 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50  FlushPart = ++pP
cd50: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62  arse->nMem;.  lb
cd60: 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c  lFlushPart = sql
cd70: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
cd80: 6c 28 76 29 3b 0a 20 20 6c 62 6c 46 6c 75 73 68  l(v);.  lblFlush
cd90: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
cda0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
cdb0: 0a 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b  .  regStart = ++
cdc0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
cdd0: 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73  regEnd = ++pPars
cde0: 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64  e->nMem;..  wind
cdf0: 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68 65  owPartitionCache
ce00: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e  (pParse, p, pWIn
ce10: 66 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  fo, regFlushPart
ce20: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20  , lblFlushPart, 
ce30: 26 72 65 67 53 69 7a 65 29 3b 0a 0a 20 20 61 64  &regSize);..  ad
ce40: 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
ce50: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
ce60: 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74  _Goto);..  /* St
ce70: 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70 61  art of "flush_pa
ce80: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71  rtition" */.  sq
ce90: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
cea0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73  Label(v, lblFlus
ceb0: 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  hPart);.  sqlite
cec0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ced0: 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74  P_Once, 0, sqlit
cee0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
cef0: 72 28 76 29 2b 33 29 3b 0a 20 20 56 64 62 65 43  r(v)+3);.  VdbeC
cf00: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
cf10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cf20: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63  v, OP_OpenDup, c
cf30: 73 72 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  srStart, pMWin->
cf40: 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69  iEphCsr);.  sqli
cf50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cf60: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72   OP_OpenDup, csr
cf70: 45 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  End, pMWin->iEph
cf80: 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65  Csr);..  /* If e
cf90: 69 74 68 65 72 20 72 65 67 53 74 61 72 74 20 6f  ither regStart o
cfa0: 72 20 72 65 67 45 6e 64 20 61 72 65 20 6e 6f 74  r regEnd are not
cfb0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
cfc0: 74 65 67 65 72 73 2c 20 74 68 72 6f 77 20 0a 20  tegers, throw . 
cfd0: 20 2a 2a 20 61 6e 20 65 78 63 65 70 74 69 6f 6e   ** an exception
cfe0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  .  */.  if( pMWi
cff0: 6e 2d 3e 70 53 74 61 72 74 20 29 7b 0a 20 20 20  n->pStart ){.   
d000: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d010: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e  (pParse, pMWin->
d020: 70 53 74 61 72 74 2c 20 72 65 67 53 74 61 72 74  pStart, regStart
d030: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65  );.    windowChe
d040: 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73  ckIntValue(pPars
d050: 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  e, regStart, 0);
d060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
d070: 2d 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71  ->pEnd ){.    sq
d080: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d090: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e  arse, pMWin->pEn
d0a0: 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  d, regEnd);.    
d0b0: 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61  windowCheckIntVa
d0c0: 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 45  lue(pParse, regE
d0d0: 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nd, 1);.  }..  /
d0e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 22 52 4f  * If this is "RO
d0f0: 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f  WS <expr1> FOLLO
d100: 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c 65  WING AND ROWS <e
d110: 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22  xpr2> FOLLOWING"
d120: 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  , do:.  **.  ** 
d130: 20 20 69 66 28 20 72 65 67 45 6e 64 3c 72 65 67    if( regEnd<reg
d140: 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20 20  Start ){.  **   
d150: 20 20 2f 2f 20 54 68 65 20 66 72 61 6d 65 20 61    // The frame a
d160: 6c 77 61 79 73 20 63 6f 6e 73 69 73 74 73 20 6f  lways consists o
d170: 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20 20  f 0 rows.  **   
d180: 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65 67    regStart = reg
d190: 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20  Size;.  **   }. 
d1a0: 20 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72   **   regEnd = r
d1b0: 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74  egEnd - regStart
d1c0: 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  ;.  */.  if( pMW
d1d0: 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69  in->pEnd && pMWi
d1e0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
d1f0: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61  LLOWING ){.    a
d200: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 70 53  ssert( pMWin->pS
d210: 74 61 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  tart!=0 );.    a
d220: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
d230: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
d240: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
d250: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d260: 47 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71  Ge, regStart, sq
d270: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
d280: 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 45 6e  Addr(v)+2, regEn
d290: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
d2a0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
d2b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d2c0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69  , OP_Copy, regSi
d2d0: 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20  ze, regStart);. 
d2e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d2f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
d300: 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20 72  act, regStart, r
d310: 65 67 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a  egEnd, regEnd);.
d320: 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e    }..  if( pMWin
d330: 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57 69  ->pStart && pMWi
d340: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
d350: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73  EDING ){.    ass
d360: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64  ert( pMWin->pEnd
d370: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
d380: 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  t( pMWin->eStart
d390: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
d3a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d3b0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 65  eAddOp3(v, OP_Le
d3c0: 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c 69  , regStart, sqli
d3d0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
d3e0: 64 72 28 76 29 2b 33 2c 20 72 65 67 45 6e 64 29  dr(v)+3, regEnd)
d3f0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
d400: 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
d410: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d420: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65  OP_Copy, regSize
d430: 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20  , regStart);.   
d440: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d450: 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
d460: 65 67 53 69 7a 65 2c 20 72 65 67 45 6e 64 29 3b  egSize, regEnd);
d470: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
d480: 61 6c 69 7a 65 20 74 68 65 20 61 63 63 75 6d 75  alize the accumu
d490: 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66  lator register f
d4a0: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
d4b0: 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20  unction to NULL 
d4c0: 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20 77 69  */.  regArg = wi
d4d0: 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70 50  ndowInitAccum(pP
d4e0: 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20  arse, pMWin);.. 
d4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d500: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
d510: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
d520: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a   lblFlushDone);.
d530: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
d540: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d550: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
d560: 69 6e 64 2c 20 63 73 72 53 74 61 72 74 2c 20 6c  ind, csrStart, l
d570: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
d580: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
d590: 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c  rTaken(v);.  sql
d5a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
d5b0: 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  (v, 1);.  sqlite
d5c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d5d0: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 45 6e 64  P_Rewind, csrEnd
d5e0: 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b  , lblFlushDone);
d5f0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
d600: 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
d610: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
d620: 65 50 35 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a  eP5(v, 1);..  /*
d630: 20 49 6e 76 6f 6b 65 20 41 67 67 53 74 65 70 20   Invoke AggStep 
d640: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
d650: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
d660: 6e 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77 20  n using the row 
d670: 74 68 61 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64  that.  ** csrEnd
d680: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
d690: 73 20 74 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72  s to. Or, if csr
d6a0: 45 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20 61  End is already a
d6b0: 74 20 45 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e  t EOF,.  ** do n
d6c0: 6f 74 68 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64  othing.  */.  ad
d6d0: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
d6e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
d6f0: 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
d700: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
d710: 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66  NG ){.    addrIf
d720: 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64  Pos1 = sqlite3Vd
d730: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
d740: 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20  fPos, regEnd, 0 
d750: 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
d760: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
d770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d780: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
d790: 73 72 45 6e 64 2c 20 73 71 6c 69 74 65 33 56 64  srEnd, sqlite3Vd
d7a0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d7b0: 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  +2);.  VdbeCover
d7c0: 61 67 65 28 76 29 3b 0a 20 20 61 64 64 72 20 3d  age(v);.  addr =
d7d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d7e0: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
d7f0: 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
d800: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
d810: 73 72 45 6e 64 2c 20 30 2c 20 72 65 67 41 72 67  srEnd, 0, regArg
d820: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 69 66  , regSize);.  if
d830: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
d840: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
d850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d860: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
d870: 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
d880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
d890: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
d8a0: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
d8b0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
d8c0: 41 64 64 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65  Addr(v);.  }else
d8d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
d8e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
d8f0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  r);.    if( pMWi
d900: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
d910: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73  EDING ){.      s
d920: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
d930: 72 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31  re(v, addrIfPos1
d940: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
d950: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
d960: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
d970: 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 31 20  .    addrIfPos1 
d980: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d990: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
d9a0: 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b   regEnd, 0 , 1);
d9b0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
d9c0: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
d9d0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
d9e0: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
d9f0: 20 20 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20     addrIfPos2 = 
da00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
da10: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
da20: 65 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b  egStart, 0 , 1);
da30: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
da40: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 64  e(v);.  }.  wind
da50: 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73  owAggFinal(pPars
da60: 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20  e, pMWin, 0);.  
da70: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
da80: 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ow(pParse, pMWin
da90: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
daa0: 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65  Gosub);.  sqlite
dab0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dac0: 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69  P_Next, pMWin->i
dad0: 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56  EphCsr, sqlite3V
dae0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
daf0: 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+2);.  VdbeCove
db00: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
db10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
db20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 46  OP_Goto, 0, lblF
db30: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 69 66 28  lushDone);.  if(
db40: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
db50: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
db60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
db70: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
db80: 66 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a 20 20 69  fPos2);.  }..  i
db90: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
dba0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20  ==TK_CURRENT .  
dbb0: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
dbc0: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
dbd0: 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  .   || pMWin->eS
dbe0: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
dbf0: 4e 47 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  NG .  ){.    int
dc00: 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 20   lblSkipInverse 
dc10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
dc20: 65 4c 61 62 65 6c 28 76 29 3b 3b 0a 20 20 20 20  eLabel(v);;.    
dc30: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
dc40: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
dc50: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dc60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
dc70: 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74  _IfPos, regStart
dc80: 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65  , lblSkipInverse
dc90: 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 1);.      Vdbe
dca0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
dcb0: 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e   }.    if( pMWin
dcc0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
dcd0: 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  LOWING ){.      
dce0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dcf0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
dd00: 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56  rStart, sqlite3V
dd10: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
dd20: 29 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  )+2);.      Vdbe
dd30: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
dd40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dd50: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
dd60: 20 30 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72   0, lblSkipInver
dd70: 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
dd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dd90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
dda0: 78 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71  xt, csrStart, sq
ddb0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ddc0: 41 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20  Addr(v)+1);.    
ddd0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
dde0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e  );.    }.    win
ddf0: 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
de00: 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 53 74 61  e, pMWin, csrSta
de10: 72 74 2c 20 31 2c 20 72 65 67 41 72 67 2c 20 72  rt, 1, regArg, r
de20: 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c  egSize);.    sql
de30: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
de40: 61 62 65 6c 28 76 2c 20 6c 62 6c 53 6b 69 70 49  abel(v, lblSkipI
de50: 6e 76 65 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69  nverse);.  }.  i
de60: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
de70: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
de80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
de90: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
dea0: 66 50 6f 73 31 29 3b 0a 20 20 7d 0a 20 20 73 71  fPos1);.  }.  sq
deb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
dec0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
ded0: 64 64 72 54 6f 70 29 3b 0a 0a 20 20 2f 2a 20 66  ddrTop);..  /* f
dee0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
def0: 6f 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c 69 74 65  one: */.  sqlite
df00: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
df10: 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  l(v, lblFlushDon
df20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
df30: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
df40: 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e  setSorter, pMWin
df50: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71  ->iEphCsr);.  sq
df60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
df70: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
df80: 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20  gFlushPart);..  
df90: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
dfa0: 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75  to skip over flu
dfb0: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  sh_partition */.
dfc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
dfd0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
dfe0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  o);.}../*.** Thi
dff0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
e000: 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 71 6c 69  the work of sqli
e010: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
e020: 70 28 29 20 66 6f 72 20 63 61 73 65 73 20 74 68  p() for cases th
e030: 61 74 0a 2a 2a 20 77 6f 75 6c 64 20 6e 6f 72 6d  at.** would norm
e040: 61 6c 6c 79 20 62 65 20 68 61 6e 64 6c 65 64 20  ally be handled 
e050: 62 79 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  by windowCodeDef
e060: 61 75 6c 74 53 74 65 70 28 29 20 77 68 65 6e 20  aultStep() when 
e070: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 6e 65  there are.** one
e080: 20 6f 72 20 6d 6f 72 65 20 62 75 69 6c 74 2d 69   or more built-i
e090: 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f  n window-functio
e0a0: 6e 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  ns that require 
e0b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69  the entire parti
e0c0: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 63 61  tion.** to be ca
e0d0: 63 68 65 64 20 69 6e 20 61 20 74 65 6d 70 20 74  ched in a temp t
e0e0: 61 62 6c 65 20 62 65 66 6f 72 65 20 61 6e 79 20  able before any 
e0f0: 72 6f 77 73 20 63 61 6e 20 62 65 20 72 65 74 75  rows can be retu
e100: 72 6e 65 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c  rned. Additional
e110: 6c 79 2e 0a 2a 2a 20 22 52 41 4e 47 45 20 42 45  ly..** "RANGE BE
e120: 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
e130: 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
e140: 46 4f 4c 4c 4f 57 49 4e 47 22 20 69 73 20 61 6c  FOLLOWING" is al
e150: 77 61 79 73 20 68 61 6e 64 6c 65 64 20 62 79 0a  ways handled by.
e160: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
e170: 2e 0a 2a 2a 0a 2a 2a 20 50 73 65 75 64 6f 2d 63  ..**.** Pseudo-c
e180: 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ode correspondin
e190: 67 20 74 6f 20 74 68 65 20 56 4d 20 63 6f 64 65  g to the VM code
e1a0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
e1b0: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  is function.** f
e1c0: 6f 72 20 65 61 63 68 20 74 79 70 65 20 6f 66 20  or each type of 
e1d0: 77 69 6e 64 6f 77 20 66 6f 6c 6c 6f 77 73 2e 0a  window follows..
e1e0: 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  **.** RANGE BETW
e1f0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
e200: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
e210: 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20  ENT ROW.**.**   
e220: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a  flush_partition:
e230: 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a  .**     Once {.*
e240: 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20  *       OpenDup 
e250: 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 4c  (iEphCsr -> csrL
e260: 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  ead).**     }.**
e270: 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72       Integer ctr
e280: 20 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63   0.**     foreac
e290: 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b  h row (csrLead){
e2a0: 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65  .**       if( ne
e2b0: 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20  w peer ){.**    
e2c0: 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
e2d0: 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20  Value).**       
e2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72    for(i=0; i<ctr
e2f0: 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20  ; i++){.**      
e300: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
e310: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20  osub.**         
e320: 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a    Next iEphCsr.*
e330: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
e340: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
e350: 74 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  tr 0.**       }.
e360: 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70  **       AggStep
e370: 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20   (csrLead).**   
e380: 20 20 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a 20      Incr ctr.** 
e390: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
e3a0: 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c  AggFinal (xFinal
e3b0: 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72 28  ize).**     for(
e3c0: 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29  i=0; i<ctr; i++)
e3d0: 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62  {.**       Gosub
e3e0: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
e3f0: 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72      Next iEphCsr
e400: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  .**     }.**.** 
e410: 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20      ResetSorter 
e420: 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74  (csr).**     Ret
e430: 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42  urn.**.** ROWS B
e440: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
e450: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
e460: 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a  URRENT ROW.**.**
e470: 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
e480: 65 70 74 20 74 68 61 74 20 74 68 65 20 22 69 66  ept that the "if
e490: 28 20 6e 65 77 20 70 65 65 72 20 29 22 20 62 72  ( new peer )" br
e4a0: 61 6e 63 68 20 69 73 20 61 6c 77 61 79 73 20 74  anch is always t
e4b0: 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47  aken..**.** RANG
e4c0: 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  E BETWEEN CURREN
e4d0: 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e  T ROW AND CURREN
e4e0: 54 20 52 4f 57 20 0a 2a 2a 0a 2a 2a 20 20 20 41  T ROW .**.**   A
e4f0: 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
e500: 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65  that each of the
e510: 20 66 6f 72 28 29 20 6c 6f 6f 70 73 20 62 65 63   for() loops bec
e520: 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  omes:.**.**     
e530: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63      for(i=0; i<c
e540: 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20  tr; i++){.**    
e550: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
e560: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
e570: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
e580: 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20  iEphCsr).**     
e590: 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43        Next iEphC
e5a0: 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  sr.**         }.
e5b0: 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  **.** RANGE BETW
e5c0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
e5d0: 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f  ECEDING AND UNBO
e5e0: 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
e5f0: 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61  **.**   flush_pa
e600: 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20  rtition:.**     
e610: 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Once {.**       
e620: 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72  OpenDup (iEphCsr
e630: 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20   -> csrLead).** 
e640: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72      }.**     for
e650: 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61  each row (csrLea
e660: 64 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  d) {.**       Ag
e670: 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a  gStep (csrLead).
e680: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
e690: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 69 45 70  foreach row (iEp
e6a0: 68 43 73 72 29 20 7b 0a 2a 2a 20 20 20 20 20 20  hCsr) {.**      
e6b0: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
e6c0: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a  .**     }.** .**
e6d0: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
e6e0: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
e6f0: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
e700: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68  NG.**.**   flush
e710: 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20  _partition:.**  
e720: 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20     Once {.**    
e730: 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68     OpenDup (iEph
e740: 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a  Csr -> csrLead).
e750: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
e760: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72  foreach row (csr
e770: 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20  Lead){.**       
e780: 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64  AggStep (csrLead
e790: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
e7a0: 20 20 52 65 77 69 6e 64 20 28 63 73 72 4c 65 61    Rewind (csrLea
e7b0: 64 29 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65  d).**     Intege
e7c0: 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66  r ctr 0.**     f
e7d0: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
e7e0: 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ead){.**       i
e7f0: 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
e800: 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e  *         AggFin
e810: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
e820: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
e830: 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
e840: 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
e850: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
e860: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
e870: 65 20 28 69 45 70 68 43 73 72 29 0a 2a 2a 20 20  e (iEphCsr).**  
e880: 20 20 20 20 20 20 20 20 20 4e 65 78 74 20 69 45           Next iE
e890: 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20  phCsr.**        
e8a0: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 6e   }.**         In
e8b0: 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20  teger ctr 0.**  
e8c0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
e8d0: 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20 20 20  Incr ctr.**     
e8e0: 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46  }.**.**     AggF
e8f0: 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29  inal (xFinalize)
e900: 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  .**     for(i=0;
e910: 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a   i<ctr; i++){.**
e920: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
e930: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
e940: 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20  Next iEphCsr.** 
e950: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
e960: 52 65 73 65 74 53 6f 72 74 65 72 20 28 63 73 72  ResetSorter (csr
e970: 29 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e 0a  ).**     Return.
e980: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
e990: 69 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74  indowCodeCacheSt
e9a0: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
e9b0: 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
e9c0: 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
e9d0: 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
e9e0: 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
e9f0: 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
ea00: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
ea10: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
ea20: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ea30: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
ea40: 20 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   k;.  int addr;.
ea50: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
ea60: 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
ea70: 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73  ition;.  ExprLis
ea80: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d  t *pOrderBy = pM
ea90: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Win->pOrderBy;. 
eaa0: 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 70 4f 72   int nPeer = pOr
eab0: 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79  derBy ? pOrderBy
eac0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 69  ->nExpr : 0;.  i
ead0: 6e 74 20 72 65 67 4e 65 77 50 65 65 72 3b 0a 0a  nt regNewPeer;..
eae0: 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 20    int addrGoto; 
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb00: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
eb10: 47 6f 74 6f 20 75 73 65 64 20 74 6f 20 6a 75 6d  Goto used to jum
eb20: 70 20 66 6c 75 73 68 5f 70 61 72 2e 2e 20 2a 2f  p flush_par.. */
eb30: 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b  .  int addrNext;
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
eb60: 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69  for next iterati
eb70: 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  on of loop */.  
eb80: 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74  int regFlushPart
eb90: 3b 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  ;.  int lblFlush
eba0: 50 61 72 74 3b 0a 20 20 69 6e 74 20 63 73 72 4c  Part;.  int csrL
ebb0: 65 61 64 3b 0a 20 20 69 6e 74 20 72 65 67 43 74  ead;.  int regCt
ebc0: 72 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b  r;.  int regArg;
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
ebf0: 20 61 72 72 61 79 20 74 6f 20 6d 61 72 74 69 61   array to martia
ec00: 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 73 20  l function args 
ec10: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 69 7a 65  */.  int regSize
ec20: 3b 0a 20 20 69 6e 74 20 6c 62 6c 45 6d 70 74 79  ;.  int lblEmpty
ec30: 3b 0a 20 20 69 6e 74 20 62 52 65 76 65 72 73 65  ;.  int bReverse
ec40: 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   = pMWin->pOrder
ec50: 42 79 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74  By && pMWin->eSt
ec60: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
ec70: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4d  .          && pM
ec80: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
ec90: 42 4f 55 4e 44 45 44 3b 0a 0a 20 20 61 73 73 65  BOUNDED;..  asse
eca0: 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61  rt( (pMWin->eSta
ecb0: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
ecc0: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
ecd0: 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20 20  =TK_CURRENT) .  
ece0: 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e       || (pMWin->
ecf0: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
ed00: 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
ed10: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
ed20: 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  D) .       || (p
ed30: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
ed40: 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69  _CURRENT && pMWi
ed50: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
ed60: 45 4e 54 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ENT) .       || 
ed70: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
ed80: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
ed90: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
eda0: 42 4f 55 4e 44 45 44 29 20 0a 20 20 29 3b 0a 0a  BOUNDED) .  );..
edb0: 20 20 6c 62 6c 45 6d 70 74 79 20 3d 20 73 71 6c    lblEmpty = sql
edc0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
edd0: 6c 28 76 29 3b 0a 20 20 72 65 67 4e 65 77 50 65  l(v);.  regNewPe
ede0: 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  er = pParse->nMe
edf0: 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
ee00: 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a 20  Mem += nPeer;.. 
ee10: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67   /* Allocate reg
ee20: 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20  ister and label 
ee30: 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70  for the "flush_p
ee40: 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f  artition" sub-ro
ee50: 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46  utine. */.  regF
ee60: 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61  lushPart = ++pPa
ee70: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c  rse->nMem;.  lbl
ee80: 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69  FlushPart = sqli
ee90: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
eea0: 28 76 29 3b 0a 0a 20 20 63 73 72 4c 65 61 64 20  (v);..  csrLead 
eeb0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
eec0: 3b 0a 20 20 72 65 67 43 74 72 20 3d 20 2b 2b 70  ;.  regCtr = ++p
eed0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
eee0: 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e 43  windowPartitionC
eef0: 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 2c 20  ache(pParse, p, 
ef00: 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75 73 68  pWInfo, regFlush
ef10: 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61  Part, lblFlushPa
ef20: 72 74 2c 20 26 72 65 67 53 69 7a 65 29 3b 0a 20  rt, &regSize);. 
ef30: 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69   addrGoto = sqli
ef40: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
ef50: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a   OP_Goto);..  /*
ef60: 20 53 74 61 72 74 20 6f 66 20 22 66 6c 75 73 68   Start of "flush
ef70: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
ef80: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
ef90: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46  lveLabel(v, lblF
efa0: 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 73 71 6c  lushPart);.  sql
efb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
efc0: 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71  , OP_Once, 0, sq
efd0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
efe0: 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56 64  Addr(v)+2);.  Vd
eff0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f010: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
f020: 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d 57 69 6e  , csrLead, pMWin
f030: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20 2f  ->iEphCsr);..  /
f040: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
f050: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
f060: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
f070: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
f080: 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41  o NULL */.  regA
f090: 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41  rg = windowInitA
f0a0: 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57  ccum(pParse, pMW
f0b0: 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  in);..  sqlite3V
f0c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f0d0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43  Integer, 0, regC
f0e0: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tr);.  sqlite3Vd
f0f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f100: 65 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20  ewind, csrLead, 
f110: 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64 62  lblEmpty);.  Vdb
f120: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f130: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f140: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
f150: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
f160: 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64 62  lblEmpty);.  Vdb
f170: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61  eCoverageNeverTa
f180: 6b 65 6e 28 76 29 3b 0a 0a 20 20 69 66 28 20 62  ken(v);..  if( b
f190: 52 65 76 65 72 73 65 20 29 7b 0a 20 20 20 20 69  Reverse ){.    i
f1a0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
f1b0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
f1c0: 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41  (v);.    windowA
f1d0: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
f1e0: 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20 30  MWin, csrLead, 0
f1f0: 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a  , regArg, regSiz
f200: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
f210: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f220: 4e 65 78 74 2c 20 63 73 72 4c 65 61 64 2c 20 61  Next, csrLead, a
f230: 64 64 72 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  ddr);.    VdbeCo
f240: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
f250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f260: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
f270: 73 72 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74 79  srLead, lblEmpty
f280: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
f290: 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
f2a0: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 4e 65 78 74  ;.  }.  addrNext
f2b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
f2c0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20  rrentAddr(v);.. 
f2d0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
f2e0: 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54   (pMWin->eEnd==T
f2f0: 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 70 4d 57  K_CURRENT || pMW
f300: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43  in->eStart==TK_C
f310: 55 52 52 45 4e 54 29 20 29 7b 0a 20 20 20 20 69  URRENT) ){.    i
f320: 6e 74 20 62 43 75 72 72 65 6e 74 20 3d 20 28 70  nt bCurrent = (p
f330: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f340: 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20 69  _CURRENT);.    i
f350: 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b  nt addrJump = 0;
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f370: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4a 75  Address of OP_Ju
f380: 6d 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  mp below */.    
f390: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  if( pMWin->eType
f3a0: 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20  ==TK_RANGE ){.  
f3b0: 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70      int iOff = p
f3c0: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
f3d0: 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61 72   + (pPart ? pPar
f3e0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
f3f0: 20 20 20 20 20 69 6e 74 20 72 65 67 50 65 65 72       int regPeer
f400: 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72   = pMWin->regPar
f410: 74 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61  t + (pPart ? pPa
f420: 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
f430: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
f440: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
f450: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
f460: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
f470: 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20  derBy, 0, 0);.  
f480: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
f490: 50 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Peer; k++){.    
f4a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f4b0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
f4c0: 6d 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69 4f 66  mn, csrLead, iOf
f4d0: 66 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65 72 2b  f+k, regNewPeer+
f4e0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
f4f0: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
f500: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f510: 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77  _Compare, regNew
f520: 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e  Peer, regPeer, n
f530: 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Peer);.      sql
f540: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
f550: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
f560: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
f570: 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70  ;.      addrJump
f580: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
f590: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
f5a0: 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72   addr+2, 0, addr
f5b0: 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
f5c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f5d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f5e0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
f5f0: 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50  regNewPeer, regP
f600: 65 65 72 2c 20 6e 50 65 65 72 2d 31 29 3b 0a 20  eer, nPeer-1);. 
f610: 20 20 20 7d 0a 0a 20 20 20 20 77 69 6e 64 6f 77     }..    window
f620: 52 65 74 75 72 6e 52 6f 77 73 28 70 50 61 72 73  ReturnRows(pPars
f630: 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43 74 72  e, pMWin, regCtr
f640: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
f650: 47 6f 73 75 62 2c 20 0a 20 20 20 20 20 20 20 20  Gosub, .        
f660: 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65 67 41  (bCurrent ? regA
f670: 72 67 20 3a 20 30 29 2c 20 28 62 43 75 72 72 65  rg : 0), (bCurre
f680: 6e 74 20 3f 20 72 65 67 53 69 7a 65 20 3a 20 30  nt ? regSize : 0
f690: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
f6a0: 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c 69   addrJump ) sqli
f6b0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
f6c0: 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20  v, addrJump);.  
f6d0: 7d 0a 0a 20 20 69 66 28 20 62 52 65 76 65 72 73  }..  if( bRevers
f6e0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 64  e==0 ){.    wind
f6f0: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
f700: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64  , pMWin, csrLead
f710: 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67  , 0, regArg, reg
f720: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Size);.  }.  sql
f730: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f740: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67  , OP_AddImm, reg
f750: 43 74 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  Ctr, 1);.  sqlit
f760: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f770: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61 64  OP_Next, csrLead
f780: 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 56  , addrNext);.  V
f790: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f7a0: 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 52  .  windowReturnR
f7b0: 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57 69  ows(pParse, pMWi
f7c0: 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67 47 6f  n, regCtr, regGo
f7d0: 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 2c 20  sub, addrGosub, 
f7e0: 30 2c 20 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65  0, 0);..  sqlite
f7f0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f800: 6c 28 76 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a  l(v, lblEmpty);.
f810: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f820: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
f830: 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45  orter, pMWin->iE
f840: 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65  phCsr);.  sqlite
f850: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
f860: 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75  P_Return, regFlu
f870: 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a 20 4a  shPart);..  /* J
f880: 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f 20 73  ump to here to s
f890: 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68 5f 70  kip over flush_p
f8a0: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  artition */.  sq
f8b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f8c0: 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a  e(v, addrGoto);.
f8d0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47 45 20  }.../*.** RANGE 
f8e0: 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
f8f0: 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
f900: 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a  CURRENT ROW.**.*
f910: 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69  *   ....**     i
f920: 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e  f( new partition
f930: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
f940: 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65  Final (xFinalize
f950: 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62  ).**       Gosub
f960: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
f970: 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20      ResetSorter 
f980: 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20  eph-table.**    
f990: 20 7d 0a 2a 2a 20 20 20 20 20 65 6c 73 65 20 69   }.**     else i
f9a0: 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
f9b0: 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c  *       AggFinal
f9c0: 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20   (xValue).**    
f9d0: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
f9e0: 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65 73 65  ub.**       Rese
f9f0: 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61 62 6c  tSorter eph-tabl
fa00: 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  e.**     }.**   
fa10: 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20 20 20    AggStep.**    
fa20: 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64 20   Insert (record 
fa30: 69 6e 74 6f 20 65 70 68 2d 74 61 62 6c 65 29 0a  into eph-table).
fa40: 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  **   sqlite3Wher
fa50: 65 45 6e 64 28 29 0a 2a 2a 20 20 20 41 67 67 46  eEnd().**   AggF
fa60: 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29  inal (xFinalize)
fa70: 0a 2a 2a 20 20 20 47 6f 73 75 62 20 61 64 64 72  .**   Gosub addr
fa80: 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52 41 4e 47  Gosub.**.** RANG
fa90: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
faa0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
fab0: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
fac0: 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 73  OWING.**.**   As
fad0: 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
fae0: 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e 20 66 6f  ake no action fo
faf0: 72 20 61 20 22 6e 65 77 20 70 65 65 72 22 2e 20  r a "new peer". 
fb00: 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74 68 65 20  Invoke.**   the 
fb10: 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f 6e 63 65  sub-routine once
fb20: 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63 68 20 70   only for each p
fb30: 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  artition..**.** 
fb40: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
fb50: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55  RRENT ROW AND CU
fb60: 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20  RRENT ROW.**.** 
fb70: 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65    As above, exce
fb80: 70 74 20 74 68 61 74 20 74 68 65 20 22 6e 65 77  pt that the "new
fb90: 20 70 65 65 72 22 20 63 6f 6e 64 69 74 69 6f 6e   peer" condition
fba0: 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 74   is handled in t
fbb0: 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20 77 61 79  he.**   same way
fbc0: 20 61 73 20 22 6e 65 77 20 70 61 72 74 69 74 69   as "new partiti
fbd0: 6f 6e 22 20 28 73 6f 20 74 68 65 72 65 20 69 73  on" (so there is
fbe0: 20 6e 6f 20 22 65 6c 73 65 20 69 66 22 20 62 6c   no "else if" bl
fbf0: 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  ock)..**.** ROWS
fc00: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
fc10: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
fc20: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20   CURRENT ROW.** 
fc30: 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20  .**   As above, 
fc40: 65 78 63 65 70 74 20 61 73 73 75 6d 65 20 65 76  except assume ev
fc50: 65 72 79 20 72 6f 77 20 69 73 20 61 20 22 6e 65  ery row is a "ne
fc60: 77 20 70 65 65 72 22 2e 0a 2a 2f 0a 73 74 61 74  w peer"..*/.stat
fc70: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f  ic void windowCo
fc80: 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 0a 20  deDefaultStep(. 
fc90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
fca0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20  .  Select *p,.  
fcb0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
fcc0: 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  o,.  int regGosu
fcd0: 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  b, .  int addrGo
fce0: 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20  sub.){.  Window 
fcf0: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
fd00: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
fd10: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
fd20: 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20  rse);.  int k;. 
fd30: 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20 70   int iSubCsr = p
fd40: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75  ->pSrc->a[0].iCu
fd50: 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75 62  rsor;.  int nSub
fd60: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
fd70: 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69  .pTab->nCol;.  i
fd80: 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d  nt reg = pParse-
fd90: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72  >nMem+1;.  int r
fda0: 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e  egRecord = reg+n
fdb0: 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Sub;.  int regRo
fdc0: 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b  wid = regRecord+
fdd0: 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  1;.  int addr;. 
fde0: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
fdf0: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
fe00: 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74  tion;.  ExprList
fe10: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57   *pOrderBy = pMW
fe20: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20  in->pOrderBy;.. 
fe30: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
fe40: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
fe50: 0a 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e  .      || (pMWin
fe60: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
fe70: 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d  OUNDED && pMWin-
fe80: 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e  >eEnd==TK_CURREN
fe90: 54 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  T).  );..  asser
fea0: 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  t( (pMWin->eStar
feb0: 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t==TK_UNBOUNDED 
fec0: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
fed0: 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 20 20  TK_CURRENT).    
fee0: 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53     || (pMWin->eS
fef0: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
ff00: 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e  ED && pMWin->eEn
ff10: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29  d==TK_UNBOUNDED)
ff20: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
ff30: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
ff40: 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e  RRENT && pMWin->
ff50: 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
ff60: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57  ).       || (pMW
ff70: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43  in->eStart==TK_C
ff80: 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d  URRENT && pMWin-
ff90: 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
ffa0: 44 45 44 20 26 26 20 21 70 4f 72 64 65 72 42 79  DED && !pOrderBy
ffb0: 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d  ).  );..  if( pM
ffc0: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
ffd0: 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 70  BOUNDED ){.    p
ffe0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
fff0: 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ..  pParse->nMem
10000 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20   += nSub + 2;.. 
10010 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20   /* Martial the 
10020 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20  row returned by 
10030 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69  the sub-select i
10040 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
10050 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 2e  .  ** registers.
10060 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
10070 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20  <nSub; k++){.   
10080 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10090 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
100a0 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67   iSubCsr, k, reg
100b0 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  +k);.  }..  /* C
100c0 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
100d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e  the start of a n
100e0 65 77 20 70 61 72 74 69 74 69 6f 6e 20 6f 72 20  ew partition or 
100f0 70 65 65 72 20 67 72 6f 75 70 2e 20 2a 2f 0a 20  peer group. */. 
10100 20 69 66 28 20 70 50 61 72 74 20 7c 7c 20 70 4f   if( pPart || pO
10110 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e  rderBy ){.    in
10120 74 20 6e 50 61 72 74 20 3d 20 28 70 50 61 72 74  t nPart = (pPart
10130 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20   ? pPart->nExpr 
10140 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 61 64  : 0);.    int ad
10150 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20  drGoto = 0;.    
10160 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30  int addrJump = 0
10170 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65 72 20  ;.    int nPeer 
10180 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f  = (pOrderBy ? pO
10190 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20  rderBy->nExpr : 
101a0 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61  0);..    if( pPa
101b0 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  rt ){.      int 
101c0 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67  regNewPart = reg
101d0 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65   + pMWin->nBuffe
101e0 72 43 6f 6c 3b 0a 20 20 20 20 20 20 4b 65 79 49  rCol;.      KeyI
101f0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
10200 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
10210 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
10220 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b  e, pPart, 0, 0);
10230 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
10240 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10250 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
10260 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e  egNewPart, pMWin
10270 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72 74 29  ->regPart,nPart)
10280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10290 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
102a0 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  void*)pKeyInfo, 
102b0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
102c0 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71     addrJump = sq
102d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
102e0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
102f0 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a  +2, 0, addr+2);.
10300 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
10310 67 65 28 76 29 3b 0a 20 20 20 20 20 20 77 69 6e  ge(v);.      win
10320 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72  dowAggFinal(pPar
10330 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20  se, pMWin, 1);. 
10340 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
10350 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64  y ){.        add
10360 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  rGoto = sqlite3V
10370 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
10380 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Goto);.      }. 
10390 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
103a0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
103b0 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20 3d  int regNewPeer =
103c0 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42   reg + pMWin->nB
103d0 75 66 66 65 72 43 6f 6c 20 2b 20 6e 50 61 72 74  ufferCol + nPart
103e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 50  ;.      int regP
103f0 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67  eer = pMWin->reg
10400 50 61 72 74 20 2b 20 6e 50 61 72 74 3b 0a 0a 20  Part + nPart;.. 
10410 20 20 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d       if( addrJum
10420 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  p ) sqlite3VdbeJ
10430 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a  umpHere(v, addrJ
10440 75 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ump);.      if( 
10450 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b  pMWin->eType==TK
10460 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
10470 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
10480 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
10490 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
104a0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
104b0 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  y, 0, 0);.      
104c0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
104d0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
104e0 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77  _Compare, regNew
104f0 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e  Peer, regPeer, n
10500 50 65 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Peer);.        s
10510 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
10520 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65  P4(v, (void*)pKe
10530 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
10540 4f 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72  O);.        addr
10550 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
10560 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
10570 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20  ump, addr+2, 0, 
10580 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 20  addr+2);.       
10590 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
105a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
105b0 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20         addrJump 
105c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
105d0 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61     windowAggFina
105e0 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  l(pParse, pMWin,
105f0 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
10600 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20 20  TK_CURRENT);.   
10610 20 20 20 69 66 28 20 61 64 64 72 47 6f 74 6f 20     if( addrGoto 
10620 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
10630 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
10640 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  o);.    }..    s
10650 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10660 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
10670 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71  MWin->iEphCsr,sq
10680 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10690 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20  Addr(v)+3);.    
106a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
106b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
106c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
106d0 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  ub, regGosub, ad
106e0 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 73 71  drGosub);.    sq
106f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10700 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69  v, OP_Next, pMWi
10710 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69  n->iEphCsr, sqli
10720 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10730 64 72 28 76 29 2d 31 29 3b 0a 20 20 20 20 56 64  dr(v)-1);.    Vd
10740 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
10750 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10760 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
10770 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e  tSorter, pMWin->
10780 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 73 71  iEphCsr);.    sq
10790 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
107a0 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 43  .        v, OP_C
107b0 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e 2d 3e  opy, reg+pMWin->
107c0 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d 57 69  nBufferCol, pMWi
107d0 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72  n->regPart, nPar
107e0 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20 29 3b  t+nPeer-1.    );
107f0 0a 0a 20 20 20 20 69 66 28 20 61 64 64 72 4a 75  ..    if( addrJu
10800 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  mp ) sqlite3Vdbe
10810 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10820 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Jump);.  }..  /*
10830 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66 75 6e   Invoke step fun
10840 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64 6f 77  ction for window
10850 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
10860 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
10870 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 2d 31 2c  arse, pMWin, -1,
10880 20 30 2c 20 72 65 67 2c 20 30 29 3b 0a 0a 20 20   0, reg, 0);..  
10890 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63 75  /* Buffer the cu
108a0 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68 65  rrent row in the
108b0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
108c0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e  . */.  if( pMWin
108d0 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30 20 29  ->nBufferCol>0 )
108e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
108f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
10900 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20 70  keRecord, reg, p
10910 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
10920 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
10930 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
10940 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10950 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65 67 52  OP_Blob, 0, regR
10960 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69  ecord);.    sqli
10970 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
10980 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20 30 29  v, (void*)"", 0)
10990 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
109a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
109b0 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d  NewRowid, pMWin-
109c0 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f 77  >iEphCsr, regRow
109d0 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
109e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
109f0 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  nsert, pMWin->iE
10a00 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72 64  phCsr, regRecord
10a10 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
10a20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62  /* End the datab
10a30 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 20 2a  ase scan loop. *
10a40 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  /.  sqlite3Where
10a50 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20  End(pWInfo);..  
10a60 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
10a70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29  Parse, pMWin, 1)
10a80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
10a90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
10aa0 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
10ab0 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75  sr,sqlite3VdbeCu
10ac0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
10ad0 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
10ae0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
10af0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
10b00 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  sub, regGosub, a
10b10 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c  ddrGosub);.  sql
10b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10b30 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e  , OP_Next, pMWin
10b40 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74  ->iEphCsr, sqlit
10b50 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10b60 72 28 76 29 2d 31 29 3b 0a 20 20 56 64 62 65 43  r(v)-1);.  VdbeC
10b70 6f 76 65 72 61 67 65 28 76 29 3b 0a 7d 0a 0a 2f  overage(v);.}../
10b80 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
10b90 64 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c 69  d return a dupli
10ba0 63 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e 64  cate of the Wind
10bb0 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61  ow object indica
10bc0 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74 68  ted by the.** th
10bd0 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53 65  ird argument. Se
10be0 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f 77  t the Window.pOw
10bf0 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ner field of the
10c00 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a 2a   new object to.*
10c10 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69 6e  * pOwner..*/.Win
10c20 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
10c30 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  owDup(sqlite3 *d
10c40 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72 2c  b, Expr *pOwner,
10c50 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57   Window *p){.  W
10c60 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30 3b  indow *pNew = 0;
10c70 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
10c80 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
10c90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
10ca0 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a  izeof(Window));.
10cb0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
10cc0 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d        pNew->zNam
10cd0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
10ce0 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  Dup(db, p->zName
10cf0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
10d00 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
10d10 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
10d20 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Filter, 0);.    
10d30 20 20 70 4e 65 77 2d 3e 70 50 61 72 74 69 74 69    pNew->pPartiti
10d40 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  on = sqlite3Expr
10d50 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
10d60 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20  Partition, 0);. 
10d70 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65       pNew->pOrde
10d80 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
10d90 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
10da0 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20  pOrderBy, 0);.  
10db0 20 20 20 20 70 4e 65 77 2d 3e 65 54 79 70 65 20      pNew->eType 
10dc0 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20  = p->eType;.    
10dd0 20 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70    pNew->eEnd = p
10de0 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e  ->eEnd;.      pN
10df0 65 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e  ew->eStart = p->
10e00 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e  eStart;.      pN
10e10 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  ew->pStart = sql
10e20 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
10e30 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20  p->pStart, 0);. 
10e40 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20       pNew->pEnd 
10e50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
10e60 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29  (db, p->pEnd, 0)
10e70 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f  ;.      pNew->pO
10e80 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20  wner = pOwner;. 
10e90 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10ea0 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
10eb0 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f   Return a copy o
10ec0 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
10ed0 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65  t of Window obje
10ee0 63 74 73 20 70 61 73 73 65 64 20 61 73 20 74 68  cts passed as th
10ef0 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75  e.** second argu
10f00 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ment..*/.Window 
10f10 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69  *sqlite3WindowLi
10f20 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64  stDup(sqlite3 *d
10f30 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  b, Window *p){. 
10f40 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
10f50 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20   Window *pRet = 
10f60 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70  0;.  Window **pp
10f70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72   = &pRet;..  for
10f80 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70  (pWin=p; pWin; p
10f90 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
10fa0 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73  in){.    *pp = s
10fb0 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28  qlite3WindowDup(
10fc0 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20  db, 0, pWin);.  
10fd0 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20 62    if( *pp==0 ) b
10fe0 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26  reak;.    pp = &
10ff0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e  ((*pp)->pNextWin
11000 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
11010 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
11020 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
11030 6e 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  n() has already 
11040 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20  been called for 
11050 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
11060 6d 65 6e 74 20 0a 2a 2a 20 70 61 73 73 65 64 20  ment .** passed 
11070 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
11080 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 69 73  gument when this
11090 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76   function is inv
110a0 6f 6b 65 64 2e 20 49 74 20 67 65 6e 65 72 61 74  oked. It generat
110b0 65 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 70 6f  es.** code to po
110c0 70 75 6c 61 74 65 20 74 68 65 20 57 69 6e 64 6f  pulate the Windo
110d0 77 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67 69  w.regResult regi
110e0 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69  ster for each wi
110f0 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e  ndow function an
11100 64 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  d.** invoke the 
11110 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 69  sub-routine at i
11120 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 47  nstruction addrG
11130 6f 73 75 62 20 6f 6e 63 65 20 66 6f 72 20 65 61  osub once for ea
11140 63 68 20 72 6f 77 2e 0a 2a 2a 20 54 68 69 73 20  ch row..** This 
11150 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73  function calls s
11160 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
11170 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
11180 67 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  g. .*/.void sqli
11190 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
111a0 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
111b0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
111c0 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
111d0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
111e0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
111f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11200 77 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73  written SELECT s
11210 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68  tatement */.  Wh
11220 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11240 20 43 6f 6e 74 65 78 74 20 72 65 74 75 72 6e 65   Context returne
11250 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
11260 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  eBegin() */.  in
11270 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20  t regGosub,     
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11290 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50   Register for OP
112a0 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20  _Gosub */.  int 
112b0 61 64 64 72 47 6f 73 75 62 20 20 20 20 20 20 20  addrGosub       
112c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
112d0 50 5f 47 6f 73 75 62 20 68 65 72 65 20 74 6f 20  P_Gosub here to 
112e0 72 65 74 75 72 6e 20 65 61 63 68 20 72 6f 77 20  return each row 
112f0 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  */.){.  Window *
11300 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
11310 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65  ..  /* There are
11320 20 74 68 72 65 65 20 64 69 66 66 65 72 65 6e 74   three different
11330 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
11340 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 64  may be used to d
11350 6f 20 74 68 65 20 77 6f 72 6b 0a 20 20 2a 2a 20  o the work.  ** 
11360 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 64 65 70  of this one, dep
11370 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 77 69  ending on the wi
11380 6e 64 6f 77 20 66 72 61 6d 65 20 61 6e 64 20 74  ndow frame and t
11390 68 65 20 73 70 65 63 69 66 69 63 20 62 75 69 6c  he specific buil
113a0 74 2d 69 6e 0a 20 20 2a 2a 20 77 69 6e 64 6f 77  t-in.  ** window
113b0 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20   functions used 
113c0 28 69 66 20 61 6e 79 29 2e 0a 20 20 2a 2a 0a 20  (if any)..  **. 
113d0 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f   ** windowCodeRo
113e0 77 45 78 70 72 53 74 65 70 28 29 20 68 61 6e 64  wExprStep() hand
113f0 6c 65 73 20 61 6c 6c 20 22 52 4f 57 53 22 20 77  les all "ROWS" w
11400 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20 65 78  indow frames, ex
11410 63 65 70 74 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20  cept for:.  **. 
11420 20 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45   **   ROWS BETWE
11430 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
11440 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
11450 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a  NT ROW.  **.  **
11460 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
11470 73 20 62 65 63 61 75 73 65 20 77 69 6e 64 6f 77  s because window
11480 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
11490 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6c 6c  ) implements all
114a0 20 77 69 6e 64 6f 77 0a 20 20 2a 2a 20 66 72 61   window.  ** fra
114b0 6d 65 20 74 79 70 65 73 20 62 79 20 63 61 63 68  me types by cach
114c0 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70  ing the entire p
114d0 61 72 74 69 74 69 6f 6e 20 69 6e 20 61 20 74 65  artition in a te
114e0 6d 70 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20 20  mp table, and.  
114f0 2a 2a 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e  ** "ROWS BETWEEN
11500 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
11510 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
11520 20 52 4f 57 22 20 69 73 20 65 61 73 79 20 65 6e   ROW" is easy en
11530 6f 75 67 68 20 74 6f 0a 20 20 2a 2a 20 69 6d 70  ough to.  ** imp
11540 6c 65 6d 65 6e 74 20 77 69 74 68 6f 75 74 20 73  lement without s
11550 75 63 68 20 61 20 63 61 63 68 65 2e 0a 20 20 2a  uch a cache..  *
11560 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64  *.  ** windowCod
11570 65 43 61 63 68 65 53 74 65 70 28 29 20 69 73 20  eCacheStep() is 
11580 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20  used for:.  **. 
11590 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57   **   RANGE BETW
115a0 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
115b0 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
115c0 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a  LLOWING.  **.  *
115d0 2a 20 49 74 20 69 73 20 61 6c 73 6f 20 75 73 65  * It is also use
115e0 64 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 20 6e  d for anything n
115f0 6f 74 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69  ot handled by wi
11600 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53  ndowCodeRowExprS
11610 74 65 70 28 29 20 0a 20 20 2a 2a 20 74 68 61 74  tep() .  ** that
11620 20 69 6e 76 6f 6b 65 73 20 61 20 62 75 69 6c 74   invokes a built
11630 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
11640 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65  ion that require
11650 73 20 74 68 65 20 65 6e 74 69 72 65 20 0a 20 20  s the entire .  
11660 2a 2a 20 70 61 72 74 69 74 69 6f 6e 20 74 6f 20  ** partition to 
11670 62 65 20 63 61 63 68 65 64 20 69 6e 20 61 20 74  be cached in a t
11680 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65  emp table before
11690 20 61 6e 79 20 72 6f 77 73 20 61 72 65 20 72 65   any rows are re
116a0 74 75 72 6e 65 64 0a 20 20 2a 2a 20 28 65 2e 67  turned.  ** (e.g
116b0 2e 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 6f 72  . nth_value() or
116c0 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28 29 29   percent_rank())
116d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 6e 61  ..  **.  ** Fina
116e0 6c 6c 79 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  lly, assuming th
116f0 65 72 65 20 69 73 20 6e 6f 20 62 75 69 6c 74 2d  ere is no built-
11700 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
11710 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73  on that requires
11720 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 74 69 74  .  ** the partit
11730 69 6f 6e 20 74 6f 20 62 65 20 63 61 63 68 65 64  ion to be cached
11740 2c 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61  , windowCodeDefa
11750 75 6c 74 53 74 65 70 28 29 20 69 73 20 75 73 65  ultStep() is use
11760 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  d for:.  **.  **
11770 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
11780 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
11790 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
117a0 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52 41 4e   ROW .  **   RAN
117b0 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
117c0 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
117d0 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
117e0 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 52 41  LOWING.  **   RA
117f0 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52  NGE BETWEEN CURR
11800 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52  ENT ROW AND CURR
11810 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20  ENT ROW .  **   
11820 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42  ROWS BETWEEN UNB
11830 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
11840 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
11850 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f  .  **.  ** windo
11860 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70  wCodeDefaultStep
11870 28 29 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 6f  () is the only o
11880 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 65 20  ne of the three 
11890 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 20  functions that. 
118a0 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 61 63   ** does not cac
118b0 68 65 20 65 61 63 68 20 70 61 72 74 69 74 69 6f  he each partitio
118c0 6e 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c  n in a temp tabl
118d0 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69  e before beginni
118e0 6e 67 20 74 6f 0a 20 20 2a 2a 20 72 65 74 75 72  ng to.  ** retur
118f0 6e 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69  n rows..  */.  i
11900 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
11910 3d 54 4b 5f 52 4f 57 53 20 0a 20 20 20 26 26 20  =TK_ROWS .   && 
11920 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  (pMWin->eStart!=
11930 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c 7c 70 4d  TK_UNBOUNDED||pM
11940 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43 55  Win->eEnd!=TK_CU
11950 52 52 45 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e 70  RRENT||!pMWin->p
11960 4f 72 64 65 72 42 79 29 0a 20 20 29 7b 0a 20 20  OrderBy).  ){.  
11970 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45    windowCodeRowE
11980 78 70 72 53 74 65 70 28 70 50 61 72 73 65 2c 20  xprStep(pParse, 
11990 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f  p, pWInfo, regGo
119a0 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
119b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 57 69  .  }else{.    Wi
119c0 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20  ndow *pWin;.    
119d0 69 6e 74 20 62 43 61 63 68 65 20 3d 20 30 3b 20  int bCache = 0; 
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
119f0 20 54 72 75 65 20 74 6f 20 75 73 65 20 43 61 63   True to use Cac
11a00 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a 20 20 20  heStep() */..   
11a10 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
11a20 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
11a30 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
11a40 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
11a50 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b       bCache = 1;
11a60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11a70 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
11a80 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
11a90 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
11aa0 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
11ab0 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
11ac0 6e 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  nc;.        if( 
11ad0 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  (pFunc->funcFlag
11ae0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
11af0 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a 20 20 20  WINDOW_SIZE).   
11b00 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d        || (pFunc-
11b10 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
11b20 65 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  eName).         
11b30 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  || (pFunc->zName
11b40 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  ==first_valueNam
11b50 65 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  e).         || (
11b60 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  pFunc->zName==le
11b70 61 64 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  adName).        
11b80 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
11b90 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20 20  e==lagName).    
11ba0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
11bb0 20 62 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20   bCache = 1;.   
11bc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11be0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74      }..    /* Ot
11bf0 68 65 72 77 69 73 65 2c 20 63 61 6c 6c 20 77 69  herwise, call wi
11c00 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53  ndowCodeDefaultS
11c10 74 65 70 28 29 2e 20 20 2a 2f 0a 20 20 20 20 69  tep().  */.    i
11c20 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20 20  f( bCache ){.   
11c30 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63     windowCodeCac
11c40 68 65 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  heStep(pParse, p
11c50 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73  , pWInfo, regGos
11c60 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
11c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c80 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75   windowCodeDefau
11c90 6c 74 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ltStep(pParse, p
11ca0 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73  , pWInfo, regGos
11cb0 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
11cc0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
11cd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11ce0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
11cf0 0a                                               .