/ Hex Artifact Content
Login

Artifact 0ff9000757e6634f4bbf59e8273ba21d47992b7b782db5bde76db0eee90964e3:


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 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69  rInvFunc(.  sqli
1700: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
1710: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
1720: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1730: 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61  **apArg.){.}.sta
1740: 74 69 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d  tic void row_num
1750: 62 65 72 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  berValueFunc(sql
1760: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1770: 74 78 29 7b 0a 20 20 69 36 34 20 2a 70 20 3d 20  tx){.  i64 *p = 
1780: 28 69 36 34 2a 29 73 71 6c 69 74 65 33 5f 61 67  (i64*)sqlite3_ag
1790: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
17a0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
17b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
17c0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
17d0: 28 70 20 3f 20 2a 70 20 3a 20 30 29 29 3b 0a 7d  (p ? *p : 0));.}
17e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20  ../*.** Context 
17f0: 6f 62 6a 65 63 74 20 74 79 70 65 20 75 73 65 64  object type used
1800: 20 62 79 20 72 61 6e 6b 28 29 2c 20 64 65 6e 73   by rank(), dens
1810: 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72 63 65 6e  e_rank(), percen
1820: 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a 2a 2a 20  t_rank() and.** 
1830: 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a 2a 2f 0a  cume_dist()..*/.
1840: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
1850: 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c 75 65 3b   {.  i64 nValue;
1860: 0a 20 20 69 36 34 20 6e 53 74 65 70 3b 0a 20 20  .  i64 nStep;.  
1870: 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d 3b 0a 0a  i64 nTotal;.};..
1880: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1890: 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e  tion of built-in
18a0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
18b0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 2e 20 41   dense_rank(). A
18c0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
18d0: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
18e0: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
18f0: 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42  .**.**   RANGE B
1900: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
1910: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
1920: 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73  URRENT ROW .*/.s
1930: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1940: 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20  _rankStepFunc(. 
1950: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1960: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1970: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1980: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1990: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
19a0: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
19b0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
19c0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
19d0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
19e0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
19f0: 66 28 20 70 20 29 20 70 2d 3e 6e 53 74 65 70 20  f( p ) p->nStep 
1a00: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
1a10: 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b 49 6e 76  id dense_rankInv
1a20: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1a30: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1a40: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1a50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1a60: 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20  Arg.){.}.static 
1a70: 76 6f 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b 56  void dense_rankV
1a80: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
1a90: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
1aa0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
1ab0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
1ac0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
1ad0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
1ae0: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
1af0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1b00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
1b10: 20 70 2d 3e 6e 53 74 65 70 20 29 7b 0a 20 20 20   p->nStep ){.   
1b20: 20 20 20 70 2d 3e 6e 56 61 6c 75 65 2b 2b 3b 0a     p->nValue++;.
1b30: 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d        p->nStep =
1b40: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
1b50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1b60: 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e 56 61 6c  64(pCtx, p->nVal
1b70: 75 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ue);.  }.}../*.*
1b80: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1b90: 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e   of built-in win
1ba0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 72 61 6e  dow function ran
1bb0: 6b 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61  k(). Assumes tha
1bc0: 74 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20  t.** the window 
1bd0: 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73  frame has been s
1be0: 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  et to:.**.**   R
1bf0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
1c00: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
1c10: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
1c20: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
1c30: 20 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20   rankStepFunc(. 
1c40: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1c50: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1c60: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1c70: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1c80: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
1c90: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
1ca0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
1cb0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1cc0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
1cd0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
1ce0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  f( p ){.    p->n
1cf0: 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Step++;.    if( 
1d00: 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20 29 7b 0a  p->nValue==0 ){.
1d10: 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20        p->nValue 
1d20: 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20  = p->nStep;.    
1d30: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
1d40: 6f 69 64 20 72 61 6e 6b 49 6e 76 46 75 6e 63 28  oid rankInvFunc(
1d50: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1d60: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
1d70: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
1d80: 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29  _value **apArg.)
1d90: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
1da0: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
1db0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1dc0: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
1dd0: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1de0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1df0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1e00: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1e10: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1e20: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1e30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1e40: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
1e50: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
1e60: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
1e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1e80: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1e90: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1ea0: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
1eb0: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
1ec0: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
1ed0: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
1ee0: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41  t to:.**.**   RA
1ef0: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
1f00: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
1f10: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
1f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f30: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
1f40: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1f50: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1f60: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1f70: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1f80: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
1f90: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1fa0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1fb0: 29 3b 0a 0a 20 20 70 20 3d 20 28 73 74 72 75 63  );..  p = (struc
1fc0: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
1fd0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1fe0: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
1ff0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
2000: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
2010: 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  nTotal==0 ){.   
2020: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73     p->nTotal = s
2030: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2040: 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20  64(apArg[0]);.  
2050: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70    }.    p->nStep
2060: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ++;.    if( p->n
2070: 56 61 6c 75 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Value==0 ){.    
2080: 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20 70 2d    p->nValue = p-
2090: 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 0a 20 20  >nStep;.    }.  
20a0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
20b0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 49 6e 76 46  percent_rankInvF
20c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
20d0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
20e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
20f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
2100: 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  rg.){.}.static v
2110: 6f 69 64 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  oid percent_rank
2120: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
2130: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2140: 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43  {.  struct CallC
2150: 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28  ount *p;.  p = (
2160: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
2170: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
2180: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
2190: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
21a0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
21b0: 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20 29 7b  ( p->nTotal>1 ){
21c0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
21d0: 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 56  = (double)(p->nV
21e0: 61 6c 75 65 2d 31 29 20 2f 20 28 64 6f 75 62 6c  alue-1) / (doubl
21f0: 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b  e)(p->nTotal-1);
2200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2210: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74  esult_double(pCt
2220: 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  x, r);.    }else
2230: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2240: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43  result_double(pC
2250: 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20 20 7d 0a  tx, 0.0);.    }.
2260: 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20      p->nValue = 
2270: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
2280: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2290: 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  f built-in windo
22a0: 77 20 66 75 6e 63 74 69 6f 6e 20 63 75 6d 65 5f  w function cume_
22b0: 64 69 73 74 28 29 2e 20 41 73 73 75 6d 65 73 20  dist(). Assumes 
22c0: 74 68 61 74 0a 2a 2a 20 74 68 65 20 77 69 6e 64  that.** the wind
22d0: 6f 77 20 66 72 61 6d 65 20 68 61 73 20 62 65 65  ow frame has bee
22e0: 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  n set to:.**.** 
22f0: 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20    RANGE BETWEEN 
2300: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
2310: 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
2320: 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ROW .*/.static v
2330: 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 53 74 65  oid cume_distSte
2340: 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  pFunc(.  sqlite3
2350: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2360: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
2370: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2380: 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74  pArg.){.  struct
2390: 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20   CallCount *p;. 
23a0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
23b0: 20 29 3b 0a 0a 20 20 70 20 3d 20 28 73 74 72 75   );..  p = (stru
23c0: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71  ct CallCount*)sq
23d0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
23e0: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
23f0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
2400: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
2410: 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20  >nTotal==0 ){.  
2420: 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20      p->nTotal = 
2430: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2440: 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  t64(apArg[0]);. 
2450: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53 74 65     }.    p->nSte
2460: 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  p++;.  }.}.stati
2470: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
2480: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
2490: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
24a0: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
24b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
24c0: 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74  *apArg.){.}.stat
24d0: 69 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73  ic void cume_dis
24e0: 74 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  tValueFunc(sqlit
24f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2500: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
2510: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
2520: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
2530: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
2540: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2550: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2560: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 54    if( p && p->nT
2570: 6f 74 61 6c 20 29 7b 0a 20 20 20 20 64 6f 75 62  otal ){.    doub
2580: 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28  le r = (double)(
2590: 70 2d 3e 6e 53 74 65 70 29 20 2f 20 28 64 6f 75  p->nStep) / (dou
25a0: 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 29 3b  ble)(p->nTotal);
25b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
25c0: 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c  ult_double(pCtx,
25d0: 20 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   r);.  }.}../*.*
25e0: 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
25f0: 20 66 6f 72 20 6e 74 69 6c 65 28 29 20 77 69 6e   for ntile() win
2600: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  dow function..*/
2610: 0a 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78  .struct NtileCtx
2620: 20 7b 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b   {.  i64 nTotal;
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 72 6f       /* Total ro
2650: 77 73 20 69 6e 20 70 61 72 74 69 74 69 6f 6e 20  ws in partition 
2660: 2a 2f 0a 20 20 69 36 34 20 6e 50 61 72 61 6d 3b  */.  i64 nParam;
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65       /* Paramete
2690: 72 20 70 61 73 73 65 64 20 74 6f 20 6e 74 69 6c  r passed to ntil
26a0: 65 28 4e 29 20 2a 2f 0a 20 20 69 36 34 20 69 52  e(N) */.  i64 iR
26b0: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26d0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a  rent row */.};..
26e0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
26f0: 74 69 6f 6e 20 6f 66 20 6e 74 69 6c 65 28 29 2e  tion of ntile().
2700: 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 74 68   This assumes th
2710: 61 74 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  at the window fr
2720: 61 6d 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  ame has.** been 
2730: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
2740: 2a 20 20 20 52 4f 57 53 20 55 4e 42 4f 55 4e 44  *   ROWS UNBOUND
2750: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
2760: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2f 0a   CURRENT ROW.*/.
2770: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c  static void ntil
2780: 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c  eStepFunc(.  sql
2790: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
27a0: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
27b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
27c0: 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74   **apArg.){.  st
27d0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70  ruct NtileCtx *p
27e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
27f0: 3d 3d 32 20 29 3b 0a 20 20 70 20 3d 20 28 73 74  ==2 );.  p = (st
2800: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
2810: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2820: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2830: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2840: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2850: 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20  ->nTotal==0 ){. 
2860: 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20 3d       p->nParam =
2870: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2880: 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a  nt64(apArg[0]);.
2890: 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20        p->nTotal 
28a0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
28b0: 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d 29 3b  int64(apArg[1]);
28c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
28d0: 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  aram<=0 ){.     
28e0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
28f0: 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20  t_error(.       
2900: 20 20 20 20 20 70 43 74 78 2c 20 22 61 72 67 75       pCtx, "argu
2910: 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75  ment of ntile mu
2920: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
2930: 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20   integer", -1.  
2940: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2950: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 52  .    }.    p->iR
2960: 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ow++;.  }.}.stat
2970: 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 49 6e 76  ic void ntileInv
2980: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2990: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
29a0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
29b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
29c0: 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20  Arg.){.}.static 
29d0: 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75 65 46  void ntileValueF
29e0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
29f0: 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74  ext *pCtx){.  st
2a00: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70  ruct NtileCtx *p
2a10: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
2a20: 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65  NtileCtx*)sqlite
2a30: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2a40: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2a50: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2a60: 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20 29 7b  & p->nParam>0 ){
2a70: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d  .    int nSize =
2a80: 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20 70 2d   (p->nTotal / p-
2a90: 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20 69 66  >nParam);.    if
2aa0: 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  ( nSize==0 ){.  
2ab0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2ac0: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
2ad0: 2d 3e 69 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  ->iRow);.    }el
2ae0: 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 4c  se{.      i64 nL
2af0: 61 72 67 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c  arge = p->nTotal
2b00: 20 2d 20 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69   - p->nParam*nSi
2b10: 7a 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53  ze;.      i64 iS
2b20: 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e  mall = nLarge*(n
2b30: 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 20 20 69  Size+1);.      i
2b40: 36 34 20 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f  64 iRow = p->iRo
2b50: 77 2d 31 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  w-1;..      asse
2b60: 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e 53 69  rt( (nLarge*(nSi
2b70: 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50 61 72  ze+1) + (p->nPar
2b80: 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69 7a 65  am-nLarge)*nSize
2b90: 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29 3b 0a  )==p->nTotal );.
2ba0: 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 3c  .      if( iRow<
2bb0: 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20  iSmall ){.      
2bc0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2bd0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b  _int64(pCtx, 1 +
2be0: 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31 29 29   iRow/(nSize+1))
2bf0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2c00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2c10: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2c20: 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b 20 28  , 1 + nLarge + (
2c30: 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e 53 69  iRow-iSmall)/nSi
2c40: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
2c50: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2c60: 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66  Context object f
2c70: 6f 72 20 6c 61 73 74 5f 76 61 6c 75 65 28 29 20  or last_value() 
2c80: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e  window function.
2c90: 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 61 73 74 56  .*/.struct LastV
2ca0: 61 6c 75 65 43 74 78 20 7b 0a 20 20 73 71 6c 69  alueCtx {.  sqli
2cb0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
2cc0: 0a 20 20 69 6e 74 20 6e 56 61 6c 3b 0a 7d 3b 0a  .  int nVal;.};.
2cd0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2ce0: 61 74 69 6f 6e 20 6f 66 20 6c 61 73 74 5f 76 61  ation of last_va
2cf0: 6c 75 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lue()..*/.static
2d00: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2d10: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2d20: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2d30: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2d40: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2d50: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
2d60: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
2d70: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
2d80: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a  ct LastValueCtx*
2d90: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2da0: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2db0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2dc0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
2dd0: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
2de0: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
2df0: 3e 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  >pVal = sqlite3_
2e00: 76 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b  value_dup(apArg[
2e10: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0]);.    if( p->
2e20: 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pVal==0 ){.     
2e30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2e40: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78  error_nomem(pCtx
2e50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e60: 20 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20      p->nVal++;. 
2e70: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2e80: 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75  c void last_valu
2e90: 65 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69  eInvFunc(.  sqli
2ea0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2eb0: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2ec0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2ed0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
2ee0: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
2ef0: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
2f00: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a  ct LastValueCtx*
2f10: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2f20: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2f30: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2f40: 69 66 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b  if( ALWAYS(p) ){
2f50: 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 2d 2d 3b 0a  .    p->nVal--;.
2f60: 20 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 3d      if( p->nVal=
2f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2f80: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
2f90: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 70  ->pVal);.      p
2fa0: 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ->pVal = 0;.    
2fb0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2fc0: 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 56 61  oid last_valueVa
2fd0: 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  lueFunc(sqlite3_
2fe0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
2ff0: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
3000: 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ueCtx *p;.  p = 
3010: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
3020: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
3030: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3040: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
3050: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
3060: 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  >pVal ){.    sql
3070: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
3080: 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29  e(pCtx, p->pVal)
3090: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
30a0: 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 46 69  oid last_valueFi
30b0: 6e 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74  nalizeFunc(sqlit
30c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
30d0: 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73 74  ){.  struct Last
30e0: 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70  ValueCtx *p;.  p
30f0: 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74 56   = (struct LastV
3100: 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33  alueCtx*)sqlite3
3110: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
3120: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
3130: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26  *p));.  if( p &&
3140: 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20   p->pVal ){.    
3150: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
3160: 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56  alue(pCtx, p->pV
3170: 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
3180: 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70  _value_free(p->p
3190: 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  Val);.    p->pVa
31a0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  l = 0;.  }.}../*
31b0: 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d  .** No-op implem
31c0: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 6e 74 68  entations of nth
31d0: 5f 76 61 6c 75 65 28 29 2c 20 66 69 72 73 74 5f  _value(), first_
31e0: 76 61 6c 75 65 28 29 2c 20 6c 65 61 64 28 29 20  value(), lead() 
31f0: 61 6e 64 20 6c 61 67 28 29 2e 0a 2a 2a 20 54 68  and lag()..** Th
3200: 65 73 65 20 61 72 65 20 61 6c 6c 20 69 6d 70 6c  ese are all impl
3210: 65 6d 65 6e 74 65 64 20 69 6e 6c 69 6e 65 20 75  emented inline u
3220: 73 69 6e 67 20 56 44 42 45 20 69 6e 73 74 72 75  sing VDBE instru
3230: 63 74 69 6f 6e 73 2e 20 0a 2a 2f 0a 73 74 61 74  ctions. .*/.stat
3240: 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75  ic void nth_valu
3250: 65 53 74 65 70 46 75 6e 63 28 73 71 6c 69 74 65  eStepFunc(sqlite
3260: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3270: 20 69 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f   int n, sqlite3_
3280: 76 61 6c 75 65 20 2a 2a 61 29 7b 7d 0a 73 74 61  value **a){}.sta
3290: 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c  tic void nth_val
32a0: 75 65 49 6e 76 46 75 6e 63 28 73 71 6c 69 74 65  ueInvFunc(sqlite
32b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
32c0: 20 69 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f   int n, sqlite3_
32d0: 76 61 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a 73 74  value **ap){}.st
32e0: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
32f0: 6c 75 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  lueValueFunc(sql
3300: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
3310: 74 78 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69  tx){}.static voi
3320: 64 20 66 69 72 73 74 5f 76 61 6c 75 65 53 74 65  d first_valueSte
3330: 70 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  pFunc(sqlite3_co
3340: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 6e 2c  ntext *p, int n,
3350: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3360: 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f  *ap){}.static vo
3370: 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65 49 6e  id first_valueIn
3380: 76 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  vFunc(sqlite3_co
3390: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 6e 2c  ntext *p, int n,
33a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
33b0: 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f  *ap){}.static vo
33c0: 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65 56 61  id first_valueVa
33d0: 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  lueFunc(sqlite3_
33e0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 7d  context *pCtx){}
33f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61  .static void lea
3400: 64 53 74 65 70 46 75 6e 63 28 73 71 6c 69 74 65  dStepFunc(sqlite
3410: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3420: 20 69 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f   int n, sqlite3_
3430: 76 61 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a 73 74  value **ap){}.st
3440: 61 74 69 63 20 76 6f 69 64 20 6c 65 61 64 49 6e  atic void leadIn
3450: 76 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  vFunc(sqlite3_co
3460: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74  ntext *pCtx, int
3470: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   n, sqlite3_valu
3480: 65 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63  e **ap){}.static
3490: 20 76 6f 69 64 20 6c 65 61 64 56 61 6c 75 65 46   void leadValueF
34a0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
34b0: 65 78 74 20 2a 70 43 74 78 29 7b 7d 0a 73 74 61  ext *pCtx){}.sta
34c0: 74 69 63 20 76 6f 69 64 20 6c 61 67 53 74 65 70  tic void lagStep
34d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
34e0: 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20  text *pCtx, int 
34f0: 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n, sqlite3_value
3500: 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20   **ap){}.static 
3510: 76 6f 69 64 20 6c 61 67 49 6e 76 46 75 6e 63 28  void lagInvFunc(
3520: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3530: 2a 70 43 74 78 2c 20 69 6e 74 20 6e 2c 20 73 71  *pCtx, int n, sq
3540: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
3550: 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ){}.static void 
3560: 6c 61 67 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  lagValueFunc(sql
3570: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
3580: 74 78 29 7b 7d 0a 0a 23 64 65 66 69 6e 65 20 57  tx){}..#define W
3590: 49 4e 44 4f 57 46 55 4e 43 28 6e 61 6d 65 2c 6e  INDOWFUNC(name,n
35a0: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
35e0: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
35f0: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3600: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3620: 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46  .  name ## StepF
3630: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
3640: 75 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  ueFunc, name ## 
3650: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3660: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3670: 6e 61 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c  name ## InvFunc,
3680: 20 23 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20   #name          
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e       \.}..#defin
36c0: 65 20 57 49 4e 44 4f 57 46 55 4e 43 46 28 6e 61  e WINDOWFUNCF(na
36d0: 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29 20 7b  me,nArg,extra) {
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28       \.  nArg, (
3710: 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49  SQLITE_UTF8|SQLI
3720: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65  TE_FUNC_WINDOW|e
3730: 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20  xtra), 0, 0,    
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 53 74    \.  name ## St
3760: 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  epFunc, name ## 
3770: 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20 6e 61  FinalizeFunc, na
3780: 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c  me ## ValueFunc,
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37a0: 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76 46 75  .  name ## InvFu
37b0: 6e 63 2c 20 23 6e 61 6d 65 20 20 20 20 20 20 20  nc, #name       
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a          \.}../*.
37f0: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 6f 73  ** Register thos
3800: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
3810: 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w functions that
3820: 20 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67   are not also ag
3830: 67 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69  gregates..*/.voi
3840: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46  d sqlite3WindowF
3850: 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a  unctions(void){.
3860: 20 20 73 74 61 74 69 63 20 46 75 6e 63 44 65 66    static FuncDef
3870: 20 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20   aWindowFuncs[] 
3880: 3d 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  = {.    WINDOWFU
3890: 4e 43 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30  NC(row_number, 0
38a0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
38b0: 46 55 4e 43 28 64 65 6e 73 65 5f 72 61 6e 6b 2c  FUNC(dense_rank,
38c0: 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44   0, 0),.    WIND
38d0: 4f 57 46 55 4e 43 28 72 61 6e 6b 2c 20 30 2c 20  OWFUNC(rank, 0, 
38e0: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
38f0: 4e 43 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c  NC(percent_rank,
3900: 20 30 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   0, SQLITE_FUNC_
3910: 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20  WINDOW_SIZE),.  
3920: 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 63 75 6d    WINDOWFUNC(cum
3930: 65 5f 64 69 73 74 2c 20 30 2c 20 53 51 4c 49 54  e_dist, 0, SQLIT
3940: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49  E_FUNC_WINDOW_SI
3950: 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46  ZE),.    WINDOWF
3960: 55 4e 43 28 6e 74 69 6c 65 2c 20 31 2c 20 53 51  UNC(ntile, 1, SQ
3970: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
3980: 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44  _SIZE),.    WIND
3990: 4f 57 46 55 4e 43 46 28 6c 61 73 74 5f 76 61 6c  OWFUNCF(last_val
39a0: 75 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57  ue, 1, 0),.    W
39b0: 49 4e 44 4f 57 46 55 4e 43 28 6e 74 68 5f 76 61  INDOWFUNC(nth_va
39c0: 6c 75 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20  lue, 2, 0),.    
39d0: 57 49 4e 44 4f 57 46 55 4e 43 28 66 69 72 73 74  WINDOWFUNC(first
39e0: 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20  _value, 1, 0),. 
39f0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65     WINDOWFUNC(le
3a00: 61 64 2c 20 31 2c 20 30 29 2c 20 57 49 4e 44 4f  ad, 1, 0), WINDO
3a10: 57 46 55 4e 43 28 6c 65 61 64 2c 20 32 2c 20 30  WFUNC(lead, 2, 0
3a20: 29 2c 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65  ), WINDOWFUNC(le
3a30: 61 64 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57  ad, 3, 0),.    W
3a40: 49 4e 44 4f 57 46 55 4e 43 28 6c 61 67 2c 20 31  INDOWFUNC(lag, 1
3a50: 2c 20 30 29 2c 20 20 57 49 4e 44 4f 57 46 55 4e  , 0),  WINDOWFUN
3a60: 43 28 6c 61 67 2c 20 32 2c 20 30 29 2c 20 20 57  C(lag, 2, 0),  W
3a70: 49 4e 44 4f 57 46 55 4e 43 28 6c 61 67 2c 20 33  INDOWFUNC(lag, 3
3a80: 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c  , 0),.  };.  sql
3a90: 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69  ite3InsertBuilti
3aa0: 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f 77 46 75  nFuncs(aWindowFu
3ab0: 6e 63 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61  ncs, ArraySize(a
3ac0: 57 69 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a 7d  WindowFuncs));.}
3ad0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3ae0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3af0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
3b00: 72 20 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20  r resolving the 
3b10: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a  function name.**
3b20: 20 66 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75   for a window fu
3b30: 6e 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  nction within a 
3b40: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3b50: 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74  . Argument pList
3b60: 20 69 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20   is a.** linked 
3b70: 6c 69 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64  list of WINDOW d
3b80: 65 66 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74  efinitions for t
3b90: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
3ba0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
3bb0: 41 72 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69  Argument pFunc i
3bc0: 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  s the function d
3bd0: 65 66 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72  efinition just r
3be0: 65 73 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e  esolved and pWin
3bf0: 0a 2a 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f  .** is the Windo
3c00: 77 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  w object represe
3c10: 6e 74 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69  nting the associ
3c20: 61 74 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65  ated OVER clause
3c30: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
3c40: 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20 63  on updates the c
3c50: 6f 6e 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20  ontents of pWin 
3c60: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3c70: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45  *   * If the OVE
3c80: 52 20 63 6c 61 75 73 65 20 72 65 66 65 72 65 64  R clause refered
3c90: 20 74 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64   to a named wind
3ca0: 6f 77 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78  ow (as in "max(x
3cb0: 29 20 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a  ) OVER win"),.**
3cc0: 20 20 20 20 20 73 65 61 72 63 68 20 6c 69 73 74       search list
3cd0: 20 70 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74   pList for a mat
3ce0: 63 68 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66  ching WINDOW def
3cf0: 69 6e 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64  inition, and upd
3d00: 61 74 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20  ate pWin.**     
3d10: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
3d20: 6e 6f 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63  no such WINDOW c
3d30: 6c 61 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75  lause can be fou
3d40: 6e 64 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  nd, leave an err
3d50: 6f 72 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61  or.**     in pPa
3d60: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  rse..**.**   * I
3d70: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  f the function i
3d80: 73 20 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  s a built-in win
3d90: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  dow function tha
3da0: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
3db0: 2a 20 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20  *     window to 
3dc0: 62 65 20 63 6f 65 72 63 65 64 20 28 73 65 65 20  be coerced (see 
3dd0: 22 42 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57  "BUILT-IN WINDOW
3de0: 20 46 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74   FUNCTIONS" at t
3df0: 68 65 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66  he top.**     of
3e00: 20 74 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69   this file), pWi
3e10: 6e 20 69 73 20 75 70 64 61 74 65 64 20 68 65 72  n is updated her
3e20: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
3e30: 65 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a  e3WindowUpdate(.
3e40: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3e50: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73   .  Window *pLis
3e60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3e70: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
3e80: 61 6d 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72  amed windows for
3e90: 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
3ea0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20    Window *pWin, 
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d    /* Window fram
3ed0: 65 20 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20  e to update */. 
3ee0: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74   /* Window funct
3f10: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a  ion definition *
3f20: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d  /.){.  if( pWin-
3f30: 3e 7a 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e  >zName && pWin->
3f40: 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
3f50: 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20 20 20 66  Window *p;.    f
3f60: 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
3f70: 3d 70 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  =p->pNextWin){. 
3f80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3f90: 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65  StrICmp(p->zName
3fa0: 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29 3d 3d  , pWin->zName)==
3fb0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
3fc0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
3fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3fe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3ff0: 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20  no such window: 
4000: 25 73 22 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65  %s", pWin->zName
4010: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
4020: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 2d  .    }.    pWin-
4030: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71  >pPartition = sq
4040: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
4050: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
4060: 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
4070: 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72      pWin->pOrder
4080: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
4090: 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
40a0: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
40b0: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70   0);.    pWin->p
40c0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45  Start = sqlite3E
40d0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
40e0: 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29  b, p->pStart, 0)
40f0: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64  ;.    pWin->pEnd
4100: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4110: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  p(pParse->db, p-
4120: 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 70  >pEnd, 0);.    p
4130: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d  Win->eStart = p-
4140: 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 70 57 69  >eStart;.    pWi
4150: 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e  n->eEnd = p->eEn
4160: 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 54 79  d;.    pWin->eTy
4170: 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20  pe = p->eType;. 
4180: 20 7d 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e   }.  if( pFunc->
4190: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
41a0: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29  TE_FUNC_WINDOW )
41b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
41c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
41d0: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
41e0: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  ilter ){.      s
41f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4200: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
4210: 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65    "FILTER clause
4220: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
4230: 64 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  d with aggregate
4240: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4250: 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  s".      );.    
4260: 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 46  }else.    if( pF
4270: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 72 6f 77  unc->xSFunc==row
4280: 5f 6e 75 6d 62 65 72 53 74 65 70 46 75 6e 63 20  _numberStepFunc 
4290: 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  || pFunc->xSFunc
42a0: 3d 3d 6e 74 69 6c 65 53 74 65 70 46 75 6e 63 20  ==ntileStepFunc 
42b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
42c0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
42d0: 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20  Win->pStart);.  
42e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
42f0: 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e  elete(db, pWin->
4300: 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69  pEnd);.      pWi
4310: 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e  n->pStart = pWin
4320: 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20  ->pEnd = 0;.    
4330: 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20    pWin->eType = 
4340: 54 4b 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70  TK_ROWS;.      p
4350: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b  Win->eStart = TK
4360: 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20  _UNBOUNDED;.    
4370: 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54    pWin->eEnd = T
4380: 4b 5f 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d  K_CURRENT;.    }
4390: 65 6c 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46  else..    if( pF
43a0: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 64 65 6e  unc->xSFunc==den
43b0: 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 20  se_rankStepFunc 
43c0: 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  || pFunc->xSFunc
43d0: 3d 3d 72 61 6e 6b 53 74 65 70 46 75 6e 63 0a 20  ==rankStepFunc. 
43e0: 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53      || pFunc->xS
43f0: 46 75 6e 63 3d 3d 70 65 72 63 65 6e 74 5f 72 61  Func==percent_ra
4400: 6e 6b 53 74 65 70 46 75 6e 63 20 7c 7c 20 70 46  nkStepFunc || pF
4410: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 63 75 6d  unc->xSFunc==cum
4420: 65 5f 64 69 73 74 53 74 65 70 46 75 6e 63 0a 20  e_distStepFunc. 
4430: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
4440: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4450: 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b  , pWin->pStart);
4460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4470: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4480: 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 20 20  n->pEnd);.      
4490: 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70  pWin->pStart = p
44a0: 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20  Win->pEnd = 0;. 
44b0: 20 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65       pWin->eType
44c0: 20 3d 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 20   = TK_RANGE;.   
44d0: 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20     pWin->eStart 
44e0: 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a  = TK_UNBOUNDED;.
44f0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64        pWin->eEnd
4500: 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b 0a 20   = TK_CURRENT;. 
4510: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 69 6e 2d     }.  }.  pWin-
4520: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0a  >pFunc = pFunc;.
4530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74  }../*.** Context
4540: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 74   object passed t
4550: 68 72 6f 75 67 68 20 73 71 6c 69 74 65 33 57 61  hrough sqlite3Wa
4560: 6c 6b 45 78 70 72 4c 69 73 74 28 29 20 74 6f 0a  lkExprList() to.
4570: 2a 2a 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52  ** selectWindowR
4580: 65 77 72 69 74 65 45 78 70 72 43 62 28 29 20 62  ewriteExprCb() b
4590: 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  y selectWindowRe
45a0: 77 72 69 74 65 45 4c 69 73 74 28 29 2e 0a 2a 2f  writeEList()..*/
45b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
45c0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 57 69  WindowRewrite Wi
45d0: 6e 64 6f 77 52 65 77 72 69 74 65 3b 0a 73 74 72  ndowRewrite;.str
45e0: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
45f0: 65 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e {.  Window *pW
4600: 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  in;.  ExprList *
4610: 70 53 75 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  pSub;.};../*.** 
4620: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
4630: 6e 20 75 73 65 64 20 62 79 20 73 65 6c 65 63 74  n used by select
4640: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
4650: 73 74 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61  st(). If necessa
4660: 72 79 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ry,.** this func
4670: 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20  tion appends to 
4680: 74 68 65 20 6f 75 74 70 75 74 20 65 78 70 72 65  the output expre
4690: 73 73 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75  ssion-list and u
46a0: 70 64 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65  pdates .** expre
46b0: 73 73 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20  ssion (*ppExpr) 
46c0: 69 6e 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61  in place..*/.sta
46d0: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69  tic int selectWi
46e0: 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43  ndowRewriteExprC
46f0: 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  b(Walker *pWalke
4700: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
4710: 0a 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  .  struct Window
4720: 52 65 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61  Rewrite *p = pWa
4730: 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65  lker->u.pRewrite
4740: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
4750: 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
4760: 72 73 65 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  rse;..  switch( 
4770: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20  pExpr->op ){..  
4780: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
4790: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45  ON:.      if( pE
47a0: 78 70 72 2d 3e 70 57 69 6e 3d 3d 30 20 29 7b 0a  xpr->pWin==0 ){.
47b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
47c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
47d0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
47e0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 57  ;.        for(pW
47f0: 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e  in=p->pWin; pWin
4800: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
4810: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20  xtWin){.        
4820: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 57 69    if( pExpr->pWi
4830: 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  n==pWin ){.     
4840: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4850: 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70 45 78  Win->pOwner==pEx
4860: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pr );.          
4870: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
4880: 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ne;.          }.
4890: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
48a0: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
48b0: 74 68 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20  through.  */..  
48c0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
48d0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
48e0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
48f0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d      Expr *pDup =
4900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4910: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
4920: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e  r, 0);.      p->
4930: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 45 78  pSub = sqlite3Ex
4940: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
4950: 72 73 65 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44  rse, p->pSub, pD
4960: 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  up);.      if( p
4970: 2d 3e 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->pSub ){.      
4980: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
4990: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
49a0: 20 45 50 5f 53 74 61 74 69 63 29 3d 3d 30 20 29   EP_Static)==0 )
49b0: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65  ;.        ExprSe
49c0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
49d0: 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20   EP_Static);.   
49e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
49f0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
4a00: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
4a10: 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70     ExprClearProp
4a20: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
4a30: 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20  tatic);.        
4a40: 6d 65 6d 73 65 74 28 70 45 78 70 72 2c 20 30 2c  memset(pExpr, 0,
4a50: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
4a60: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
4a70: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
4a80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4a90: 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62  Column = p->pSub
4aa0: 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 20  ->nExpr-1;.     
4ab0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
4ac0: 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68   = p->pWin->iEph
4ad0: 43 73 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Csr;.      }..  
4ae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4af0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f  ..    default: /
4b00: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
4b10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72   break;.  }..  r
4b20: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
4b30: 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
4b40: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
4b50: 72 69 74 65 53 65 6c 65 63 74 43 62 28 57 61 6c  riteSelectCb(Wal
4b60: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
4b70: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
4b80: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
4b90: 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74  ne;.}.../*.** It
4ba0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 61  erate through ea
4bb0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
4bc0: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
4bd0: 20 70 45 4c 69 73 74 2e 20 46 6f 72 20 65 61 63   pEList. For eac
4be0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 4b 5f  h:.**.**   * TK_
4bf0: 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20 20 2a 20 61  COLUMN,.**   * a
4c00: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
4c10: 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 77 69 6e  n, or.**   * win
4c20: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  dow function wit
4c30: 68 20 61 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63  h a Window objec
4c40: 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
4c50: 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20 0a 2a  member of the .*
4c60: 2a 20 20 20 20 20 6c 69 6e 6b 65 64 20 6c 69 73  *     linked lis
4c70: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
4c80: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4c90: 28 70 57 69 6e 29 0a 2a 2a 0a 2a 2a 20 41 70 70  (pWin).**.** App
4ca0: 65 6e 64 20 74 68 65 20 6e 6f 64 65 20 74 6f 20  end the node to 
4cb0: 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69 6f  output expressio
4cc0: 6e 2d 6c 69 73 74 20 28 2a 70 70 53 75 62 29 2e  n-list (*ppSub).
4cd0: 20 41 6e 64 20 72 65 70 6c 61 63 65 20 69 74 0a   And replace it.
4ce0: 2a 2a 20 77 69 74 68 20 61 20 54 4b 5f 43 4f 4c  ** with a TK_COL
4cf0: 55 4d 4e 20 74 68 61 74 20 72 65 61 64 73 20 74  UMN that reads t
4d00: 68 65 20 28 4e 2d 31 29 74 68 20 65 6c 65 6d 65  he (N-1)th eleme
4d10: 6e 74 20 6f 66 20 74 61 62 6c 65 20 0a 2a 2a 20  nt of table .** 
4d20: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 77  pWin->iEphCsr, w
4d30: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
4d40: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4d50: 20 69 6e 20 28 2a 70 70 53 75 62 29 20 61 66 74   in (*ppSub) aft
4d60: 65 72 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20  er.** appending 
4d70: 74 68 65 20 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a  the new one..*/.
4d80: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
4d90: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
4da0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
4db0: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
4dc0: 20 2a 70 57 69 6e 2c 0a 20 20 45 78 70 72 4c 69   *pWin,.  ExprLi
4dd0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
4de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77            /* Rew
4df0: 72 69 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  rite expressions
4e00: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 20 2a 2f   in this list */
4e10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
4e20: 53 75 62 20 20 20 20 20 20 20 20 20 20 20 20 20  Sub             
4e30: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75     /* IN/OUT: Su
4e40: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
4e50: 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20  ion-list */.){. 
4e60: 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b   Walker sWalker;
4e70: 0a 20 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  .  WindowRewrite
4e80: 20 73 52 65 77 72 69 74 65 3b 0a 0a 20 20 6d 65   sRewrite;..  me
4e90: 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30  mset(&sWalker, 0
4ea0: 2c 20 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29  , sizeof(Walker)
4eb0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 52 65  );.  memset(&sRe
4ec0: 77 72 69 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66  write, 0, sizeof
4ed0: 28 57 69 6e 64 6f 77 52 65 77 72 69 74 65 29 29  (WindowRewrite))
4ee0: 3b 0a 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53  ;..  sRewrite.pS
4ef0: 75 62 20 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73  ub = *ppSub;.  s
4f00: 52 65 77 72 69 74 65 2e 70 57 69 6e 20 3d 20 70  Rewrite.pWin = p
4f10: 57 69 6e 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e  Win;..  sWalker.
4f20: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
4f30: 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72  .  sWalker.xExpr
4f40: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
4f50: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78  tWindowRewriteEx
4f60: 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  prCb;.  sWalker.
4f70: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
4f80: 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  = selectWindowRe
4f90: 77 72 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20  writeSelectCb;. 
4fa0: 20 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72   sWalker.u.pRewr
4fb0: 69 74 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b  ite = &sRewrite;
4fc0: 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ..  (void)sqlite
4fd0: 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73  3WalkExprList(&s
4fe0: 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b  Walker, pEList);
4ff0: 0a 0a 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65  ..  *ppSub = sRe
5000: 77 72 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f  write.pSub;.}../
5010: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f  *.** Append a co
5020: 70 79 20 6f 66 20 65 61 63 68 20 65 78 70 72 65  py of each expre
5030: 73 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73  ssion in express
5040: 69 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64  ion-list pAppend
5050: 20 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   to.** expressio
5060: 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65  n list pList. Re
5070: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
5080: 6f 20 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73  o the result lis
5090: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  t..*/.static Exp
50a0: 72 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41  rList *exprListA
50b0: 70 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72  ppendList(.  Par
50c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
50d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
50e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
50f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
5100: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
5110: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
5120: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
5130: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41  /.  ExprList *pA
5140: 70 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c  ppend       /* L
5150: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  ist of values to
5160: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
5170: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  e NULL */.){.  i
5180: 66 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20  f( pAppend ){.  
5190: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
51a0: 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f   nInit = pList ?
51b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
51c0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
51d0: 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72  i<pAppend->nExpr
51e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
51f0: 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74  pr *pDup = sqlit
5200: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
5210: 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61  ->db, pAppend->a
5220: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [i].pExpr, 0);. 
5230: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
5240: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
5250: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
5260: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
5270: 66 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74  f( pList ) pList
5280: 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72  ->a[nInit+i].sor
5290: 74 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64  tOrder = pAppend
52a0: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
52b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
52c0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
52d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
52e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
52f0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
5300: 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20  d argument does 
5310: 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e  not invoke.** an
5320: 79 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e  y SQL window fun
5330: 63 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e  ctions, this fun
5340: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
5350: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
5360: 0a 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65  .** rewrites the
5370: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5380: 74 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77  t so that window
5390: 20 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20   function xStep 
53a0: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  functions.** are
53b0: 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20   invoked in the 
53c0: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 61 73  correct order as
53d0: 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72   described under
53e0: 20 22 53 45 4c 45 43 54 20 52 45 57 52 49 54 49   "SELECT REWRITI
53f0: 4e 47 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f  NG".** at the to
5400: 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a  p of this file..
5410: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69  */.int sqlite3Wi
5420: 6e 64 6f 77 52 65 77 72 69 74 65 28 50 61 72 73  ndowRewrite(Pars
5430: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
5440: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  t *p){.  int rc 
5450: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
5460: 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20  f( p->pWin ){.  
5470: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5480: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
5490: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  e);.    sqlite3 
54a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
54b0: 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
54c0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
54d0: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
54e0: 65 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  ery */.    SrcLi
54f0: 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
5500: 72 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57  rc;.    Expr *pW
5510: 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
5520: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
5530: 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
5540: 72 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72  roupBy;.    Expr
5550: 20 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70   *pHaving = p->p
5560: 48 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72  Having;.    Expr
5570: 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b  List *pSort = 0;
5580: 0a 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ..    ExprList *
5590: 70 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20  pSublist = 0;   
55a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
55b0: 6e 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71  n list for sub-q
55c0: 75 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64  uery */.    Wind
55d0: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
55e0: 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73  Win;      /* Mas
55f0: 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  ter window objec
5600: 74 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20  t */.    Window 
5610: 2a 70 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20  *pWin;          
5620: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
5630: 20 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72   object iterator
5640: 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63   */..    p->pSrc
5650: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68   = 0;.    p->pWh
5660: 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ere = 0;.    p->
5670: 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
5680: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30    p->pHaving = 0
5690: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
56a0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
56b0: 61 75 73 65 20 66 6f 72 20 74 68 65 20 73 75 62  ause for the sub
56c0: 2d 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73  -select. This is
56d0: 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69   the concatenati
56e0: 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  on.    ** of the
56f0: 20 77 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f   window PARTITIO
5700: 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63  N and ORDER BY c
5710: 6c 61 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66  lauses. Then, if
5720: 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20   this makes it. 
5730: 20 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c     ** redundant,
5740: 20 72 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45   remove the ORDE
5750: 52 20 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61  R BY from the pa
5760: 72 65 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f  rent SELECT.  */
5770: 0a 20 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c  .    pSort = sql
5780: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
5790: 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  db, pMWin->pPart
57a0: 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70  ition, 0);.    p
57b0: 53 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41  Sort = exprListA
57c0: 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65  ppendList(pParse
57d0: 2c 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e  , pSort, pMWin->
57e0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
57f0: 66 28 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70  f( pSort && p->p
5800: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5810: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
5820: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72  ListCompare(pSor
5830: 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  t, p->pOrderBy, 
5840: 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
5850: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
5860: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
5870: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
5880: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
5890: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
58a0: 0a 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20  ..    /* Assign 
58b0: 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  a cursor number 
58c0: 66 6f 72 20 74 68 65 20 65 70 68 65 6d 65 72 61  for the ephemera
58d0: 6c 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  l table used to 
58e0: 62 75 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20  buffer rows..   
58f0: 20 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65   ** The OpenEphe
5900: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
5910: 6e 20 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72  n is coded later
5920: 2c 20 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e  , after it is kn
5930: 6f 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d  own how.    ** m
5940: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20  any columns the 
5950: 74 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e  table will have.
5960: 20 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e    */.    pMWin->
5970: 69 45 70 68 43 73 72 20 3d 20 70 50 61 72 73 65  iEphCsr = pParse
5980: 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 73  ->nTab++;..    s
5990: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
59a0: 74 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20  teEList(pParse, 
59b0: 70 4d 57 69 6e 2c 20 70 2d 3e 70 45 4c 69 73 74  pMWin, p->pEList
59c0: 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20  , &pSublist);.  
59d0: 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65    selectWindowRe
59e0: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
59f0: 65 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 4f 72  e, pMWin, p->pOr
5a00: 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74  derBy, &pSublist
5a10: 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42  );.    pMWin->nB
5a20: 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62  ufferCol = (pSub
5a30: 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d  list ? pSublist-
5a40: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20  >nExpr : 0);..  
5a50: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
5a60: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e 64  PARTITION BY and
5a70: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
5a80: 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74 6f 20  sions to the to 
5a90: 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
5aa0: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
5ab0: 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72 65  n list. They are
5ac0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 67   required to fig
5ad0: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 0a 20  ure out where . 
5ae0: 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69 65 73     ** boundaries
5af0: 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20   for partitions 
5b00: 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65 72  and sets of peer
5b10: 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f 0a 20   rows lie.  */. 
5b20: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78     pSublist = ex
5b30: 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74  prListAppendList
5b40: 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73  (pParse, pSublis
5b50: 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  t, pMWin->pParti
5b60: 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75 62 6c  tion);.    pSubl
5b70: 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ist = exprListAp
5b80: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
5b90: 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e   pSublist, pMWin
5ba0: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  ->pOrderBy);..  
5bb0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
5bc0: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
5bd0: 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20   to each window 
5be0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a  function to the.
5bf0: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
5c00: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
5c10: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
5c20: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66   two registers f
5c30: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77  or each.    ** w
5c40: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d  indow function -
5c50: 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63   one for the acc
5c60: 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65  umulator, anothe
5c70: 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20  r for interim.  
5c80: 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a    ** results.  *
5c90: 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70  /.    for(pWin=p
5ca0: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
5cb0: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
5cc0: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41  {.      pWin->iA
5cd0: 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73  rgCol = (pSublis
5ce0: 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45  t ? pSublist->nE
5cf0: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
5d00: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
5d10: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
5d20: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
5d30: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
5d40: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
5d50: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
5d60: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
5d70: 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  *pFilter = sqlit
5d80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
5d90: 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b  in->pFilter, 0);
5da0: 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c 69 73  .        pSublis
5db0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
5dc0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
5dd0: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69 6c  , pSublist, pFil
5de0: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
5df0: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63      pWin->regAcc
5e00: 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  um = ++pParse->n
5e10: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Mem;.      pWin-
5e20: 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70  >regResult = ++p
5e30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e50: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
5e60: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
5e70: 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  um);.    }..    
5e80: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
5e90: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 50 41  o ORDER BY or PA
5ea0: 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61 75 73  RTITION BY claus
5eb0: 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e 64 6f  e, and the windo
5ec0: 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  w.    ** functio
5ed0: 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f 20 61  n accepts zero a
5ee0: 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68  rguments, and th
5ef0: 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72  ere are no other
5f00: 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20   columns.    ** 
5f10: 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e 20 22  selected (e.g. "
5f20: 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65  SELECT row_numbe
5f30: 72 28 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d  r() OVER () FROM
5f40: 20 74 31 22 29 2c 20 69 74 20 69 73 20 70 6f 73   t1"), it is pos
5f50: 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61  sible.    ** tha
5f60: 74 20 70 53 75 62 6c 69 73 74 20 69 73 20 73 74  t pSublist is st
5f70: 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e 20 41  ill NULL here. A
5f80: 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  dd a constant ex
5f90: 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20 74 6f  pression here to
5fa0: 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20 65 76   .    ** keep ev
5fb0: 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c 20 69  erything legal i
5fc0: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a 20 20  n this case. .  
5fd0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
5fe0: 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  blist==0 ){.    
5ff0: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c    pSublist = sql
6000: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6010: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
6020: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6030: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
6040: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
6050: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
6060: 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
6070: 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20 73 71  }..    pSub = sq
6080: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
6090: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
60a0: 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63 2c 20  pSublist, pSrc, 
60b0: 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
60c0: 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f 72 74  , pHaving, pSort
60d0: 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
60e0: 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
60f0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
6100: 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
6110: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
6120: 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
6130: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
6140: 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20  ( p->pSrc ){.   
6150: 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d     p->pSrc->a[0]
6160: 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 3b  .pSelect = pSub;
6170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
6180: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
6190: 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53  rs(pParse, p->pS
61a0: 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
61b0: 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71  qlite3ExpandSubq
61c0: 75 65 72 79 28 70 50 61 72 73 65 2c 20 26 70 2d  uery(pParse, &p-
61d0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a  >pSrc->a[0]) ){.
61e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
61f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
6200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6210: 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSub->selFlags |
6220: 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
6230: 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61         p->selFla
6240: 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67  gs &= ~SF_Aggreg
6250: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ate;.        sql
6260: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
6270: 50 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29 3b  Parse, pSub, 0);
6280: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62a0: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
62b0: 6d 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45  meral, pMWin->iE
62c0: 70 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74 2d  phCsr, pSublist-
62d0: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c  >nExpr);.    }el
62e0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
62f0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
6300: 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20  , pSub);.    }. 
6310: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
6320: 63 46 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53  cFailed ) rc = S
6330: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
6340: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
6350: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
6360: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70   Window object p
6370: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
6380: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
6390: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
63a0: 64 6f 77 44 65 6c 65 74 65 28 73 71 6c 69 74 65  dowDelete(sqlite
63b0: 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70  3 *db, Window *p
63c0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
63d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
63e0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74  ete(db, p->pFilt
63f0: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
6400: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
6410: 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e  b, p->pPartition
6420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6430: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
6440: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
6450: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6460: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 6e 64  lete(db, p->pEnd
6470: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6480: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
6490: 70 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  pStart);.    sql
64a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
64b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
64c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
64d0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
64e0: 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b 65 64   Free the linked
64f0: 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20   list of Window 
6500: 6f 62 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67  objects starting
6510: 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 61   at the second a
6520: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
6530: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69   sqlite3WindowLi
6540: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
6550: 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29   *db, Window *p)
6560: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
6570: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78      Window *pNex
6580: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b  t = p->pNextWin;
6590: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64  .    sqlite3Wind
65a0: 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  owDelete(db, p);
65b0: 0a 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a  .    p = pNext;.
65c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
65d0: 20 61 72 67 75 6d 65 6e 74 20 65 78 70 72 65 73   argument expres
65e0: 73 69 6f 6e 20 69 73 20 61 6e 20 50 52 45 43 45  sion is an PRECE
65f0: 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e  DING or FOLLOWIN
6600: 47 20 6f 66 66 73 65 74 2e 20 20 54 68 65 0a 2a  G offset.  The.*
6610: 2a 20 76 61 6c 75 65 20 73 68 6f 75 6c 64 20 62  * value should b
6620: 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  e a non-negative
6630: 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68   integer.  If th
6640: 65 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61  e value is not a
6650: 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63 68  .** constant, ch
6660: 61 6e 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c 2e  ange it to NULL.
6670: 20 20 54 68 65 20 66 61 63 74 20 74 68 61 74 20    The fact that 
6680: 69 74 20 69 73 20 74 68 65 6e 20 61 20 6e 6f 6e  it is then a non
6690: 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e 74  -negative.** int
66a0: 65 67 65 72 20 77 69 6c 6c 20 62 65 20 63 61 75  eger will be cau
66b0: 67 68 74 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ght later.  But 
66c0: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
66d0: 6e 6f 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a 20  not to leave.** 
66e0: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 73 20  variable values 
66f0: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
6700: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
6710: 63 20 45 78 70 72 20 2a 73 71 6c 69 74 65 33 57  c Expr *sqlite3W
6720: 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28  indowOffsetExpr(
6730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
6740: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
6750: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70  f( 0==sqlite3Exp
6760: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
6770: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
6780: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
6790: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
67a0: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
67b0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
67c0: 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c  rse->db, TK_NULL
67d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
67e0: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
67f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6800: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
6810: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 64 65  Window object de
6820: 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e 64 6f  scribing a Windo
6830: 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  w Definition..*/
6840: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
6850: 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50  WindowAlloc(.  P
6860: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6870: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6880: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ext */.  int eTy
6890: 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 72  pe,        /* Fr
68a0: 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52 41 4e  ame type. TK_RAN
68b0: 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20 2a 2f  GE or TK_ROWS */
68c0: 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20 20  .  int eStart,  
68d0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74 79       /* Start ty
68e0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50 52 45  pe: CURRENT, PRE
68f0: 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e  CEDING, FOLLOWIN
6900: 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a  G, UNBOUNDED */.
6910: 20 20 45 78 70 72 20 2a 70 53 74 61 72 74 2c 20    Expr *pStart, 
6920: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77 69 6e      /* Start win
6930: 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 50  dow size if TK_P
6940: 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c  RECEDING or FOLL
6950: 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 65  OWING */.  int e
6960: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  End,         /* 
6970: 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52 45 4e  End type: CURREN
6980: 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b  T, FOLLOWING, TK
6990: 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52 45 43  _UNBOUNDED, PREC
69a0: 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72 20  EDING */.  Expr 
69b0: 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *pEnd        /* 
69c0: 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a 65 20  End window size 
69d0: 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  if TK_FOLLOWING 
69e0: 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a  or PRECEDING */.
69f0: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  ){.  Window *pWi
6a00: 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72  n = 0;..  /* Par
6a10: 73 65 72 20 61 73 73 75 72 65 73 20 74 68 65 20  ser assures the 
6a20: 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20  following: */.  
6a30: 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 54  assert( eType==T
6a40: 4b 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70 65  K_RANGE || eType
6a50: 3d 3d 54 4b 5f 52 4f 57 53 20 29 3b 0a 20 20 61  ==TK_ROWS );.  a
6a60: 73 73 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54  ssert( eStart==T
6a70: 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74  K_CURRENT || eSt
6a80: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
6a90: 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  G.           || 
6aa0: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
6ab0: 4e 44 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d  NDED || eStart==
6ac0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a  TK_FOLLOWING );.
6ad0: 20 20 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d    assert( eEnd==
6ae0: 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45  TK_CURRENT || eE
6af0: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
6b00: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
6b10: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
6b20: 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  D || eEnd==TK_PR
6b30: 45 43 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73  ECEDING );.  ass
6b40: 65 72 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b  ert( (eStart==TK
6b50: 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53  _PRECEDING || eS
6b60: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
6b70: 4e 47 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29  NG)==(pStart!=0)
6b80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65   );.  assert( (e
6b90: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
6ba0: 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  G || eEnd==TK_PR
6bb0: 45 43 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21  ECEDING)==(pEnd!
6bc0: 3d 30 29 20 29 3b 0a 0a 0a 20 20 2f 2a 20 49 66  =0) );...  /* If
6bd0: 20 61 20 66 72 61 6d 65 20 69 73 20 64 65 63 6c   a frame is decl
6be0: 61 72 65 64 20 22 52 41 4e 47 45 22 20 28 6e 6f  ared "RANGE" (no
6bf0: 74 20 22 52 4f 57 53 22 29 2c 20 74 68 65 6e 20  t "ROWS"), then 
6c00: 69 74 20 6d 61 79 20 6e 6f 74 20 75 73 65 0a 20  it may not use. 
6c10: 20 2a 2a 20 65 69 74 68 65 72 20 22 3c 65 78 70   ** either "<exp
6c20: 72 3e 20 50 52 45 43 45 44 49 4e 47 22 20 6f 72  r> PRECEDING" or
6c30: 20 22 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49   "<expr> FOLLOWI
6c40: 4e 47 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  NG"..  */.  if( 
6c50: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
6c60: 26 26 20 28 70 53 74 61 72 74 21 3d 30 20 7c 7c  && (pStart!=0 ||
6c70: 20 70 45 6e 64 21 3d 30 29 20 29 7b 0a 20 20 20   pEnd!=0) ){.   
6c80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6c90: 28 70 50 61 72 73 65 2c 20 22 52 41 4e 47 45 20  (pParse, "RANGE 
6ca0: 6d 75 73 74 20 75 73 65 20 6f 6e 6c 79 20 55 4e  must use only UN
6cb0: 42 4f 55 4e 44 45 44 20 6f 72 20 43 55 52 52 45  BOUNDED or CURRE
6cc0: 4e 54 20 52 4f 57 22 29 3b 0a 20 20 20 20 67 6f  NT ROW");.    go
6cd0: 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72  to windowAllocEr
6ce0: 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  r;.  }..  /* Add
6cf0: 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 20  itionally, the. 
6d00: 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f 75   ** starting bou
6d10: 6e 64 61 72 79 20 74 79 70 65 20 6d 61 79 20 6e  ndary type may n
6d20: 6f 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65 72  ot occur earlier
6d30: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
6d40: 67 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a 2a  g list than.  **
6d50: 20 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75 6e   the ending boun
6d60: 64 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a 0a  dary type:.  **.
6d70: 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44    **   UNBOUNDED
6d80: 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20   PRECEDING.  ** 
6d90: 20 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49    <expr> PRECEDI
6da0: 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45 4e  NG.  **   CURREN
6db0: 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65 78  T ROW.  **   <ex
6dc0: 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20  pr> FOLLOWING.  
6dd0: 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 46  **   UNBOUNDED F
6de0: 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20  OLLOWING.  **.  
6df0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 65 6e  ** The parser en
6e00: 73 75 72 65 73 20 74 68 61 74 20 22 55 4e 42 4f  sures that "UNBO
6e10: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 22  UNDED PRECEDING"
6e20: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
6e30: 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20 2a  as an ending.  *
6e40: 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64 20  * boundary, and 
6e50: 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44 20  than "UNBOUNDED 
6e60: 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e 6f  FOLLOWING" canno
6e70: 74 20 62 65 20 75 73 65 64 20 61 73 20 61 20 73  t be used as a s
6e80: 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72 61  tarting.  ** fra
6e90: 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20 2a  me boundary..  *
6ea0: 2f 0a 20 20 69 66 28 20 28 65 53 74 61 72 74 3d  /.  if( (eStart=
6eb0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 65  =TK_CURRENT && e
6ec0: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
6ed0: 47 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72 74  G).   || (eStart
6ee0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26  ==TK_FOLLOWING &
6ef0: 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  & (eEnd==TK_PREC
6f00: 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54  EDING || eEnd==T
6f10: 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29 7b  K_CURRENT)).  ){
6f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6f30: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
6f40: 73 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65 20  supported frame 
6f50: 64 65 6c 69 6d 69 74 65 72 20 66 6f 72 20 52 4f  delimiter for RO
6f60: 57 53 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77  WS");.    goto w
6f70: 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20  indowAllocErr;. 
6f80: 20 7d 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57 69   }..  pWin = (Wi
6f90: 6e 64 6f 77 2a 29 73 71 6c 69 74 65 33 44 62 4d  ndow*)sqlite3DbM
6fa0: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
6fb0: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e  ->db, sizeof(Win
6fc0: 64 6f 77 29 29 3b 0a 20 20 69 66 28 20 70 57 69  dow));.  if( pWi
6fd0: 6e 3d 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e 64  n==0 ) goto wind
6fe0: 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70 57  owAllocErr;.  pW
6ff0: 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65 54 79 70  in->eType = eTyp
7000: 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61 72  e;.  pWin->eStar
7010: 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70 57  t = eStart;.  pW
7020: 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64 3b  in->eEnd = eEnd;
7030: 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20  .  pWin->pEnd = 
7040: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66  sqlite3WindowOff
7050: 73 65 74 45 78 70 72 28 70 50 61 72 73 65 2c 20  setExpr(pParse, 
7060: 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e 70  pEnd);.  pWin->p
7070: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 57  Start = sqlite3W
7080: 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28  indowOffsetExpr(
7090: 70 50 61 72 73 65 2c 20 70 53 74 61 72 74 29 3b  pParse, pStart);
70a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a  .  return pWin;.
70b0: 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a  .windowAllocErr:
70c0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
70d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
70e0: 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65   pEnd);.  sqlite
70f0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
7100: 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29 3b  se->db, pStart);
7110: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7120: 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 77 69 6e  /*.** Attach win
7130: 64 6f 77 20 6f 62 6a 65 63 74 20 70 57 69 6e 20  dow object pWin 
7140: 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2e  to expression p.
7150: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7160: 57 69 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72  WindowAttach(Par
7170: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7180: 20 2a 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69   *p, Window *pWi
7190: 6e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  n){.  if( p ){. 
71a0: 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20     if( pWin ){. 
71b0: 20 20 20 20 20 70 2d 3e 70 57 69 6e 20 3d 20 70       p->pWin = p
71c0: 57 69 6e 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Win;.      pWin-
71d0: 3e 70 4f 77 6e 65 72 20 3d 20 70 3b 0a 20 20 20  >pOwner = p;.   
71e0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
71f0: 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
7200: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7210: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7220: 0a 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53  .           "DIS
7230: 54 49 4e 43 54 20 69 73 20 6e 6f 74 20 73 75 70  TINCT is not sup
7240: 70 6f 72 74 65 64 20 66 6f 72 20 77 69 6e 64 6f  ported for windo
7250: 77 20 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20  w functions");. 
7260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7270: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
7280: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 70 50  3WindowDelete(pP
7290: 61 72 73 65 2d 3e 64 62 2c 20 70 57 69 6e 29 3b  arse->db, pWin);
72a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
72b0: 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
72c0: 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73  o window objects
72d0: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20   are identical, 
72e0: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 74 68 65  or non-zero othe
72f0: 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65 6e 74 69  rwise..** Identi
7300: 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  cal window objec
7310: 74 73 20 63 61 6e 20 62 65 20 70 72 6f 63 65 73  ts can be proces
7320: 73 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  sed in a single 
7330: 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  scan..*/.int sql
7340: 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72  ite3WindowCompar
7350: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7360: 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20 57 69 6e   Window *p1, Win
7370: 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69 66 28 20  dow *p2){.  if( 
7380: 70 31 2d 3e 65 54 79 70 65 21 3d 70 32 2d 3e 65  p1->eType!=p2->e
7390: 54 79 70 65 20 29 20 72 65 74 75 72 6e 20 31 3b  Type ) return 1;
73a0: 0a 20 20 69 66 28 20 70 31 2d 3e 65 53 74 61 72  .  if( p1->eStar
73b0: 74 21 3d 70 32 2d 3e 65 53 74 61 72 74 20 29 20  t!=p2->eStart ) 
73c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
73d0: 70 31 2d 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45  p1->eEnd!=p2->eE
73e0: 6e 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  nd ) return 1;. 
73f0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
7400: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
7410: 70 31 2d 3e 70 53 74 61 72 74 2c 20 70 32 2d 3e  p1->pStart, p2->
7420: 70 53 74 61 72 74 2c 20 2d 31 29 20 29 20 72 65  pStart, -1) ) re
7430: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7440: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
7450: 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 45 6e  (pParse, p1->pEn
7460: 64 2c 20 70 32 2d 3e 70 45 6e 64 2c 20 2d 31 29  d, p2->pEnd, -1)
7470: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7480: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
7490: 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 50  stCompare(p1->pP
74a0: 61 72 74 69 74 69 6f 6e 2c 20 70 32 2d 3e 70 50  artition, p2->pP
74b0: 61 72 74 69 74 69 6f 6e 2c 20 2d 31 29 20 29 20  artition, -1) ) 
74c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
74d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
74e0: 6f 6d 70 61 72 65 28 70 31 2d 3e 70 4f 72 64 65  ompare(p1->pOrde
74f0: 72 42 79 2c 20 70 32 2d 3e 70 4f 72 64 65 72 42  rBy, p2->pOrderB
7500: 79 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  y, -1) ) return 
7510: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
7520: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
7530: 20 63 61 6c 6c 65 64 20 62 79 20 63 6f 64 65 20   called by code 
7540: 69 6e 20 73 65 6c 65 63 74 2e 63 20 62 65 66 6f  in select.c befo
7550: 72 65 20 69 74 20 63 61 6c 6c 73 20 73 71 6c 69  re it calls sqli
7560: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
7570: 2a 2a 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72  ** to begin iter
7580: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
7590: 65 20 73 75 62 2d 71 75 65 72 79 20 72 65 73 75  e sub-query resu
75a0: 6c 74 73 2e 20 49 74 20 69 73 20 75 73 65 64 20  lts. It is used 
75b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61  to allocate.** a
75c0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  nd initialize re
75d0: 67 69 73 74 65 72 73 20 61 6e 64 20 63 75 72 73  gisters and curs
75e0: 6f 72 73 20 75 73 65 64 20 62 79 20 73 71 6c 69  ors used by sqli
75f0: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
7600: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
7610: 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e  ite3WindowCodeIn
7620: 69 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  it(Parse *pParse
7630: 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29  , Window *pMWin)
7640: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
7650: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
7660: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
7670: 72 73 65 29 3b 0a 20 20 69 6e 74 20 6e 50 61 72  rse);.  int nPar
7680: 74 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 50 61 72  t = (pMWin->pPar
7690: 74 69 74 69 6f 6e 20 3f 20 70 4d 57 69 6e 2d 3e  tition ? pMWin->
76a0: 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70  pPartition->nExp
76b0: 72 20 3a 20 30 29 3b 0a 20 20 6e 50 61 72 74 20  r : 0);.  nPart 
76c0: 2b 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  += (pMWin->pOrde
76d0: 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72  rBy ? pMWin->pOr
76e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
76f0: 29 3b 0a 20 20 69 66 28 20 6e 50 61 72 74 20 29  );.  if( nPart )
7700: 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  {.    pMWin->reg
7710: 50 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Part = pParse->n
7720: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
7730: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 61 72 74  e->nMem += nPart
7740: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7750: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
7760: 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65  ll, 0, pMWin->re
7770: 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  gPart, pMWin->re
7780: 67 50 61 72 74 2b 6e 50 61 72 74 2d 31 29 3b 0a  gPart+nPart-1);.
7790: 20 20 7d 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d    }..  for(pWin=
77a0: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
77b0: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
77c0: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
77d0: 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  p = pWin->pFunc;
77e0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66 75 6e  .    if( (p->fun
77f0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
7800: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20  FUNC_MINMAX) && 
7810: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
7820: 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
7830: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c 69 6e      /* The inlin
7840: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d 69  e versions of mi
7850: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 72 65  n() and max() re
7860: 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65 20 65  quire a single e
7870: 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20 20 2a  phemeral.      *
7880: 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20 72 65  * table and 3 re
7890: 67 69 73 74 65 72 73 2e 20 54 68 65 20 72 65 67  gisters. The reg
78a0: 69 73 74 65 72 73 20 61 72 65 20 75 73 65 64 20  isters are used 
78b0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
78c0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
78d0: 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74 20 74  regApp+0: slot t
78e0: 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d 61 78  o copy min()/max
78f0: 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66  () argument to f
7900: 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20  or MakeRecord.  
7910: 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b      **   regApp+
7920: 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  1: integer value
7930: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
7940: 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 0a  keys are unique.
7950: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70        **   regAp
7960: 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66 20 4d  p+2: output of M
7970: 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20  akeRecord.      
7980: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
7990: 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d  t *pList = pWin-
79a0: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
79b0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
79c0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
79d0: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
79e0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
79f0: 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
7a00: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
7a10: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
7a20: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
7a30: 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gApp = pParse->n
7a40: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61  Mem+1;.      pPa
7a50: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a  rse->nMem += 3;.
7a60: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
7a70: 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46 75 6e  fo && pWin->pFun
7a80: 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27  c->zName[1]=='i'
7a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
7aa0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
7ab0: 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 30 20 29  ortOrder[0]==0 )
7ac0: 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
7ad0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
7ae0: 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 1;.      }. 
7af0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7b00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
7b10: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 57 69 6e  nEphemeral, pWin
7b20: 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a 20 20  ->csrApp, 2);.  
7b30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b40: 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49  ppendP4(v, pKeyI
7b50: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
7b60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7b70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7b80: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
7b90: 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20  ->regApp+1);.   
7ba0: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
7bb0: 70 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76  p->xSFunc==nth_v
7bc0: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 7c 7c 20  alueStepFunc || 
7bd0: 70 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74  p->xSFunc==first
7be0: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 29  _valueStepFunc )
7bf0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  {.      /* Alloc
7c00: 61 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72  ate two register
7c10: 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70  s at pWin->regAp
7c20: 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65  p. These will be
7c30: 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a   used to.      *
7c40: 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74 61 72  * store the star
7c50: 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20  t and end index 
7c60: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  of the current f
7c70: 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rame.  */.      
7c80: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69  assert( pMWin->i
7c90: 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20  EphCsr );.      
7ca0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
7cb0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
7cc0: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
7cd0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
7ce0: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
7cf0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
7d00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7d10: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
7d20: 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  up, pWin->csrApp
7d30: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
7d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
7d50: 65 20 69 66 28 20 70 2d 3e 78 53 46 75 6e 63 3d  e if( p->xSFunc=
7d60: 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 20 7c 7c  =leadStepFunc ||
7d70: 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53   p->xSFunc==lagS
7d80: 74 65 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  tepFunc ){.     
7d90: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
7da0: 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20  iEphCsr );.     
7db0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20   pWin->csrApp = 
7dc0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
7dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7de0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7df0: 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72  enDup, pWin->csr
7e00: 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  App, pMWin->iEph
7e10: 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Csr);.    }.  }.
7e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43  }../*.** A "PREC
7e30: 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 62  EDING <expr>" (b
7e40: 45 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c 4c  End==0) or "FOLL
7e50: 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 62  OWING <expr>" (b
7e60: 45 6e 64 3d 3d 31 29 20 68 61 73 20 6a 75 73 74  End==1) has just
7e70: 20 0a 2a 2a 20 62 65 65 6e 20 65 76 61 6c 75 61   .** been evalua
7e80: 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 73 75  ted and the resu
7e90: 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  lt left in regis
7ea0: 74 65 72 20 72 65 67 2e 20 54 68 69 73 20 66 75  ter reg. This fu
7eb0: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73  nction generates
7ec0: 0a 2a 2a 20 56 4d 20 63 6f 64 65 20 74 6f 20 63  .** VM code to c
7ed0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
7ee0: 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  lue is a non-neg
7ef0: 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 61 6e  ative integer an
7f00: 64 20 74 68 72 6f 77 73 0a 2a 2a 20 61 6e 20 65  d throws.** an e
7f10: 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74 20 69  xception if it i
7f20: 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s not..*/.static
7f30: 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68 65 63   void windowChec
7f40: 6b 46 72 61 6d 65 4f 66 66 73 65 74 28 50 61 72  kFrameOffset(Par
7f50: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
7f60: 72 65 67 2c 20 69 6e 74 20 62 45 6e 64 29 7b 0a  reg, int bEnd){.
7f70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7f80: 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b  har *azErr[] = {
7f90: 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61 72  .    "frame star
7fa0: 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74  ting offset must
7fb0: 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   be a non-negati
7fc0: 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20  ve integer",.   
7fd0: 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f   "frame ending o
7fe0: 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20  ffset must be a 
7ff0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
8000: 65 67 65 72 22 0a 20 20 7d 3b 0a 20 20 56 64 62  eger".  };.  Vdb
8010: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
8020: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
8030: 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20 73   int regZero = s
8040: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
8050: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
8060: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8070: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8080: 72 65 67 5a 65 72 6f 29 3b 0a 20 20 73 71 6c 69  regZero);.  sqli
8090: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
80a0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
80b0: 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  eg, sqlite3VdbeC
80c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
80d0: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
80e0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
80f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47  beAddOp3(v, OP_G
8100: 65 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69  e, regZero, sqli
8110: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
8120: 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20  dr(v)+2, reg);. 
8130: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8140: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
8150: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
8160: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
8170: 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c  OE_Abort);.  sql
8180: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
8190: 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72  (v, (void*)azErr
81a0: 5b 62 45 6e 64 5d 2c 20 50 34 5f 53 54 41 54 49  [bEnd], P4_STATI
81b0: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  C);.  sqlite3Rel
81c0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
81d0: 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a  se, regZero);.}.
81e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
81f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  e number of argu
8200: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
8210: 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  the window-funct
8220: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ion associated.*
8230: 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65 63  * with the objec
8240: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
8250: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f  only argument to
8260: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8270: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
8280: 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69 6e  ndowArgCount(Win
8290: 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45 78  dow *pWin){.  Ex
82a0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
82b0: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
82c0: 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  pList;.  return 
82d0: 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e  (pList ? pList->
82e0: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f  nExpr : 0);.}../
82f0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d  *.** Generate VM
8300: 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20   code to invoke 
8310: 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20 28  either xStep() (
8320: 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 30  if bInverse is 0
8330: 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72 73  ) or .** xInvers
8340: 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20 69  e (if bInverse i
8350: 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72 20  s non-zero) for 
8360: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
8370: 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a 20  tion in the .** 
8380: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
8390: 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20 4f  ting at pMWin. O
83a0: 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20  r, for built-in 
83b0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
83c0: 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  .** that do not 
83d0: 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  use the standard
83e0: 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20 67   function API, g
83f0: 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71 75  enerate the requ
8400: 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56  ired.** inline V
8410: 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  M code..**.** If
8420: 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69 73   argument csr is
8430: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
8440: 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68 65   equal to 0, the
8450: 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20 69  n argument reg i
8460: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  s.** the first r
8470: 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72  egister in an ar
8480: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
8490: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
84a0: 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
84b0: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72  h to hold the ar
84c0: 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
84d0: 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74 69   for each functi
84e0: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
84f0: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
8500: 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
8510: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8520: 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74 6f   row of csr into
8530: 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f 66   the.** array of
8540: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
8550: 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41 67  e invoking OP_Ag
8560: 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67 49  gStep or OP_AggI
8570: 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c  nverse.**.** Or,
8580: 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73 20   if csr is less 
8590: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
85a0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65 67  the array of reg
85b0: 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69 73  isters at reg is
85c0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70 75  .** already popu
85d0: 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63  lated with all c
85e0: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
85f0: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
8600: 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
8610: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
8620: 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20 6e  regPartSize is n
8630: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
8640: 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 63   is a register c
8650: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  ontaining the.**
8660: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
8670: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
8680: 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  artition..*/.sta
8690: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41  tic void windowA
86a0: 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65 20  ggStep(.  Parse 
86b0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
86c0: 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20  ow *pMWin,      
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
86e0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77 69  inked list of wi
86f0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ndow functions *
8700: 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20 20  /.  int csr,    
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8720: 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67 75      /* Read argu
8730: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20  ments from this 
8740: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  cursor */.  int 
8750: 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20 20  bInverse,       
8760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8770: 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 49  rue to invoke xI
8780: 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20 6f  nverse instead o
8790: 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e 74  f xStep */.  int
87a0: 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20 20   reg,           
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87c0: 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  Array of registe
87d0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  rs */.  int regP
87e0: 61 72 74 53 69 7a 65 20 20 20 20 20 20 20 20 20  artSize         
87f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
8800: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  ter containing s
8810: 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  ize of partition
8820: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
8830: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
8840: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
8850: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72  dow *pWin;.  for
8860: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
8870: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
8880: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 6e 74  extWin){.    int
8890: 20 66 6c 61 67 73 20 3d 20 70 57 69 6e 2d 3e 70   flags = pWin->p
88a0: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 3b  Func->funcFlags;
88b0: 0a 20 20 20 20 69 6e 74 20 72 65 67 41 72 67 3b  .    int regArg;
88c0: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  .    int nArg = 
88d0: 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70  windowArgCount(p
88e0: 57 69 6e 29 3b 0a 0a 20 20 20 20 69 66 28 20 63  Win);..    if( c
88f0: 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  sr>=0 ){.      i
8900: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
8910: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
8920: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8930: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8940: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
8950: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c  pWin->iArgCol+i,
8960: 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d   reg+i);.      }
8970: 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d 20  .      regArg = 
8980: 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 66  reg;.      if( f
8990: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
89a0: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 20 29  NC_WINDOW_SIZE )
89b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41  {.        if( nA
89c0: 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rg==0 ){.       
89d0: 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67 50     regArg = regP
89e0: 61 72 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  artSize;.       
89f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8a00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8a10: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
8a20: 20 72 65 67 50 61 72 74 53 69 7a 65 2c 20 72 65   regPartSize, re
8a30: 67 2b 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 20  g+nArg);.       
8a40: 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 72 67 2b   }.        nArg+
8a50: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
8a60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
8a70: 72 74 28 20 21 28 66 6c 61 67 73 20 26 20 53 51  rt( !(flags & SQ
8a80: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
8a90: 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 20 20  _SIZE) );.      
8aa0: 72 65 67 41 72 67 20 3d 20 72 65 67 20 2b 20 70  regArg = reg + p
8ab0: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20 20  Win->iArgCol;.  
8ac0: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 57    }..    if( (pW
8ad0: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
8ae0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
8af0: 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
8b00: 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72    && pWin->eStar
8b10: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
8b20: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
8b30: 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73  t addrIsNull = s
8b40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
8b50: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
8b60: 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56 64  egArg);.      Vd
8b70: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8b80: 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73       if( bInvers
8b90: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
8ba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8bb0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
8bc0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20  pWin->regApp+1, 
8bd0: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
8be0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8bf0: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41 72   OP_SCopy, regAr
8c00: 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29  g, pWin->regApp)
8c10: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8c20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8c30: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 57  P_MakeRecord, pW
8c40: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20 70  in->regApp, 2, p
8c50: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a  Win->regApp+2);.
8c60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8c70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8c80: 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d  IdxInsert, pWin-
8c90: 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e 72  >csrApp, pWin->r
8ca0: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
8cb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
8cc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8cd0: 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45  Int(v, OP_SeekGE
8ce0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
8cf0: 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a 20  0, regArg, 1);. 
8d00: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
8d10: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
8d20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8d30: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
8d40: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
8d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8d60: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71  beJumpHere(v, sq
8d70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
8d80: 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20  Addr(v)-2);.    
8d90: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8da0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
8db0: 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20 20   addrIsNull);.  
8dc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e    }else if( pWin
8dd0: 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20  ->regApp ){.    
8de0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e    assert( pWin->
8df0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e  pFunc->xSFunc==n
8e00: 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  th_valueStepFunc
8e10: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
8e20: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46  pWin->pFunc->xSF
8e30: 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  unc==first_value
8e40: 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20 20 20  StepFunc .      
8e50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8e60: 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c 20   bInverse==0 || 
8e70: 62 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a 20  bInverse==1 );. 
8e80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
8ea0: 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Imm, pWin->regAp
8eb0: 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20 31 29  p+1-bInverse, 1)
8ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8ed0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46  pWin->pFunc->xSF
8ee0: 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e  unc==leadStepFun
8ef0: 63 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  c .           ||
8f00: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53   pWin->pFunc->xS
8f10: 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e  Func==lagStepFun
8f20: 63 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  c .    ){.      
8f30: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
8f40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
8f50: 20 61 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20   addrIf = 0;.   
8f60: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69     if( pWin->pFi
8f70: 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
8f80: 69 6e 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20  int regTmp;.    
8f90: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
8fa0: 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  ==pWin->pOwner->
8fb0: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  x.pList->nExpr )
8fc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 73  ;.        if( cs
8fd0: 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r>0 ){.         
8fe0: 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69 74 65   regTmp = sqlite
8ff0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
9000: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
9010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9020: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
9030: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
9040: 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a  l+nArg,regTmp);.
9050: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9060: 20 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20           regTmp 
9070: 3d 20 72 65 67 41 72 67 20 2b 20 6e 41 72 67 3b  = regArg + nArg;
9080: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9090: 20 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c 69     addrIf = sqli
90a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
90b0: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 54 6d   OP_IfNot, regTm
90c0: 70 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  p, 0, 1);.      
90d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
90e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
90f0: 73 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  sr>0 ){.        
9100: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
9110: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
9120: 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20  regTmp);.       
9130: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
9140: 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63   if( pWin->pFunc
9150: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
9160: 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
9170: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  LL ){.        Co
9180: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
9190: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
91a0: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
91b0: 65 71 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2d  eq(pParse, pWin-
91c0: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
91d0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
91e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
91f0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
9200: 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28  ollSeq, 0,0,0, (
9210: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 43 6f 6c  const char*)pCol
9220: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
9230: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9240: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9250: 76 2c 20 62 49 6e 76 65 72 73 65 3f 20 4f 50 5f  v, bInverse? OP_
9260: 41 67 67 49 6e 76 65 72 73 65 20 3a 20 4f 50 5f  AggInverse : OP_
9270: 41 67 67 53 74 65 70 2c 20 0a 20 20 20 20 20 20  AggStep, .      
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9290: 20 20 62 49 6e 76 65 72 73 65 2c 20 72 65 67 41    bInverse, regA
92a0: 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63  rg, pWin->regAcc
92b0: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
92c0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
92d0: 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
92e0: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
92f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9300: 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
9310: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  g);.      if( ad
9320: 64 72 49 66 20 29 20 73 71 6c 69 74 65 33 56 64  drIf ) sqlite3Vd
9330: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
9340: 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  drIf);.    }.  }
9350: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9360: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
9370: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56 61 6c  voke either xVal
9380: 75 65 28 29 20 28 62 46 69 6e 61 6c 3d 3d 30 29  ue() (bFinal==0)
9390: 20 6f 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a   or xFinalize().
93a0: 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d 31 29 20 66  ** (bFinal==1) f
93b0: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
93c0: 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 6c  unction in the l
93d0: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
93e0: 69 6e 67 20 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e  ing at.** pMWin.
93f0: 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69   Or, for built-i
9400: 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f  n window-functio
9410: 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75  ns that do not u
9420: 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 0a  se the standard.
9430: 2a 2a 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65  ** API, generate
9440: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
9450: 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  VM code..*/.stat
9460: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67  ic void windowAg
9470: 67 46 69 6e 61 6c 28 50 61 72 73 65 20 2a 70 50  gFinal(Parse *pP
9480: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d  arse, Window *pM
9490: 57 69 6e 2c 20 69 6e 74 20 62 46 69 6e 61 6c 29  Win, int bFinal)
94a0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
94b0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
94c0: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
94d0: 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70 57 69  pWin;..  for(pWi
94e0: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
94f0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
9500: 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 28 70 57  in){.    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 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
9540: 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74   && pWin->eStart
9550: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a  !=TK_UNBOUNDED .
9560: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
9570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9580: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
9590: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
95a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
95b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
95c0: 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  st, pWin->csrApp
95d0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
95e0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
95f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9600: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
9610: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30 2c  pWin->csrApp, 0,
9620: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
9630: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9640: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
9650: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9660: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
9670: 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20 29      if( bFinal )
9680: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9690: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
96a0: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
96b0: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
96c0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
96d0: 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  if( pWin->regApp
96e0: 20 29 7b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   ){.    }else{. 
96f0: 20 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20       if( bFinal 
9700: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9710: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9720: 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69  OP_AggFinal, pWi
9730: 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 77 69 6e  n->regAccum, win
9740: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
9750: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
9760: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
9770: 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20  v, pWin->pFunc, 
9780: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
9790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
97a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
97b0: 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  y, pWin->regAccu
97c0: 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  m, pWin->regResu
97d0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lt);.        sql
97e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
97f0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
9800: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20  in->regAccum);. 
9810: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9820: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9830: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56  ddOp3(v, OP_AggV
9840: 61 6c 75 65 2c 20 70 57 69 6e 2d 3e 72 65 67 41  alue, pWin->regA
9850: 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41 72 67 43  ccum, windowArgC
9860: 6f 75 6e 74 28 70 57 69 6e 29 2c 0a 20 20 20 20  ount(pWin),.    
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 72           pWin->r
9890: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
98a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
98b0: 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e  pendP4(v, pWin->
98c0: 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
98d0: 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  F);.      }.    
98e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
98f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e  his function gen
9900: 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20 74  erates VM code t
9910: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62  o invoke the sub
9920: 2d 72 6f 75 74 69 6e 65 20 61 74 20 61 64 64 72  -routine at addr
9930: 65 73 73 0a 2a 2a 20 6c 62 6c 46 6c 75 73 68 50  ess.** lblFlushP
9940: 61 72 74 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  art once for eac
9950: 68 20 70 61 72 74 69 74 69 6f 6e 20 77 69 74 68  h partition with
9960: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 74   the entire part
9970: 69 74 69 6f 6e 20 63 61 63 68 65 64 20 69 6e 0a  ition cached in.
9980: 2a 2a 20 74 68 65 20 57 69 6e 64 6f 77 2e 69 45  ** the Window.iE
9990: 70 68 43 73 72 20 74 65 6d 70 20 74 61 62 6c 65  phCsr temp table
99a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
99b0: 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e   windowPartition
99c0: 43 61 63 68 65 28 0a 20 20 50 61 72 73 65 20 2a  Cache(.  Parse *
99d0: 70 50 61 72 73 65 2c 0a 20 20 53 65 6c 65 63 74  pParse,.  Select
99e0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
99f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9a00: 20 72 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43   rewritten SELEC
9a10: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
9a20: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
9a30: 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
9a40: 20 2f 2a 20 57 68 65 72 65 49 6e 66 6f 20 74 6f   /* WhereInfo to
9a50: 20 63 61 6c 6c 20 57 68 65 72 65 45 6e 64 28 29   call WhereEnd()
9a60: 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67   on */.  int reg
9a70: 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20 20 20  FlushPart,      
9a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
9a90: 73 74 65 72 20 74 6f 20 75 73 65 20 77 69 74 68  ster to use with
9aa0: 20 47 6f 73 75 62 20 6c 62 6c 46 6c 75 73 68 50   Gosub lblFlushP
9ab0: 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c  art */.  int lbl
9ac0: 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20 20 20  FlushPart,      
9ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72           /* Subr
9ae0: 6f 75 74 69 6e 65 20 74 6f 20 47 6f 73 75 62 20  outine to Gosub 
9af0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  to */.  int *pRe
9b00: 67 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  gSize           
9b10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
9b20: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
9b30: 69 6e 67 20 70 61 72 74 69 74 69 6f 6e 20 73 69  ing partition si
9b40: 7a 65 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f  ze */.){.  Windo
9b50: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
9b60: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
9b70: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9b80: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 69 53  Parse);.  int iS
9b90: 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72 63 2d  ubCsr = p->pSrc-
9ba0: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
9bb0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e 70   int nSub = p->p
9bc0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e  Src->a[0].pTab->
9bd0: 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b 3b 0a 0a  nCol;.  int k;..
9be0: 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72    int reg = pPar
9bf0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e  se->nMem+1;.  in
9c00: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65  t regRecord = re
9c10: 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65  g+nSub;.  int re
9c20: 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f  gRowid = regReco
9c30: 72 64 2b 31 3b 0a 0a 20 20 2a 70 52 65 67 53 69  rd+1;..  *pRegSi
9c40: 7a 65 20 3d 20 72 65 67 52 6f 77 69 64 3b 0a 20  ze = regRowid;. 
9c50: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
9c60: 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20 20 2f 2a   nSub + 2;..  /*
9c70: 20 4d 61 72 74 69 61 6c 20 74 68 65 20 72 6f 77   Martial the row
9c80: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
9c90: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 74 6f   sub-select into
9ca0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 0a 20 20   an array of .  
9cb0: 2a 2a 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f  ** registers. */
9cc0: 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53  .  for(k=0; k<nS
9cd0: 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71  ub; k++){.    sq
9ce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9cf0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
9d00: 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29  ubCsr, k, reg+k)
9d10: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
9d20: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9d30: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c  MakeRecord, reg,
9d40: 20 6e 53 75 62 2c 20 72 65 67 52 65 63 6f 72 64   nSub, regRecord
9d50: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
9d60: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 74  f this is the st
9d70: 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70 61 72  art of a new par
9d80: 74 69 74 69 6f 6e 2e 20 49 66 20 73 6f 2c 20 63  tition. If so, c
9d90: 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 66 6c 75  all the.  ** flu
9da0: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62  sh_partition sub
9db0: 2d 72 6f 75 74 69 6e 65 2e 20 20 2a 2f 0a 20 20  -routine.  */.  
9dc0: 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  if( pMWin->pPart
9dd0: 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74  ition ){.    int
9de0: 20 61 64 64 72 3b 0a 20 20 20 20 45 78 70 72 4c   addr;.    ExprL
9df0: 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57  ist *pPart = pMW
9e00: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a  in->pPartition;.
9e10: 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20      int nPart = 
9e20: 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pPart->nExpr;.  
9e30: 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74    int regNewPart
9e40: 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e   = reg + pMWin->
9e50: 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20  nBufferCol;.    
9e60: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
9e70: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
9e80: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
9e90: 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c  Parse, pPart, 0,
9ea0: 20 30 29 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d   0);..    addr =
9eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9ec0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
9ed0: 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d  , regNewPart, pM
9ee0: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61  Win->regPart,nPa
9ef0: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
9f00: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
9f10: 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
9f20: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
9f30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f40: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
9f50: 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20  addr+2, addr+4, 
9f60: 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62  addr+2);.    Vdb
9f70: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
9f80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f90: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
9fa0: 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
9fb0: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72  n->regPart, nPar
9fc0: 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t-1);.    sqlite
9fd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9fe0: 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73  P_Gosub, regFlus
9ff0: 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50  hPart, lblFlushP
a000: 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  art);.  }..  /* 
a010: 42 75 66 66 65 72 20 74 68 65 20 63 75 72 72 65  Buffer the curre
a020: 6e 74 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70  nt row in the ep
a030: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a  hemeral table. *
a040: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
a050: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
a060: 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  owid, pMWin->iEp
a070: 68 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b  hCsr, regRowid);
a080: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
a090: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
a0a0: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
a0b0: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65  r, regRecord, re
a0c0: 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45  gRowid);..  /* E
a0d0: 6e 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  nd of the input 
a0e0: 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  loop */.  sqlite
a0f0: 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
a100: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  );..  /* Invoke 
a110: 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e  "flush_partition
a120: 22 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  " to deal with t
a130: 68 65 20 66 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c  he final (or onl
a140: 79 29 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  y) partition */.
a150: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a160: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
a170: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
a180: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 7d 0a  blFlushPart);.}.
a190: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
a1a0: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
a1b0: 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e 65 72   regGosub (gener
a1c0: 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  ated by code in 
a1d0: 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20  select.c) to.** 
a1e0: 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
a1f0: 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77  nt row of Window
a200: 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61 6c 6c  .iEphCsr. If all
a210: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
a220: 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65 67 61  s are.** aggrega
a230: 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  te window functi
a240: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ons that use the
a250: 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c 20 61   standard API, a
a260: 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f   single.** OP_Go
a270: 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  sub instruction 
a280: 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68 69 73  is all that this
a290: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
a2a0: 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63 6f 64  es. Extra VM cod
a2b0: 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77  e.** for per-row
a2c0: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6f   processing is o
a2d0: 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
a2e0: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
a2f0: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a  built-in window.
a300: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ** functions:.**
a310: 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75 65 28  .**   nth_value(
a320: 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76 61 6c  ).**   first_val
a330: 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a  ue().**   lag().
a340: 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73  **   lead().*/.s
a350: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
a360: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20  wReturnOneRow(. 
a370: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
a380: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c    Window *pMWin,
a390: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
a3a0: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
a3b0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
a3c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
a3d0: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
a3e0: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
a3f0: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
a400: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
a410: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
a420: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
a430: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20  >pFunc;.    if( 
a440: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e  pFunc->xSFunc==n
a450: 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  th_valueStepFunc
a460: 20 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d   .     || pFunc-
a470: 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76  >xSFunc==first_v
a480: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20  alueStepFunc .  
a490: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63    ){.      int c
a4a0: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
a4b0: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
a4c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
a4d0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
a4e0: 20 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73    int tmpReg = s
a4f0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a500: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
a510: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a520: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
a530: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
a540: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46  );..      if( pF
a550: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68  unc->xSFunc==nth
a560: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 29  _valueStepFunc )
a570: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a580: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
a590: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d  P_Column, pMWin-
a5a0: 3e 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e  >iEphCsr, pWin->
a5b0: 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67  iArgCol+1,tmpReg
a5c0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a5d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a5e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a5f0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52  Integer, 1, tmpR
a600: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
a610: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a620: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
a630: 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65  tmpReg, pWin->re
a640: 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20  gApp, tmpReg);. 
a650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a660: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c  AddOp3(v, OP_Gt,
a670: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
a680: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
a690: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
a6a0: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
a6b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a6c0: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63   OP_SeekRowid, c
a6d0: 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29  sr, lbl, tmpReg)
a6e0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
a6f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
a700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a710: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
a720: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
a730: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
a740: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
a750: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a760: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
a770: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
a780: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
a790: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  tmpReg);.    }. 
a7a0: 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75 6e     else if( pFun
a7b0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53  c->xSFunc==leadS
a7c0: 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63  tepFunc || pFunc
a7d0: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65  ->xSFunc==lagSte
a7e0: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  pFunc ){.      i
a7f0: 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e  nt nArg = pWin->
a800: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d  pOwner->x.pList-
a810: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  >nExpr;.      in
a820: 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e  t iEph = pMWin->
a830: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 69  iEphCsr;.      i
a840: 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63  nt csr = pWin->c
a850: 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74  srApp;.      int
a860: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
a870: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
a880: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67        int tmpReg
a890: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
a8a0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20  pReg(pParse);.. 
a8b0: 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33 20       if( nArg<3 
a8c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a8d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
a8e0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
a8f0: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
a900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a920: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
a930: 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69  n, iEph, pWin->i
a940: 41 72 67 43 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e  ArgCol+2, pWin->
a950: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
a960: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a970: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a980: 50 5f 52 6f 77 69 64 2c 20 69 45 70 68 2c 20 74  P_Rowid, iEph, t
a990: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 69 66  mpReg);.      if
a9a0: 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20  ( nArg<2 ){.    
a9b0: 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 28 70      int val = (p
a9c0: 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65  Func->xSFunc==le
a9d0: 61 64 53 74 65 70 46 75 6e 63 20 3f 20 31 20 3a  adStepFunc ? 1 :
a9e0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   -1);.        sq
a9f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
aa00: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d  v, OP_AddImm, tm
aa10: 70 52 65 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20  pReg, val);.    
aa20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aa30: 20 69 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63   int op = (pFunc
aa40: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74  ->xSFunc==leadSt
aa50: 65 70 46 75 6e 63 20 3f 20 4f 50 5f 41 64 64 20  epFunc ? OP_Add 
aa60: 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a  : OP_Subtract);.
aa70: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52          int tmpR
aa80: 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  eg2 = sqlite3Get
aa90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
aaa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
aab0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aac0: 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70  _Column, iEph, p
aad0: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20  Win->iArgCol+1, 
aae0: 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20  tmpReg2);.      
aaf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ab00: 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65  Op3(v, op, tmpRe
ab10: 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52  g2, tmpReg, tmpR
ab20: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eg);.        sql
ab30: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ab40: 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65  eg(pParse, tmpRe
ab50: 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  g2);.      }..  
ab60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
ab80: 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c  Rowid, csr, lbl,
ab90: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
aba0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
abb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
abc0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
abd0: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
abe0: 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d  ->iArgCol, pWin-
abf0: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
ac00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ac10: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
ac20: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
ac30: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
ac40: 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b  pParse, tmpReg);
ac50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
ac60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ac70: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47  , OP_Gosub, regG
ac80: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
ac90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
aca0: 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  e the code gener
acb0: 61 74 65 64 20 62 79 20 77 69 6e 64 6f 77 52 65  ated by windowRe
acc0: 74 75 72 6e 4f 6e 65 52 6f 77 28 29 20 61 6e 64  turnOneRow() and
acd0: 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  , optionally, th
ace0: 65 0a 2a 2a 20 78 49 6e 76 65 72 73 65 28 29 20  e.** xInverse() 
acf0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
ad00: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
ad10: 6e 2c 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f  n, for one or mo
ad20: 72 65 20 72 6f 77 73 0a 2a 2a 20 66 72 6f 6d 20  re rows.** from 
ad30: 74 68 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43  the Window.iEphC
ad40: 73 72 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 54  sr temp table. T
ad50: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
ad60: 72 61 74 65 73 20 56 4d 20 63 6f 64 65 0a 2a 2a  rates VM code.**
ad70: 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   similar to:.**.
ad80: 2a 2a 20 20 20 77 68 69 6c 65 28 20 72 65 67 43  **   while( regC
ad90: 74 72 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20 72  tr>0 ){.**     r
ada0: 65 67 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20 20 20  egCtr--;.**     
adb0: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
adc0: 6f 77 28 29 0a 2a 2a 20 20 20 20 20 69 66 28 20  ow().**     if( 
add0: 62 49 6e 76 65 72 73 65 20 29 7b 0a 2a 2a 20 20  bInverse ){.**  
ade0: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 0a       AggInverse.
adf0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
ae00: 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e 69 45 70  Next (Window.iEp
ae10: 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a  hCsr).**   }.*/.
ae20: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
ae30: 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a 20 20  owReturnRows(.  
ae40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
ae50: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77 69 6e 64   /* List of wind
ae80: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ow functions */.
ae90: 20 20 69 6e 74 20 72 65 67 43 74 72 2c 20 20 20    int regCtr,   
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
aec0: 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62 65 72 20  ntaining number 
aed0: 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
aee0: 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20   regGosub,      
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
af00: 52 65 67 69 73 74 65 72 20 66 6f 72 20 47 6f 73  Register for Gos
af10: 75 62 20 61 64 64 72 47 6f 73 75 62 20 2a 2f 0a  ub addrGosub */.
af20: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 2c    int addrGosub,
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
af50: 73 75 62 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20  sub-routine for 
af60: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20 2a 2f 0a  ReturnOneRow */.
af70: 20 20 69 6e 74 20 72 65 67 49 6e 76 41 72 67 2c    int regInvArg,
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af90: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
afa0: 67 69 73 74 65 72 73 20 66 6f 72 20 78 49 6e 76  gisters for xInv
afb0: 65 72 73 65 20 61 72 67 73 20 2a 2f 0a 20 20 69  erse args */.  i
afc0: 6e 74 20 72 65 67 49 6e 76 53 69 7a 65 20 20 20  nt regInvSize   
afd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
afe0: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  * Register conta
aff0: 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61  ining size of pa
b000: 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rtition */.){.  
b010: 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65  int addr;.  Vdbe
b020: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
b030: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
b040: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
b050: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29  Parse, pMWin, 0)
b060: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
b070: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b080: 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43 74 72  OP_IfPos, regCtr
b090: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
b0a0: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 20 2c 31  rentAddr(v)+2 ,1
b0b0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
b0c0: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
b0d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b0e0: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 77  Goto, 0, 0);.  w
b0f0: 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
b100: 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  w(pParse, pMWin,
b110: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
b120: 6f 73 75 62 29 3b 0a 20 20 69 66 28 20 72 65 67  osub);.  if( reg
b130: 49 6e 76 41 72 67 20 29 7b 0a 20 20 20 20 77 69  InvArg ){.    wi
b140: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
b150: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e  se, pMWin, pMWin
b160: 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c 20 72 65  ->iEphCsr, 1, re
b170: 67 49 6e 76 41 72 67 2c 20 72 65 67 49 6e 76 53  gInvArg, regInvS
b180: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ize);.  }.  sqli
b190: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b1a0: 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d   OP_Next, pMWin-
b1b0: 3e 69 45 70 68 43 73 72 2c 20 61 64 64 72 29 3b  >iEphCsr, addr);
b1c0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
b1d0: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
b1e0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
b1f0: 72 2b 31 29 3b 20 20 20 2f 2a 20 54 68 65 20 4f  r+1);   /* The O
b200: 50 5f 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  P_Goto */.}../*.
b210: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b220: 20 74 6f 20 73 65 74 20 74 68 65 20 61 63 63 75   to set the accu
b230: 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
b240: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
b250: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
b260: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
b270: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
b280: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
b290: 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66 6f   NULL. And perfo
b2a0: 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76 61  rm.** any equiva
b2b0: 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  lent initializat
b2c0: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
b2d0: 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  any built-in win
b2e0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  dow functions.**
b2f0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
b300: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64  .static int wind
b310: 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72 73  owInitAccum(Pars
b320: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
b330: 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64 62  w *pMWin){.  Vdb
b340: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
b350: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
b360: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
b370: 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 57  nt nArg = 0;.  W
b380: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
b390: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
b3a0: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
b3b0: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
b3c0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
b3d0: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
b3e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b3f0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
b400: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
b410: 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d 41  );.    nArg = MA
b420: 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41 72  X(nArg, windowAr
b430: 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20  gCount(pWin));. 
b440: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53     if( pFunc->xS
b450: 46 75 6e 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53  Func==nth_valueS
b460: 74 65 70 46 75 6e 63 0a 20 20 20 20 20 7c 7c 20  tepFunc.     || 
b470: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66  pFunc->xSFunc==f
b480: 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75  irst_valueStepFu
b490: 6e 63 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  nc .    ){.     
b4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b4b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
b4c0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
b4d0: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
b4e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b4f0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
b500: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
b510: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
b520: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
b530: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
b540: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63  NMAX) && pWin->c
b550: 73 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61  srApp ){.      a
b560: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74  ssert( pWin->eSt
b570: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
b580: 44 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  D );.      sqlit
b590: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b5a0: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
b5b0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
b5c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b5d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
b5e0: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
b5f0: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a  egApp+1);.    }.
b600: 20 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70    }.  regArg = p
b610: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
b620: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
b630: 20 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20   nArg;.  return 
b640: 72 65 67 41 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  regArg;.}.../*.*
b650: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b660: 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
b670: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
b680: 64 65 53 74 65 70 28 29 20 66 6f 72 20 61 6c 6c  deStep() for all
b690: 20 22 52 4f 57 53 22 0a 2a 2a 20 77 69 6e 64 6f   "ROWS".** windo
b6a0: 77 20 66 72 61 6d 65 20 74 79 70 65 73 20 65 78  w frame types ex
b6b0: 63 65 70 74 20 66 6f 72 20 22 42 45 54 57 45 45  cept for "BETWEE
b6c0: 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
b6d0: 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
b6e0: 54 0a 2a 2a 20 52 4f 57 22 2e 20 50 73 65 75 64  T.** ROW". Pseud
b6f0: 6f 2d 63 6f 64 65 20 66 6f 72 20 65 61 63 68 20  o-code for each 
b700: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
b710: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
b720: 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
b730: 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
b740: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
b750: 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
b760: 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
b770: 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
b780: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
b790: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
b7a0: 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65 63       Insert (rec
b7b0: 6f 72 64 20 69 6e 20 65 70 68 2d 74 61 62 6c 65  ord in eph-table
b7c0: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
b7d0: 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
b7e0: 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61    Gosub flush_pa
b7f0: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20  rtition.**  .** 
b800: 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f    flush_partitio
b810: 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b  n:.**     Once {
b820: 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75  .**       OpenDu
b830: 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73  p (iEphCsr -> cs
b840: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
b850: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
b860: 72 20 2d 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20  r -> csrEnd).** 
b870: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67      }.**     reg
b880: 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 20  Start = <expr1> 
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8a0: 2f 20 50 52 45 43 45 44 49 4e 47 20 65 78 70 72  / PRECEDING expr
b8b0: 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65  ession.**     re
b8c0: 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 20 20  gEnd = <expr2>  
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8e0: 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70  // FOLLOWING exp
b8f0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69  ression.**     i
b900: 66 28 20 72 65 67 53 74 61 72 74 3c 30 20 7c 7c  f( regStart<0 ||
b910: 20 72 65 67 45 6e 64 3c 30 20 29 7b 20 65 72 72   regEnd<0 ){ err
b920: 6f 72 21 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77  or! }.**     Rew
b930: 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72  ind (csr,csrStar
b940: 74 2c 63 73 72 45 6e 64 29 20 20 20 20 20 20 2f  t,csrEnd)      /
b950: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
b960: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
b970: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  ne.**       Next
b980: 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20  (csrEnd)        
b990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
b9a0: 66 20 45 4f 46 20 73 6b 69 70 20 41 67 67 73 74  f EOF skip Aggst
b9b0: 65 70 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73  ep.**       Aggs
b9c0: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
b9d0: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
b9e0: 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
b9f0: 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28        AggFinal (
ba00: 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20  xValue).**      
ba10: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
ba20: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  ub.**         Ne
ba30: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
ba40: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
ba50: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
ba60: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
ba70: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
ba80: 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
ba90: 20 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76            AggInv
baa0: 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29 0a  erse (csrStart).
bab0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65 78  **           Nex
bac0: 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20  t(csrStart).**  
bad0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
bae0: 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70    }.**   flush_p
baf0: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 0a 2a  artition_done:.*
bb00: 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65  *     ResetSorte
bb10: 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52  r (csr).**     R
bb20: 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  eturn.**.** ROWS
bb30: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
bb40: 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44  PRECEDING    AND
bb50: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20   CURRENT ROW.** 
bb60: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55 52  ROWS BETWEEN CUR
bb70: 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20 20 20  RENT ROW        
bb80: 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c   AND <expr> FOLL
bb90: 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45  OWING.** ROWS BE
bba0: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
bbb0: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
bbc0: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  xpr> FOLLOWING.*
bbd0: 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 61 72 65  *.**   These are
bbe0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
bbf0: 61 62 6f 76 65 2e 20 46 6f 72 20 22 43 55 52 52  above. For "CURR
bc00: 45 4e 54 20 52 4f 57 22 2c 20 69 6e 74 69 61 6c  ENT ROW", intial
bc10: 69 7a 65 20 74 68 65 0a 2a 2a 20 20 20 72 65 67  ize the.**   reg
bc20: 69 73 74 65 72 20 74 6f 20 30 2e 20 46 6f 72 20  ister to 0. For 
bc30: 22 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45  "UNBOUNDED PRECE
bc40: 44 49 4e 47 22 20 74 6f 20 69 6e 66 69 6e 69 74  DING" to infinit
bc50: 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  y..**.** ROWS BE
bc60: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
bc70: 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 55 4e  CEDING    AND UN
bc80: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
bc90: 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  G.** ROWS BETWEE
bca0: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20  N CURRENT ROW   
bcb0: 20 20 20 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e        AND UNBOUN
bcc0: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  DED FOLLOWING.**
bcd0: 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20 28  .**     Rewind (
bce0: 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72  csr,csrStart,csr
bcf0: 45 6e 64 29 20 20 20 20 2f 2f 20 69 66 20 45 4f  End)    // if EO
bd00: 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72  F goto flush_par
bd10: 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20  tition_done.**  
bd20: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
bd30: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
bd40: 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20  End)            
bd50: 20 20 20 20 20 20 2f 2f 20 45 78 69 74 20 77 68        // Exit wh
bd60: 69 6c 65 28 31 29 20 61 74 20 45 4f 46 0a 2a 2a  ile(1) at EOF.**
bd70: 20 20 20 20 20 20 20 41 67 67 73 74 65 70 20 28         Aggstep (
bd80: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d  csrEnd).**     }
bd90: 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31  .**     while( 1
bda0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
bdb0: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
bdc0: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
bdd0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
bde0: 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20   Next(csr)      
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be00: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
be10: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
be20: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ne.**       if( 
be30: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
be40: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
be50: 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61  gInverse (csrSta
be60: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e  rt).**         N
be70: 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
be80: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
be90: 7d 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 74 68  }.**.**   For th
bea0: 65 20 22 43 55 52 52 45 4e 54 20 52 4f 57 20 41  e "CURRENT ROW A
beb0: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
bec0: 4c 4f 57 49 4e 47 22 20 63 61 73 65 2c 20 74 68  LOWING" case, th
bed0: 65 20 66 69 6e 61 6c 20 69 66 28 29 20 0a 2a 2a  e final if() .**
bee0: 20 20 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20     condition is 
bef0: 61 6c 77 61 79 73 20 74 72 75 65 20 28 61 73 20  always true (as 
bf00: 69 66 20 72 65 67 53 74 61 72 74 20 77 65 72 65  if regStart were
bf10: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
bf20: 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20  0)..**.** RANGE 
bf30: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
bf40: 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
bf50: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 0a  D FOLLOWING.** .
bf60: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 74 68 65  **   This is the
bf70: 20 6f 6e 6c 79 20 52 41 4e 47 45 20 63 61 73 65   only RANGE case
bf80: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
bf90: 20 72 6f 75 74 69 6e 65 2e 20 49 74 20 6d 6f 64   routine. It mod
bfa0: 69 66 69 65 73 20 74 68 65 0a 2a 2a 20 20 20 73  ifies the.**   s
bfb0: 65 63 6f 6e 64 20 77 68 69 6c 65 28 20 31 20 29  econd while( 1 )
bfc0: 20 6c 6f 6f 70 20 69 6e 20 22 52 4f 57 53 20 42   loop in "ROWS B
bfd0: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 2e  ETWEEN CURRENT .
bfe0: 2e 2e 20 55 4e 42 4f 55 4e 44 45 44 2e 2e 2e 22  .. UNBOUNDED..."
bff0: 20 74 6f 0a 2a 2a 20 20 20 62 65 3a 0a 2a 2a 0a   to.**   be:.**.
c000: 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31 20  **     while( 1 
c010: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46  ){.**       AggF
c020: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
c030: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20         while( 1 
c040: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  ){.**         re
c050: 67 50 65 65 72 2b 2b 0a 2a 2a 20 20 20 20 20 20  gPeer++.**      
c060: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
c070: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  ub.**         Ne
c080: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
c090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
c0a0: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
c0b0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
c0c0: 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  **         if( n
c0d0: 65 77 20 70 65 65 72 20 29 20 62 72 65 61 6b 3b  ew peer ) break;
c0e0: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
c0f0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 72 65 67       while( (reg
c100: 50 65 65 72 2d 2d 29 3e 30 20 29 7b 0a 2a 2a 20  Peer--)>0 ){.** 
c110: 20 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72          AggInver
c120: 73 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  se (csrStart).**
c130: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
c140: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
c150: 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a   }.**     }.**.*
c160: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
c170: 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
c180: 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f     AND <expr> FO
c190: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
c1a0: 72 65 67 45 6e 64 20 3d 20 72 65 67 45 6e 64 20  regEnd = regEnd 
c1b0: 2d 20 72 65 67 53 74 61 72 74 0a 2a 2a 20 20 20  - regStart.**   
c1c0: 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53  Rewind (csr,csrS
c1d0: 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 2f  tart,csrEnd)   /
c1e0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
c1f0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c200: 6e 65 0a 2a 2a 20 20 20 20 20 41 67 67 73 74 65  ne.**     Aggste
c210: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
c220: 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20    Next(csrEnd)  
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c240: 2f 20 69 66 20 45 4f 46 20 66 61 6c 6c 2d 74 68  / if EOF fall-th
c250: 72 6f 75 67 68 0a 2a 2a 20 20 20 20 20 69 66 28  rough.**     if(
c260: 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
c270: 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  {.**       if( (
c280: 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29  regStart--)<=0 )
c290: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
c2a0: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
c2b0: 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
c2c0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
c2d0: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
c2f0: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
c300: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
c310: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
c320: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
c330: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
c340: 20 20 20 4e 65 78 74 20 28 63 73 72 53 74 61 72     Next (csrStar
c350: 74 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a  t).**     }.**.*
c360: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
c370: 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
c380: 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 50 52     AND <expr> PR
c390: 45 43 45 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  ECEDING.**.**   
c3a0: 52 65 70 6c 61 63 65 20 74 68 65 20 62 69 74 20  Replace the bit 
c3b0: 61 66 74 65 72 20 22 52 65 77 69 6e 64 22 20 69  after "Rewind" i
c3c0: 6e 20 74 68 65 20 61 62 6f 76 65 20 77 69 74 68  n the above with
c3d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 28 20  :.**.**     if( 
c3e0: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
c3f0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65  .**       AggSte
c400: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
c410: 20 20 20 20 4e 65 78 74 20 28 63 73 72 45 6e 64      Next (csrEnd
c420: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
c430: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
c440: 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62  ue).**     Gosub
c450: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
c460: 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20    Next(csr)     
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
c480: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
c490: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
c4a0: 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65 67  .**     if( (reg
c4b0: 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
c4c0: 2a 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72  *       AggInver
c4d0: 73 65 20 28 63 73 72 32 29 0a 2a 2a 20 20 20 20  se (csr2).**    
c4e0: 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a 2a     Next (csr2).*
c4f0: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74  *     }.**.*/.st
c500: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
c510: 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
c520: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c530: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
c540: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
c550: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
c560: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
c570: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
c580: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
c590: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
c5a0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
c5b0: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65  Parse);.  int re
c5c0: 67 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  gFlushPart;     
c5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
c5e0: 69 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62  ister for "Gosub
c5f0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
c600: 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  " */.  int lblFl
c610: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
c620: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
c630: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
c640: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
c650: 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e   int lblFlushDon
c660: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c670: 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22 47   /* Label for "G
c680: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
c690: 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20  tion_done" */.. 
c6a0: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
c6b0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 63  nt addr;.  int c
c6c0: 73 72 53 74 61 72 74 20 3d 20 70 50 61 72 73 65  srStart = pParse
c6d0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20  ->nTab++;.  int 
c6e0: 63 73 72 45 6e 64 20 3d 20 70 50 61 72 73 65 2d  csrEnd = pParse-
c6f0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 72  >nTab++;.  int r
c700: 65 67 53 74 61 72 74 3b 20 20 20 20 20 20 20 20  egStart;        
c710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
c720: 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 50  alue of <expr> P
c730: 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e  RECEDING */.  in
c740: 74 20 72 65 67 45 6e 64 3b 20 20 20 20 20 20 20  t regEnd;       
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c760: 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
c770: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20  > FOLLOWING */. 
c780: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 0a 20   int addrGoto;. 
c790: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a 20 20   int addrTop;.  
c7a0: 69 6e 74 20 61 64 64 72 49 66 50 6f 73 31 3b 0a  int addrIfPos1;.
c7b0: 20 20 69 6e 74 20 61 64 64 72 49 66 50 6f 73 32    int addrIfPos2
c7c0: 3b 0a 20 20 69 6e 74 20 72 65 67 53 69 7a 65 20  ;.  int regSize 
c7d0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
c7e0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
c7f0: 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20  K_PRECEDING .   
c800: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53      || pMWin->eS
c810: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
c820: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
c830: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
c840: 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20  LLOWING .       
c850: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
c860: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a  ==TK_UNBOUNDED .
c870: 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
c880: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46  MWin->eEnd==TK_F
c890: 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20  OLLOWING .      
c8a0: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
c8b0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
c8c0: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
c8d0: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
c8e0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
c8f0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
c900: 45 44 49 4e 47 20 0a 20 20 29 3b 0a 0a 20 20 2f  EDING .  );..  /
c910: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
c920: 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f  ter and label fo
c930: 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72  r the "flush_par
c940: 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74  tition" sub-rout
c950: 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75  ine. */.  regFlu
c960: 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73  shPart = ++pPars
c970: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c  e->nMem;.  lblFl
c980: 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65  ushPart = sqlite
c990: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
c9a0: 29 3b 0a 20 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  );.  lblFlushDon
c9b0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
c9c0: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
c9d0: 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70 50 61  regStart = ++pPa
c9e0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
c9f0: 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  End = ++pParse->
ca00: 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50  nMem;..  windowP
ca10: 61 72 74 69 74 69 6f 6e 43 61 63 68 65 28 70 50  artitionCache(pP
ca20: 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
ca30: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
ca40: 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 26 72 65  blFlushPart, &re
ca50: 67 53 69 7a 65 29 3b 0a 0a 20 20 61 64 64 72 47  gSize);..  addrG
ca60: 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
ca70: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
ca80: 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74  to);..  /* Start
ca90: 20 6f 66 20 22 66 6c 75 73 68 5f 70 61 72 74 69   of "flush_parti
caa0: 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c 69 74  tion" */.  sqlit
cab0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
cac0: 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 50 61  el(v, lblFlushPa
cad0: 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rt);.  sqlite3Vd
cae0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
caf0: 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56  nce, 0, sqlite3V
cb00: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
cb10: 29 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+3);.  VdbeCove
cb20: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
cb30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cb40: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 53  OP_OpenDup, csrS
cb50: 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  tart, pMWin->iEp
cb60: 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  hCsr);.  sqlite3
cb70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
cb80: 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e 64  _OpenDup, csrEnd
cb90: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
cba0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74 68  );..  /* If eith
cbb0: 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20 72  er regStart or r
cbc0: 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e 6f  egEnd are not no
cbd0: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
cbe0: 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a 2a  ers, throw .  **
cbf0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20   an exception.  
cc00: 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
cc10: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71  pStart ){.    sq
cc20: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
cc30: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74  arse, pMWin->pSt
cc40: 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  art, regStart);.
cc50: 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 46      windowCheckF
cc60: 72 61 6d 65 4f 66 66 73 65 74 28 70 50 61 72 73  rameOffset(pPars
cc70: 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  e, regStart, 0);
cc80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
cc90: 2d 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71  ->pEnd ){.    sq
cca0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ccb0: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e  arse, pMWin->pEn
ccc0: 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  d, regEnd);.    
ccd0: 77 69 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65  windowCheckFrame
cce0: 4f 66 66 73 65 74 28 70 50 61 72 73 65 2c 20 72  Offset(pParse, r
ccf0: 65 67 45 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a  egEnd, 1);.  }..
cd00: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
cd10: 22 52 4f 57 53 20 3c 65 78 70 72 31 3e 20 46 4f  "ROWS <expr1> FO
cd20: 4c 4c 4f 57 49 4e 47 20 41 4e 44 20 52 4f 57 53  LLOWING AND ROWS
cd30: 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49   <expr2> FOLLOWI
cd40: 4e 47 22 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20  NG", do:.  **.  
cd50: 2a 2a 20 20 20 69 66 28 20 72 65 67 45 6e 64 3c  **   if( regEnd<
cd60: 72 65 67 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a  regStart ){.  **
cd70: 20 20 20 20 20 2f 2f 20 54 68 65 20 66 72 61 6d       // The fram
cd80: 65 20 61 6c 77 61 79 73 20 63 6f 6e 73 69 73 74  e always consist
cd90: 73 20 6f 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a  s of 0 rows.  **
cda0: 20 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20       regStart = 
cdb0: 72 65 67 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20  regSize;.  **   
cdc0: 7d 0a 20 20 2a 2a 20 20 20 72 65 67 45 6e 64 20  }.  **   regEnd 
cdd0: 3d 20 72 65 67 45 6e 64 20 2d 20 72 65 67 53 74  = regEnd - regSt
cde0: 61 72 74 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  art;.  */.  if( 
cdf0: 70 4d 57 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70  pMWin->pEnd && p
ce00: 4d 57 69 6e 2d 3e 70 53 74 61 72 74 20 26 26 20  MWin->pStart && 
ce10: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
ce20: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
ce30: 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
ce40: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
ce50: 57 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69  WING );.    sqli
ce60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ce70: 20 4f 50 5f 47 65 2c 20 72 65 67 53 74 61 72 74   OP_Ge, regStart
ce80: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
ce90: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
cea0: 65 67 45 6e 64 29 3b 0a 20 20 20 20 56 64 62 65  egEnd);.    Vdbe
ceb0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
cec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ced0: 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
cee0: 65 67 53 69 7a 65 2c 20 72 65 67 53 74 61 72 74  egSize, regStart
cef0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cf00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
cf10: 75 62 74 72 61 63 74 2c 20 72 65 67 53 74 61 72  ubtract, regStar
cf20: 74 2c 20 72 65 67 45 6e 64 2c 20 72 65 67 45 6e  t, regEnd, regEn
cf30: 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  d);.  }..  if( p
cf40: 4d 57 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d  MWin->pEnd && pM
cf50: 57 69 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70  Win->pStart && p
cf60: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
cf70: 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
cf80: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
cf90: 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
cfa0: 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ING );.    sqlit
cfb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
cfc0: 4f 50 5f 4c 65 2c 20 72 65 67 53 74 61 72 74 2c  OP_Le, regStart,
cfd0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
cfe0: 65 6e 74 41 64 64 72 28 76 29 2b 33 2c 20 72 65  entAddr(v)+3, re
cff0: 67 45 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43  gEnd);.    VdbeC
d000: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
d010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d020: 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
d030: 67 53 69 7a 65 2c 20 72 65 67 53 74 61 72 74 29  gSize, regStart)
d040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d050: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
d060: 70 79 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67  py, regSize, reg
d070: 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  End);.  }..  /* 
d080: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
d090: 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
d0a0: 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ter for each win
d0b0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  dow function to 
d0c0: 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41 72 67  NULL */.  regArg
d0d0: 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63   = windowInitAcc
d0e0: 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  um(pParse, pMWin
d0f0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
d100: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
d110: 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  wind, pMWin->iEp
d120: 68 43 73 72 2c 20 6c 62 6c 46 6c 75 73 68 44 6f  hCsr, lblFlushDo
d130: 6e 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  ne);.  VdbeCover
d140: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
d150: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d160: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 53 74 61  P_Rewind, csrSta
d170: 72 74 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65  rt, lblFlushDone
d180: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
d190: 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a  eNeverTaken(v);.
d1a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
d1b0: 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 73  ngeP5(v, 1);.  s
d1c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d1d0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
d1e0: 73 72 45 6e 64 2c 20 6c 62 6c 46 6c 75 73 68 44  srEnd, lblFlushD
d1f0: 6f 6e 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  one);.  VdbeCove
d200: 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
d210: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d220: 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
d230: 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 41 67 67  .  /* Invoke Agg
d240: 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f  Step function fo
d250: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
d260: 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  nction using the
d270: 20 72 6f 77 20 74 68 61 74 0a 20 20 2a 2a 20 63   row that.  ** c
d280: 73 72 45 6e 64 20 63 75 72 72 65 6e 74 6c 79 20  srEnd currently 
d290: 70 6f 69 6e 74 73 20 74 6f 2e 20 4f 72 2c 20 69  points to. Or, i
d2a0: 66 20 63 73 72 45 6e 64 20 69 73 20 61 6c 72 65  f csrEnd is alre
d2b0: 61 64 79 20 61 74 20 45 4f 46 2c 0a 20 20 2a 2a  ady at EOF,.  **
d2c0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 2a 2f   do nothing.  */
d2d0: 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
d2e0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d2f0: 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 70 4d  ddr(v);.  if( pM
d300: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
d310: 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61  ECEDING ){.    a
d320: 64 64 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69  ddrIfPos1 = sqli
d330: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d340: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e   OP_IfPos, regEn
d350: 64 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56  d, 0 , 1);.    V
d360: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d370: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
d380: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
d390: 78 74 2c 20 63 73 72 45 6e 64 2c 20 73 71 6c 69  xt, csrEnd, sqli
d3a0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
d3b0: 64 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65  dr(v)+2);.  Vdbe
d3c0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61  Coverage(v);.  a
d3d0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
d3e0: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
d3f0: 74 6f 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67  to);.  windowAgg
d400: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
d410: 69 6e 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72  in, csrEnd, 0, r
d420: 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b  egArg, regSize);
d430: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
d440: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
d450: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
d460: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d470: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70  Goto, 0, addrTop
d480: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d490: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d4a0: 64 72 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70  dr);.    addrTop
d4b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
d4c0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
d4d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
d4e0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d4f0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28  , addr);.    if(
d500: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
d510: 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20  _PRECEDING ){.  
d520: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d530: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
d540: 66 50 6f 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20  fPos1);.    }.  
d550: 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  }..  if( pMWin->
d560: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
d570: 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66  NG ){.    addrIf
d580: 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64  Pos1 = sqlite3Vd
d590: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
d5a0: 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20  fPos, regEnd, 0 
d5b0: 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
d5c0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
d5d0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
d5e0: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
d5f0: 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f   ){.    addrIfPo
d600: 73 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  s2 = sqlite3Vdbe
d610: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
d620: 6f 73 2c 20 72 65 67 53 74 61 72 74 2c 20 30 20  os, regStart, 0 
d630: 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
d640: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
d650: 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
d660: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30  pParse, pMWin, 0
d670: 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72  );.  windowRetur
d680: 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20  nOneRow(pParse, 
d690: 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c  pMWin, regGosub,
d6a0: 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73   addrGosub);.  s
d6b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d6c0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57  (v, OP_Next, pMW
d6d0: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c  in->iEphCsr, sql
d6e0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d6f0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62  ddr(v)+2);.  Vdb
d700: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d720: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
d730: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a   lblFlushDone);.
d740: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
d750: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
d760: 47 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  G ){.    sqlite3
d770: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d780: 61 64 64 72 49 66 50 6f 73 32 29 3b 0a 20 20 7d  addrIfPos2);.  }
d790: 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
d7a0: 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
d7b0: 54 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e  T .   || pMWin->
d7c0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
d7d0: 44 49 4e 47 20 0a 20 20 20 7c 7c 20 70 4d 57 69  DING .   || pMWi
d7e0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
d7f0: 4c 4c 4f 57 49 4e 47 20 0a 20 20 29 7b 0a 20 20  LLOWING .  ){.  
d800: 20 20 69 6e 74 20 6c 62 6c 53 6b 69 70 49 6e 76    int lblSkipInv
d810: 65 72 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64  erse = sqlite3Vd
d820: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 3b  beMakeLabel(v);;
d830: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
d840: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
d850: 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71  DING ){.      sq
d860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d870: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
d880: 53 74 61 72 74 2c 20 6c 62 6c 53 6b 69 70 49 6e  Start, lblSkipIn
d890: 76 65 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  verse, 1);.     
d8a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d8b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d8c0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
d8d0: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
d8e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d8f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
d900: 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c  t, csrStart, sql
d910: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d920: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
d930: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d950: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d960: 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 53 6b 69 70  Goto, 0, lblSkip
d970: 49 6e 76 65 72 73 65 29 3b 0a 20 20 20 20 7d 65  Inverse);.    }e
d980: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
d990: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d9a0: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74 61 72  OP_Next, csrStar
d9b0: 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
d9c0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 29 3b  rrentAddr(v)+1);
d9d0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
d9e0: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
d9f0: 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
da00: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
da10: 73 72 53 74 61 72 74 2c 20 31 2c 20 72 65 67 41  srStart, 1, regA
da20: 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20  rg, regSize);.  
da30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
da40: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
da50: 53 6b 69 70 49 6e 76 65 72 73 65 29 3b 0a 20 20  SkipInverse);.  
da60: 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  }.  if( pMWin->e
da70: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
da80: 47 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  G ){.    sqlite3
da90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
daa0: 61 64 64 72 49 66 50 6f 73 31 29 3b 0a 20 20 7d  addrIfPos1);.  }
dab0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
dac0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
dad0: 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 0a 20   0, addrTop);.. 
dae0: 20 2f 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74   /* flush_partit
daf0: 69 6f 6e 5f 64 6f 6e 65 3a 20 2a 2f 0a 20 20 73  ion_done: */.  s
db00: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
db10: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75  eLabel(v, lblFlu
db20: 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74  shDone);.  sqlit
db30: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
db40: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
db50: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
db60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
db70: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
db80: 6e 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 29  n, regFlushPart)
db90: 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
dba0: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 6f 76 65  here to skip ove
dbb0: 72 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  r flush_partitio
dbc0: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  n */.  sqlite3Vd
dbd0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
dbe0: 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  drGoto);.}../*.*
dbf0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
dc00: 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
dc10: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
dc20: 64 65 53 74 65 70 28 29 20 66 6f 72 20 63 61 73  deStep() for cas
dc30: 65 73 20 74 68 61 74 0a 2a 2a 20 77 6f 75 6c 64  es that.** would
dc40: 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 68 61 6e   normally be han
dc50: 64 6c 65 64 20 62 79 20 77 69 6e 64 6f 77 43 6f  dled by windowCo
dc60: 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 20  deDefaultStep() 
dc70: 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 0a 2a  when there are.*
dc80: 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 75  * one or more bu
dc90: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75  ilt-in window-fu
dca0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 71  nctions that req
dcb0: 75 69 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  uire the entire 
dcc0: 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20 74 6f 20  partition.** to 
dcd0: 62 65 20 63 61 63 68 65 64 20 69 6e 20 61 20 74  be cached in a t
dce0: 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65  emp table before
dcf0: 20 61 6e 79 20 72 6f 77 73 20 63 61 6e 20 62 65   any rows can be
dd00: 20 72 65 74 75 72 6e 65 64 2e 20 41 64 64 69 74   returned. Addit
dd10: 69 6f 6e 61 6c 6c 79 2e 0a 2a 2a 20 22 52 41 4e  ionally..** "RAN
dd20: 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  GE BETWEEN CURRE
dd30: 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
dd40: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20  NDED FOLLOWING" 
dd50: 69 73 20 61 6c 77 61 79 73 20 68 61 6e 64 6c 65  is always handle
dd60: 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e  d by.** this fun
dd70: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 73 65  ction..**.** Pse
dd80: 75 64 6f 2d 63 6f 64 65 20 63 6f 72 72 65 73 70  udo-code corresp
dd90: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 56 4d  onding to the VM
dda0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
ddb0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
ddc0: 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 74 79 70  .** for each typ
ddd0: 65 20 6f 66 20 77 69 6e 64 6f 77 20 66 6f 6c 6c  e of window foll
dde0: 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45  ows..**.** RANGE
ddf0: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
de00: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
de10: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a   CURRENT ROW.**.
de20: 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69  **   flush_parti
de30: 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63  tion:.**     Onc
de40: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65  e {.**       Ope
de50: 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e  nDup (iEphCsr ->
de60: 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20   csrLead).**    
de70: 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65   }.**     Intege
de80: 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66  r ctr 0.**     f
de90: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
dea0: 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ead){.**       i
deb0: 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
dec0: 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e  *         AggFin
ded0: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
dee0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
def0: 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
df00: 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
df10: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
df20: 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68         Next iEph
df30: 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  Csr.**         }
df40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 6e 74 65  .**         Inte
df50: 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20  ger ctr 0.**    
df60: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 41 67     }.**       Ag
df70: 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a  gStep (csrLead).
df80: 2a 2a 20 20 20 20 20 20 20 49 6e 63 72 20 63 74  **       Incr ct
df90: 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  r.**     }.**.**
dfa0: 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
dfb0: 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20  Finalize).**    
dfc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
dfd0: 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
dfe0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
dff0: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 69 45  **       Next iE
e000: 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  phCsr.**     }.*
e010: 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f  *.**     ResetSo
e020: 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20  rter (csr).**   
e030: 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52    Return.**.** R
e040: 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
e050: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
e060: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  AND CURRENT ROW.
e070: 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  **.**   As above
e080: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  , except that th
e090: 65 20 22 69 66 28 20 6e 65 77 20 70 65 65 72 20  e "if( new peer 
e0a0: 29 22 20 62 72 61 6e 63 68 20 69 73 20 61 6c 77  )" branch is alw
e0b0: 61 79 73 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  ays taken..**.**
e0c0: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
e0d0: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43  URRENT ROW AND C
e0e0: 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2a 0a 2a  URRENT ROW .**.*
e0f0: 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78  *   As above, ex
e100: 63 65 70 74 20 74 68 61 74 20 65 61 63 68 20 6f  cept that each o
e110: 66 20 74 68 65 20 66 6f 72 28 29 20 6c 6f 6f 70  f the for() loop
e120: 73 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a  s becomes:.**.**
e130: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
e140: 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a  ; i<ctr; i++){.*
e150: 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  *           Gosu
e160: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
e170: 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76 65           AggInve
e180: 72 73 65 20 28 69 45 70 68 43 73 72 29 0a 2a 2a  rse (iEphCsr).**
e190: 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20             Next 
e1a0: 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20  iEphCsr.**      
e1b0: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45     }.**.** RANGE
e1c0: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
e1d0: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
e1e0: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
e1f0: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75  WING.**.**   flu
e200: 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a  sh_partition:.**
e210: 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20       Once {.**  
e220: 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45       OpenDup (iE
e230: 70 68 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64  phCsr -> csrLead
e240: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
e250: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63    foreach row (c
e260: 73 72 4c 65 61 64 29 20 7b 0a 2a 2a 20 20 20 20  srLead) {.**    
e270: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c     AggStep (csrL
e280: 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  ead).**     }.**
e290: 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
e2a0: 20 28 69 45 70 68 43 73 72 29 20 7b 0a 2a 2a 20   (iEphCsr) {.** 
e2b0: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
e2c0: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 7d 0a 2a  Gosub.**     }.*
e2d0: 2a 20 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  * .** RANGE BETW
e2e0: 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
e2f0: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
e300: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
e310: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a  flush_partition:
e320: 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a  .**     Once {.*
e330: 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20  *       OpenDup 
e340: 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 4c  (iEphCsr -> csrL
e350: 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  ead).**     }.**
e360: 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
e370: 20 28 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20   (csrLead){.**  
e380: 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73       AggStep (cs
e390: 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a  rLead).**     }.
e3a0: 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20 28 63  **     Rewind (c
e3b0: 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 49  srLead).**     I
e3c0: 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20  nteger ctr 0.** 
e3d0: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20      foreach row 
e3e0: 28 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20  (csrLead){.**   
e3f0: 20 20 20 20 69 66 28 20 6e 65 77 20 70 65 65 72      if( new peer
e400: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
e410: 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29  ggFinal (xValue)
e420: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28  .**         for(
e430: 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29  i=0; i<ctr; i++)
e440: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47  {.**           G
e450: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
e460: 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67 49  *           AggI
e470: 6e 76 65 72 73 65 20 28 69 45 70 68 43 73 72 29  nverse (iEphCsr)
e480: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65  .**           Ne
e490: 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20  xt iEphCsr.**   
e4a0: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
e4b0: 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20 30     Integer ctr 0
e4c0: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
e4d0: 20 20 20 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a       Incr ctr.**
e4e0: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20       }.**.**    
e4f0: 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
e500: 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72  lize).**     for
e510: 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b  (i=0; i<ctr; i++
e520: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  ){.**       Gosu
e530: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
e540: 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73       Next iEphCs
e550: 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  r.**     }.**.**
e560: 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72       ResetSorter
e570: 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65   (csr).**     Re
e580: 74 75 72 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  turn.*/.static v
e590: 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 43 61  oid windowCodeCa
e5a0: 63 68 65 53 74 65 70 28 0a 20 20 50 61 72 73 65  cheStep(.  Parse
e5b0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c   *pParse, .  Sel
e5c0: 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49  ect *p,.  WhereI
e5d0: 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69  nfo *pWInfo,.  i
e5e0: 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20  nt regGosub, .  
e5f0: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b  int addrGosub.){
e600: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
e610: 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64   = p->pWin;.  Vd
e620: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
e630: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e640: 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20 61    int k;.  int a
e650: 64 64 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ddr;.  ExprList 
e660: 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e  *pPart = pMWin->
e670: 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78  pPartition;.  Ex
e680: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
e690: 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   = pMWin->pOrder
e6a0: 42 79 3b 0a 20 20 69 6e 74 20 6e 50 65 65 72 20  By;.  int nPeer 
e6b0: 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72  = pOrderBy ? pOr
e6c0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
e6d0: 3b 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65  ;.  int regNewPe
e6e0: 65 72 3b 0a 0a 20 20 69 6e 74 20 61 64 64 72 47  er;..  int addrG
e6f0: 6f 74 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  oto;            
e700: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
e710: 73 20 6f 66 20 47 6f 74 6f 20 75 73 65 64 20 74  s of Goto used t
e720: 6f 20 6a 75 6d 70 20 66 6c 75 73 68 5f 70 61 72  o jump flush_par
e730: 2e 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  .. */.  int addr
e740: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
e750: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
e760: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 69 74  here for next it
e770: 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20  eration of loop 
e780: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73  */.  int regFlus
e790: 68 50 61 72 74 3b 0a 20 20 69 6e 74 20 6c 62 6c  hPart;.  int lbl
e7a0: 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69 6e 74  FlushPart;.  int
e7b0: 20 63 73 72 4c 65 61 64 3b 0a 20 20 69 6e 74 20   csrLead;.  int 
e7c0: 72 65 67 43 74 72 3b 0a 20 20 69 6e 74 20 72 65  regCtr;.  int re
e7d0: 67 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  gArg;           
e7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
e7f0: 69 73 74 65 72 20 61 72 72 61 79 20 74 6f 20 6d  ister array to m
e800: 61 72 74 69 61 6c 20 66 75 6e 63 74 69 6f 6e 20  artial function 
e810: 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  args */.  int re
e820: 67 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 62 6c  gSize;.  int lbl
e830: 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20 62 52 65  Empty;.  int bRe
e840: 76 65 72 73 65 20 3d 20 70 4d 57 69 6e 2d 3e 70  verse = pMWin->p
e850: 4f 72 64 65 72 42 79 20 26 26 20 70 4d 57 69 6e  OrderBy && pMWin
e860: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
e870: 52 45 4e 54 20 0a 20 20 20 20 20 20 20 20 20 20  RENT .          
e880: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
e890: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 0a 20  TK_UNBOUNDED;.. 
e8a0: 20 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d   assert( (pMWin-
e8b0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
e8c0: 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e  UNDED && pMWin->
e8d0: 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
e8e0: 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  ) .       || (pM
e8f0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
e900: 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57  UNBOUNDED && pMW
e910: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
e920: 4f 55 4e 44 45 44 29 20 0a 20 20 20 20 20 20 20  OUNDED) .       
e930: 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  || (pMWin->eStar
e940: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26  t==TK_CURRENT &&
e950: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
e960: 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 20 20 20  _CURRENT) .     
e970: 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
e980: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
e990: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
e9a0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20  TK_UNBOUNDED) . 
e9b0: 20 29 3b 0a 0a 20 20 6c 62 6c 45 6d 70 74 79 20   );..  lblEmpty 
e9c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
e9d0: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 72 65 67  eLabel(v);.  reg
e9e0: 4e 65 77 50 65 65 72 20 3d 20 70 50 61 72 73 65  NewPeer = pParse
e9f0: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72  ->nMem+1;.  pPar
ea00: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65  se->nMem += nPee
ea10: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
ea20: 65 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c  e register and l
ea30: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c  abel for the "fl
ea40: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73  ush_partition" s
ea50: 75 62 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20  ub-routine. */. 
ea60: 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20   regFlushPart = 
ea70: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
ea80: 20 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d    lblFlushPart =
ea90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
eaa0: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 63 73 72  Label(v);..  csr
eab0: 4c 65 61 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Lead = pParse->n
eac0: 54 61 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20  Tab++;.  regCtr 
ead0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
eae0: 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69  ;..  windowParti
eaf0: 74 69 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65  tionCache(pParse
eb00: 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
eb10: 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c  FlushPart, lblFl
eb20: 75 73 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a  ushPart, &regSiz
eb30: 65 29 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d  e);.  addrGoto =
eb40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eb50: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
eb60: 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22  .  /* Start of "
eb70: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22  flush_partition"
eb80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
eb90: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
eba0: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a   lblFlushPart);.
ebb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ebc0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op2(v, OP_Once, 
ebd0: 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
ebe0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
ebf0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
ec00: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
ec10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ec20: 65 6e 44 75 70 2c 20 63 73 72 4c 65 61 64 2c 20  enDup, csrLead, 
ec30: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
ec40: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
ec50: 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
ec60: 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65  r register for e
ec70: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
ec80: 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20  ion to NULL */. 
ec90: 20 72 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77   regArg = window
eca0: 49 6e 69 74 41 63 63 75 6d 28 70 50 61 72 73 65  InitAccum(pParse
ecb0: 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c  , pMWin);..  sql
ecc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ecd0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
ece0: 20 72 65 67 43 74 72 29 3b 0a 20 20 73 71 6c 69   regCtr);.  sqli
ecf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ed00: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c   OP_Rewind, csrL
ed10: 65 61 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a  ead, lblEmpty);.
ed20: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
ed30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ed40: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
ed50: 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ind, pMWin->iEph
ed60: 43 73 72 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a  Csr, lblEmpty);.
ed70: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
ed80: 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 0a 20 20  verTaken(v);..  
ed90: 69 66 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a  if( bReverse ){.
eda0: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
edb0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
edc0: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 77 69  tAddr(v);.    wi
edd0: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
ede0: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65  se, pMWin, csrLe
edf0: 61 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72  ad, 0, regArg, r
ee00: 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c  egSize);.    sql
ee10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ee20: 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65  , OP_Next, csrLe
ee30: 61 64 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 56  ad, addr);.    V
ee40: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ee50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ee60: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
ee70: 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20 6c 62 6c  nd, csrLead, lbl
ee80: 45 6d 70 74 79 29 3b 0a 20 20 20 20 56 64 62 65  Empty);.    Vdbe
ee90: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
eea0: 65 6e 28 76 29 3b 0a 20 20 7d 0a 20 20 61 64 64  en(v);.  }.  add
eeb0: 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
eec0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
eed0: 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  );..  if( pOrder
eee0: 42 79 20 26 26 20 28 70 4d 57 69 6e 2d 3e 65 45  By && (pMWin->eE
eef0: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c  nd==TK_CURRENT |
ef00: 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
ef10: 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 29 7b 0a  =TK_CURRENT) ){.
ef20: 20 20 20 20 69 6e 74 20 62 43 75 72 72 65 6e 74      int bCurrent
ef30: 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72   = (pMWin->eStar
ef40: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a  t==TK_CURRENT);.
ef50: 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70      int addrJump
ef60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ef70: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ef80: 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 2a 2f  OP_Jump below */
ef90: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
efa0: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
efb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  ){.      int iOf
efc0: 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  f = pMWin->nBuff
efd0: 65 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f  erCol + (pPart ?
efe0: 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20   pPart->nExpr : 
eff0: 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  0);.      int re
f000: 67 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72  gPeer = pMWin->r
f010: 65 67 50 61 72 74 20 2b 20 28 70 50 61 72 74 20  egPart + (pPart 
f020: 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a  ? pPart->nExpr :
f030: 20 30 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e   0);.      KeyIn
f040: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
f050: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
f060: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
f070: 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30  , pOrderBy, 0, 0
f080: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  );.      for(k=0
f090: 3b 20 6b 3c 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b  ; k<nPeer; k++){
f0a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f0b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
f0c0: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 4c 65 61 64  _Column, csrLead
f0d0: 2c 20 69 4f 66 66 2b 6b 2c 20 72 65 67 4e 65 77  , iOff+k, regNew
f0e0: 50 65 65 72 2b 6b 29 3b 0a 20 20 20 20 20 20 7d  Peer+k);.      }
f0f0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
f100: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f110: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
f120: 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65  egNewPeer, regPe
f130: 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
f140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
f150: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
f160: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
f170: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64  INFO);.      add
f180: 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  rJump = sqlite3V
f190: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f1a0: 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c  Jump, addr+2, 0,
f1b0: 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
f1c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f1d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f1e0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
f1f0: 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  opy, regNewPeer,
f200: 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 2d   regPeer, nPeer-
f210: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77  1);.    }..    w
f220: 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28  indowReturnRows(
f230: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72  pParse, pMWin, r
f240: 65 67 43 74 72 2c 20 72 65 67 47 6f 73 75 62 2c  egCtr, regGosub,
f250: 20 61 64 64 72 47 6f 73 75 62 2c 20 0a 20 20 20   addrGosub, .   
f260: 20 20 20 20 20 28 62 43 75 72 72 65 6e 74 20 3f       (bCurrent ?
f270: 20 72 65 67 41 72 67 20 3a 20 30 29 2c 20 28 62   regArg : 0), (b
f280: 43 75 72 72 65 6e 74 20 3f 20 72 65 67 53 69 7a  Current ? regSiz
f290: 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20  e : 0).    );.  
f2a0: 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29    if( addrJump )
f2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
f2c0: 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70  Here(v, addrJump
f2d0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 52  );.  }..  if( bR
f2e0: 65 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  everse==0 ){.   
f2f0: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
f300: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
f310: 72 4c 65 61 64 2c 20 30 2c 20 72 65 67 41 72 67  rLead, 0, regArg
f320: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 7d 0a  , regSize);.  }.
f330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f340: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
f350: 2c 20 72 65 67 43 74 72 2c 20 31 29 3b 0a 20 20  , regCtr, 1);.  
f360: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f370: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
f380: 72 4c 65 61 64 2c 20 61 64 64 72 4e 65 78 74 29  rLead, addrNext)
f390: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
f3a0: 28 76 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65  (v);..  windowRe
f3b0: 74 75 72 6e 52 6f 77 73 28 70 50 61 72 73 65 2c  turnRows(pParse,
f3c0: 20 70 4d 57 69 6e 2c 20 72 65 67 43 74 72 2c 20   pMWin, regCtr, 
f3d0: 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
f3e0: 73 75 62 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73  sub, 0, 0);..  s
f3f0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
f400: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70  eLabel(v, lblEmp
f410: 74 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ty);.  sqlite3Vd
f420: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
f430: 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69  esetSorter, pMWi
f440: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73  n->iEphCsr);.  s
f450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
f460: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
f470: 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20  egFlushPart);.. 
f480: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
f490: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c   to skip over fl
f4a0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f  ush_partition */
f4b0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
f4c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
f4d0: 74 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  to);.}.../*.** R
f4e0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
f4f0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
f500: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
f510: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20  .**.**   ....** 
f520: 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
f530: 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
f540: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e    AggFinal (xFin
f550: 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20  alize).**       
f560: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
f570: 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74 53 6f  **       ResetSo
f580: 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a  rter eph-table.*
f590: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65  *     }.**     e
f5a0: 6c 73 65 20 69 66 28 20 6e 65 77 20 70 65 65 72  lse if( new peer
f5b0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
f5c0: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
f5d0: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
f5e0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
f5f0: 20 52 65 73 65 74 53 6f 72 74 65 72 20 65 70 68   ResetSorter eph
f600: 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a  -table.**     }.
f610: 2a 2a 20 20 20 20 20 41 67 67 53 74 65 70 0a 2a  **     AggStep.*
f620: 2a 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65  *     Insert (re
f630: 63 6f 72 64 20 69 6e 74 6f 20 65 70 68 2d 74 61  cord into eph-ta
f640: 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ble).**   sqlite
f650: 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
f660: 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
f670: 6c 69 7a 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62  lize).**   Gosub
f680: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a   addrGosub.**.**
f690: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
f6a0: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
f6b0: 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  NG AND UNBOUNDED
f6c0: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
f6d0: 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
f6e0: 65 70 74 20 74 61 6b 65 20 6e 6f 20 61 63 74 69  ept take no acti
f6f0: 6f 6e 20 66 6f 72 20 61 20 22 6e 65 77 20 70 65  on for a "new pe
f700: 65 72 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20  er". Invoke.**  
f710: 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
f720: 20 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65   once only for e
f730: 61 63 68 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ach partition..*
f740: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
f750: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
f760: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
f770: 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c  *.**   As above,
f780: 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
f790: 20 22 6e 65 77 20 70 65 65 72 22 20 63 6f 6e 64   "new peer" cond
f7a0: 69 74 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64  ition is handled
f7b0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d   in the.**   sam
f7c0: 65 20 77 61 79 20 61 73 20 22 6e 65 77 20 70 61  e way as "new pa
f7d0: 72 74 69 74 69 6f 6e 22 20 28 73 6f 20 74 68 65  rtition" (so the
f7e0: 72 65 20 69 73 20 6e 6f 20 22 65 6c 73 65 20 69  re is no "else i
f7f0: 66 22 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a  f" block)..**.**
f800: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
f810: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
f820: 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
f830: 57 0a 2a 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62  W.** .**   As ab
f840: 6f 76 65 2c 20 65 78 63 65 70 74 20 61 73 73 75  ove, except assu
f850: 6d 65 20 65 76 65 72 79 20 72 6f 77 20 69 73 20  me every row is 
f860: 61 20 22 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f  a "new peer"..*/
f870: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
f880: 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
f890: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
f8a0: 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
f8b0: 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
f8c0: 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
f8d0: 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
f8e0: 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
f8f0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
f900: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
f910: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f920: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
f930: 20 6b 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73   k;.  int iSubCs
f940: 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  r = p->pSrc->a[0
f950: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ].iCursor;.  int
f960: 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   nSub = p->pSrc-
f970: 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
f980: 3b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50  ;.  int reg = pP
f990: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
f9a0: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
f9b0: 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20  reg+nSub;.  int 
f9c0: 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65  regRowid = regRe
f9d0: 63 6f 72 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64  cord+1;.  int ad
f9e0: 64 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  dr;.  ExprList *
f9f0: 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70  pPart = pMWin->p
fa00: 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70  Partition;.  Exp
fa10: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
fa20: 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
fa30: 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d  y;..  assert( pM
fa40: 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
fa50: 41 4e 47 45 20 0a 20 20 20 20 20 20 7c 7c 20 28  ANGE .      || (
fa60: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
fa70: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70  K_UNBOUNDED && p
fa80: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
fa90: 55 52 52 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20  URRENT).  );..  
faa0: 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e  assert( (pMWin->
fab0: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
fac0: 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
fad0: 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  End==TK_CURRENT)
fae0: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
faf0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
fb00: 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
fb10: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
fb20: 4e 44 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  NDED).       || 
fb30: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
fb40: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
fb50: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
fb60: 52 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c  RRENT).       ||
fb70: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
fb80: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70  =TK_CURRENT && p
fb90: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
fba0: 4e 42 4f 55 4e 44 45 44 20 26 26 20 21 70 4f 72  NBOUNDED && !pOr
fbb0: 64 65 72 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69  derBy).  );..  i
fbc0: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
fbd0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
fbe0: 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
fbf0: 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d  ;.  }..  pParse-
fc00: 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20  >nMem += nSub + 
fc10: 32 3b 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c  2;..  /* Martial
fc20: 20 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65   the row returne
fc30: 64 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c  d by the sub-sel
fc40: 65 63 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  ect into an arra
fc50: 79 20 6f 66 20 0a 20 20 2a 2a 20 72 65 67 69 73  y of .  ** regis
fc60: 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b  ters. */.  for(k
fc70: 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29  =0; k<nSub; k++)
fc80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
fc90: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
fca0: 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b  lumn, iSubCsr, k
fcb0: 2c 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20  , reg+k);.  }.. 
fcc0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
fcd0: 73 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f  s is the start o
fce0: 66 20 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f  f a new partitio
fcf0: 6e 20 6f 72 20 70 65 65 72 20 67 72 6f 75 70 2e  n or peer group.
fd00: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 74 20   */.  if( pPart 
fd10: 7c 7c 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  || pOrderBy ){. 
fd20: 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28     int nPart = (
fd30: 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e  pPart ? pPart->n
fd40: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69  Expr : 0);.    i
fd50: 6e 74 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b  nt addrGoto = 0;
fd60: 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d  .    int addrJum
fd70: 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  p = 0;.    int n
fd80: 50 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79  Peer = (pOrderBy
fd90: 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   ? pOrderBy->nEx
fda0: 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66  pr : 0);..    if
fdb0: 28 20 70 50 61 72 74 20 29 7b 0a 20 20 20 20 20  ( pPart ){.     
fdc0: 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20   int regNewPart 
fdd0: 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e  = reg + pMWin->n
fde0: 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20  BufferCol;.     
fdf0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
fe00: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
fe10: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
fe20: 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30  pParse, pPart, 0
fe30: 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72  , 0);.      addr
fe40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fe50: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp3(v, OP_Compa
fe60: 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20  re, regNewPart, 
fe70: 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e  pMWin->regPart,n
fe80: 50 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Part);.      sql
fe90: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
fea0: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
feb0: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
fec0: 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70  ;.      addrJump
fed0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
fee0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
fef0: 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72   addr+2, 0, addr
ff00: 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
ff10: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
ff20: 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
ff30: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
ff40: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  1);.      if( pO
ff50: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
ff60: 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c    addrGoto = sql
ff70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
ff80: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
ff90: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
ffa0: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
ffb0: 20 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50       int regNewP
ffc0: 65 65 72 20 3d 20 72 65 67 20 2b 20 70 4d 57 69  eer = reg + pMWi
ffd0: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20  n->nBufferCol + 
ffe0: 6e 50 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  nPart;.      int
fff0: 20 72 65 67 50 65 65 72 20 3d 20 70 4d 57 69 6e   regPeer = pMWin
10000 2d 3e 72 65 67 50 61 72 74 20 2b 20 6e 50 61 72  ->regPart + nPar
10010 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 61 64  t;..      if( ad
10020 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33  drJump ) sqlite3
10030 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10040 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20  addrJump);.     
10050 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
10060 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
10070 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
10080 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
10090 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
100a0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
100b0 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
100c0 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
100d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
100e0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
100f0 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65  egNewPeer, regPe
10100 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
10110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10120 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
10130 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
10140 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
10150 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69   addrJump = sqli
10160 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10170 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32   OP_Jump, addr+2
10180 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  , 0, addr+2);.  
10190 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
101a0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
101b0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72  se{.        addr
101c0 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Jump = 0;.      
101d0 7d 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  }.      windowAg
101e0 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
101f0 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74  MWin, pMWin->eSt
10200 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  art==TK_CURRENT)
10210 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
10220 47 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56 64  Goto ) sqlite3Vd
10230 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10240 64 72 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  drGoto);.    }..
10250 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10260 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
10270 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
10280 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75  sr,sqlite3VdbeCu
10290 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
102a0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
102b0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
102c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
102d0 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75  P_Gosub, regGosu
102e0 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
102f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10300 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
10310 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
10320 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
10330 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20  entAddr(v)-1);. 
10340 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
10350 76 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  v);..    sqlite3
10360 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10370 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d  _ResetSorter, pM
10380 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
10390 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
103a0 64 4f 70 33 28 0a 20 20 20 20 20 20 20 20 76 2c  dOp3(.        v,
103b0 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 2b 70 4d   OP_Copy, reg+pM
103c0 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 2c  Win->nBufferCol,
103d0 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
103e0 20 6e 50 61 72 74 2b 6e 50 65 65 72 2d 31 0a 20   nPart+nPeer-1. 
103f0 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 61     );..    if( a
10400 64 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74 65  ddrJump ) sqlite
10410 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
10420 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a   addrJump);.  }.
10430 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 65  .  /* Invoke ste
10440 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 77  p function for w
10450 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
10460 2a 2f 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74  */.  windowAggSt
10470 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
10480 2c 20 2d 31 2c 20 30 2c 20 72 65 67 2c 20 30 29  , -1, 0, reg, 0)
10490 3b 0a 0a 20 20 2f 2a 20 42 75 66 66 65 72 20 74  ;..  /* Buffer t
104a0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
104b0 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  n the ephemeral 
104c0 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20  table. */.  if( 
104d0 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
104e0 6c 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l>0 ){.    sqlit
104f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10500 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
10510 65 67 2c 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  eg, pMWin->nBuff
10520 65 72 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64  erCol, regRecord
10530 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10550 32 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c  2(v, OP_Blob, 0,
10560 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
10570 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
10580 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 22  ndP4(v, (void*)"
10590 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ", 0);.  }.  sql
105a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
105b0 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
105c0 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
105d0 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  egRowid);.  sqli
105e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
105f0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69   OP_Insert, pMWi
10600 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
10610 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29  ecord, regRowid)
10620 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  ;..  /* End the 
10630 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
10640 6f 70 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  op. */.  sqlite3
10650 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
10660 3b 0a 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69  ;..  windowAggFi
10670 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
10680 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 1);.  sqlite3
10690 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
106a0 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e  _Rewind, pMWin->
106b0 69 45 70 68 43 73 72 2c 73 71 6c 69 74 65 33 56  iEphCsr,sqlite3V
106c0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
106d0 29 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+3);.  VdbeCove
106e0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
106f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10700 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
10710 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
10720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10730 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
10740 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
10750 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10760 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20  ntAddr(v)-1);.  
10770 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
10790 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
107a0 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
107b0 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69   Window object i
107c0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 0a  ndicated by the.
107d0 2a 2a 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  ** third argumen
107e0 74 2e 20 53 65 74 20 74 68 65 20 57 69 6e 64 6f  t. Set the Windo
107f0 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f  w.pOwner field o
10800 66 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  f the new object
10810 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a   to.** pOwner..*
10820 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
10830 33 57 69 6e 64 6f 77 44 75 70 28 73 71 6c 69 74  3WindowDup(sqlit
10840 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f  e3 *db, Expr *pO
10850 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29  wner, Window *p)
10860 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77  {.  Window *pNew
10870 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b   = 0;.  if( p ){
10880 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
10890 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
108a0 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f  db, sizeof(Windo
108b0 77 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  w));.    if( pNe
108c0 77 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  w ){.      pNew-
108d0 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
108e0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e  DbStrDup(db, p->
108f0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e  zName);.      pN
10900 65 77 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73 71  ew->pFilter = sq
10910 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
10920 20 70 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b   p->pFilter, 0);
10930 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 61  .      pNew->pPa
10940 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  rtition = sqlite
10950 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
10960 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20   p->pPartition, 
10970 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
10980 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
10990 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
109a0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30  , p->pOrderBy, 0
109b0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  );.      pNew->e
109c0 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b  Type = p->eType;
109d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 6e  .      pNew->eEn
109e0 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
109f0 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72 74 20     pNew->eStart 
10a00 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20  = p->eStart;.   
10a10 20 20 20 70 4e 65 77 2d 3e 70 53 74 61 72 74 20     pNew->pStart 
10a20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
10a30 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20  (db, p->pStart, 
10a40 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
10a50 70 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78  pEnd = sqlite3Ex
10a60 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e  prDup(db, p->pEn
10a70 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  d, 0);.      pNe
10a80 77 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e  w->pOwner = pOwn
10a90 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
10aa0 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
10ab0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63  /*.** Return a c
10ac0 6f 70 79 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  opy of the linke
10ad0 64 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77  d list of Window
10ae0 20 6f 62 6a 65 63 74 73 20 70 61 73 73 65 64 20   objects passed 
10af0 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  as the.** second
10b00 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69   argument..*/.Wi
10b10 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e  ndow *sqlite3Win
10b20 64 6f 77 4c 69 73 74 44 75 70 28 73 71 6c 69 74  dowListDup(sqlit
10b30 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a  e3 *db, Window *
10b40 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  p){.  Window *pW
10b50 69 6e 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52  in;.  Window *pR
10b60 65 74 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77  et = 0;.  Window
10b70 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a   **pp = &pRet;..
10b80 20 20 66 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57    for(pWin=p; pW
10b90 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
10ba0 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70  NextWin){.    *p
10bb0 70 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  p = sqlite3Windo
10bc0 77 44 75 70 28 64 62 2c 20 30 2c 20 70 57 69 6e  wDup(db, 0, pWin
10bd0 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 70 3d 3d  );.    if( *pp==
10be0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
10bf0 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
10c00 78 74 57 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72  xtWin);.  }..  r
10c10 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
10c20 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72  *.** sqlite3Wher
10c30 65 42 65 67 69 6e 28 29 20 68 61 73 20 61 6c 72  eBegin() has alr
10c40 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
10c50 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20   for the SELECT 
10c60 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 70 61  statement .** pa
10c70 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
10c80 6e 64 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e  nd argument when
10c90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10ca0 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74 20 67 65  s invoked. It ge
10cb0 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f 64 65 20  nerates.** code 
10cc0 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
10cd0 57 69 6e 64 6f 77 2e 72 65 67 52 65 73 75 6c 74  Window.regResult
10ce0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61   register for ea
10cf0 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
10d00 6f 6e 20 61 6e 64 0a 2a 2a 20 69 6e 76 6f 6b 65  on and.** invoke
10d10 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
10d20 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
10d30 61 64 64 72 47 6f 73 75 62 20 6f 6e 63 65 20 66  addrGosub once f
10d40 6f 72 20 65 61 63 68 20 72 6f 77 2e 0a 2a 2a 20  or each row..** 
10d50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  This function ca
10d60 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65 72 65  lls sqlite3Where
10d70 45 6e 64 28 29 20 62 65 66 6f 72 65 20 72 65 74  End() before ret
10d80 75 72 6e 69 6e 67 2e 20 0a 2a 2f 0a 76 6f 69 64  urning. .*/.void
10d90 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
10da0 64 65 53 74 65 70 28 0a 20 20 50 61 72 73 65 20  deStep(.  Parse 
10db0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
10dd0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
10de0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 2f 2a 20 52 65 77 72 69 74 74 65 6e 20 53 45 4c  /* Rewritten SEL
10e10 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
10e20 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
10e30 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
10e40 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 72 65     /* Context re
10e50 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
10e60 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
10e70 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e90 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
10ea0 6f 72 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20  or OP_Gosub */. 
10eb0 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 20 20   int addrGosub  
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 2f 2a 20 4f 50 5f 47 6f 73 75 62 20 68 65 72   /* OP_Gosub her
10ee0 65 20 74 6f 20 72 65 74 75 72 6e 20 65 61 63 68  e to return each
10ef0 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e   row */.){.  Win
10f00 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
10f10 70 57 69 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  pWin;..  /* Ther
10f20 65 20 61 72 65 20 74 68 72 65 65 20 64 69 66 66  e are three diff
10f30 65 72 65 6e 74 20 66 75 6e 63 74 69 6f 6e 73 20  erent functions 
10f40 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 65 64  that may be used
10f50 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 0a   to do the work.
10f60 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
10f70 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
10f80 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
10f90 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 63  and the specific
10fa0 20 62 75 69 6c 74 2d 69 6e 0a 20 20 2a 2a 20 77   built-in.  ** w
10fb0 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
10fc0 75 73 65 64 20 28 69 66 20 61 6e 79 29 2e 0a 20  used (if any).. 
10fd0 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43   **.  ** windowC
10fe0 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 29  odeRowExprStep()
10ff0 20 68 61 6e 64 6c 65 73 20 61 6c 6c 20 22 52 4f   handles all "RO
11000 57 53 22 20 77 69 6e 64 6f 77 20 66 72 61 6d 65  WS" window frame
11010 73 2c 20 65 78 63 65 70 74 20 66 6f 72 3a 0a 20  s, except for:. 
11020 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 4f 57 53 20   **.  **   ROWS 
11030 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
11040 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
11050 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a  CURRENT ROW.  **
11060 0a 20 20 2a 2a 20 54 68 65 20 65 78 63 65 70 74  .  ** The except
11070 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 77  ion is because w
11080 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72  indowCodeRowExpr
11090 53 74 65 70 28 29 20 69 6d 70 6c 65 6d 65 6e 74  Step() implement
110a0 73 20 61 6c 6c 20 77 69 6e 64 6f 77 0a 20 20 2a  s all window.  *
110b0 2a 20 66 72 61 6d 65 20 74 79 70 65 73 20 62 79  * frame types by
110c0 20 63 61 63 68 69 6e 67 20 74 68 65 20 65 6e 74   caching the ent
110d0 69 72 65 20 70 61 72 74 69 74 69 6f 6e 20 69 6e  ire partition in
110e0 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61   a temp table, a
110f0 6e 64 0a 20 20 2a 2a 20 22 52 4f 57 53 20 42 45  nd.  ** "ROWS BE
11100 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
11110 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
11120 52 52 45 4e 54 20 52 4f 57 22 20 69 73 20 65 61  RRENT ROW" is ea
11130 73 79 20 65 6e 6f 75 67 68 20 74 6f 0a 20 20 2a  sy enough to.  *
11140 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 77 69 74 68  * implement with
11150 6f 75 74 20 73 75 63 68 20 61 20 63 61 63 68 65  out such a cache
11160 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64  ..  **.  ** wind
11170 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65 70 28  owCodeCacheStep(
11180 29 20 69 73 20 75 73 65 64 20 66 6f 72 3a 0a 20  ) is used for:. 
11190 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45   **.  **   RANGE
111a0 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
111b0 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44   ROW AND UNBOUND
111c0 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  ED FOLLOWING.  *
111d0 2a 0a 20 20 2a 2a 20 49 74 20 69 73 20 61 6c 73  *.  ** It is als
111e0 6f 20 75 73 65 64 20 66 6f 72 20 61 6e 79 74 68  o used for anyth
111f0 69 6e 67 20 6e 6f 74 20 68 61 6e 64 6c 65 64 20  ing not handled 
11200 62 79 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77  by windowCodeRow
11210 45 78 70 72 53 74 65 70 28 29 20 0a 20 20 2a 2a  ExprStep() .  **
11220 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 61 20   that invokes a 
11230 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
11240 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65  function that re
11250 71 75 69 72 65 73 20 74 68 65 20 65 6e 74 69 72  quires the entir
11260 65 20 0a 20 20 2a 2a 20 70 61 72 74 69 74 69 6f  e .  ** partitio
11270 6e 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 69  n to be cached i
11280 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62  n a temp table b
11290 65 66 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 61  efore any rows a
112a0 72 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  re returned.  **
112b0 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c 75 65   (e.g. nth_value
112c0 28 29 20 6f 72 20 70 65 72 63 65 6e 74 5f 72 61  () or percent_ra
112d0 6e 6b 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nk())..  **.  **
112e0 20 46 69 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 69   Finally, assumi
112f0 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62  ng there is no b
11300 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
11310 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65 71  unction that req
11320 75 69 72 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  uires.  ** the p
11330 61 72 74 69 74 69 6f 6e 20 74 6f 20 62 65 20 63  artition to be c
11340 61 63 68 65 64 2c 20 77 69 6e 64 6f 77 43 6f 64  ached, windowCod
11350 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 20 69  eDefaultStep() i
11360 73 20 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a  s used for:.  **
11370 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45  .  **   RANGE BE
11380 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
11390 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
113a0 52 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20  RRENT ROW .  ** 
113b0 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20    RANGE BETWEEN 
113c0 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
113d0 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
113e0 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a  D FOLLOWING.  **
113f0 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
11400 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44   CURRENT ROW AND
11410 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 20 20   CURRENT ROW .  
11420 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45  **   ROWS BETWEE
11430 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
11440 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
11450 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20  T ROW.  **.  ** 
11460 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c  windowCodeDefaul
11470 74 53 74 65 70 28 29 20 69 73 20 74 68 65 20 6f  tStep() is the o
11480 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  nly one of the t
11490 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  hree functions t
114a0 68 61 74 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  hat.  ** does no
114b0 74 20 63 61 63 68 65 20 65 61 63 68 20 70 61 72  t cache each par
114c0 74 69 74 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70  tition in a temp
114d0 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65   table before be
114e0 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  ginning to.  ** 
114f0 72 65 74 75 72 6e 20 72 6f 77 73 2e 0a 20 20 2a  return rows..  *
11500 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  /.  if( pMWin->e
11510 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 0a 20  Type==TK_ROWS . 
11520 20 20 26 26 20 28 70 4d 57 69 6e 2d 3e 65 53 74    && (pMWin->eSt
11530 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
11540 44 7c 7c 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d  D||pMWin->eEnd!=
11550 54 4b 5f 43 55 52 52 45 4e 54 7c 7c 21 70 4d 57  TK_CURRENT||!pMW
11560 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 0a 20 20  in->pOrderBy).  
11570 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  ){.    windowCod
11580 65 52 6f 77 45 78 70 72 53 74 65 70 28 70 50 61  eRowExprStep(pPa
11590 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
115a0 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
115b0 73 75 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sub);.  }else{. 
115c0 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b     Window *pWin;
115d0 0a 20 20 20 20 69 6e 74 20 62 43 61 63 68 65 20  .    int bCache 
115e0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
115f0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
11600 65 20 43 61 63 68 65 53 74 65 70 28 29 20 2a 2f  e CacheStep() */
11610 0a 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ..    if( pMWin-
11620 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
11630 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  ENT && pMWin->eE
11640 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
11650 20 29 7b 0a 20 20 20 20 20 20 62 43 61 63 68 65   ){.      bCache
11660 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
11670 0a 20 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d  .      for(pWin=
11680 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
11690 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
116a0 29 7b 0a 20 20 20 20 20 20 20 20 46 75 6e 63 44  ){.        FuncD
116b0 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e  ef *pFunc = pWin
116c0 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 20  ->pFunc;.       
116d0 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e   if( (pFunc->fun
116e0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
116f0 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45  FUNC_WINDOW_SIZE
11700 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  ).         || (p
11710 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74  Func->xSFunc==nt
11720 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 29  h_valueStepFunc)
11730 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46  .         || (pF
11740 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72  unc->xSFunc==fir
11750 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  st_valueStepFunc
11760 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  ).         || (p
11770 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65  Func->xSFunc==le
11780 61 64 53 74 65 70 46 75 6e 63 29 0a 20 20 20 20  adStepFunc).    
11790 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
117a0 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70 46  xSFunc==lagStepF
117b0 75 6e 63 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  unc).        ){.
117c0 20 20 20 20 20 20 20 20 20 20 62 43 61 63 68 65            bCache
117d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
117e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
117f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
11800 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
11810 2c 20 63 61 6c 6c 20 77 69 6e 64 6f 77 43 6f 64  , call windowCod
11820 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 2e 20  eDefaultStep(). 
11830 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 43 61 63   */.    if( bCac
11840 68 65 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 64  he ){.      wind
11850 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65 70 28  owCodeCacheStep(
11860 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
11870 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  o, regGosub, add
11880 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d 65 6c  rGosub);.    }el
11890 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77  se{.      window
118a0 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
118b0 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
118c0 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  o, regGosub, add
118d0 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 7d 0a 20  rGosub);.    }. 
118e0 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
118f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
11900 4f 57 46 55 4e 43 20 2a 2f 0a                    OWFUNC */.