/ Hex Artifact Content
Login

Artifact 607664ea225c3a9c2a7f55795741444bd6a95be37d1681ecf962cd5cb1618dba:


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 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75 6d  on rank(). Assum
1b60: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
1b70: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
1b80: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
1b90: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
1ba0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1bb0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
1bc0: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
1bd0: 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46  c void rankStepF
1be0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1bf0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1c00: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1c10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1c20: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1c30: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1c40: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1c50: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1c60: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1c70: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1c80: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1c90: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1ca0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1cc0: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
1cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
1ce0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1cf0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
1d00: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
1d10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
1d20: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
1d30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1d40: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
1d50: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
1d60: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
1d70: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
1d80: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
1d90: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
1da0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1db0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1dc0: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e  int64(pCtx, p->n
1dd0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 6e  Value);.    p->n
1de0: 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Value = 0;.  }.}
1df0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1e00: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1e10: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1e20: 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28  on percent_rank(
1e30: 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a  ). Assumes that.
1e40: 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ** the window fr
1e50: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ame has been set
1e60: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e   to:.**.**   RAN
1e70: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
1e80: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
1e90: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
1ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1eb0: 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70 46  ercent_rankStepF
1ec0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ed0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1ee0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1ef0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1f00: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1f10: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55  allCount *p;.  U
1f20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f30: 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e  nArg); assert( n
1f40: 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 70 20 3d  Arg==1 );..  p =
1f50: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
1f60: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
1f70: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1f80: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1f90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fa0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
1fb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f   ){.      p->nTo
1fc0: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
1fd0: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1fe0: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
1ff0: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
2000: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
2010: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
2020: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
2030: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2040: 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74 5f 72  c void percent_r
2050: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
2060: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2070: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2080: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2090: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
20a0: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
20b0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
20c0: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
20d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
20e0: 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31   if( p->nTotal>1
20f0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
2100: 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d   r = (double)(p-
2110: 3e 6e 56 61 6c 75 65 2d 31 29 20 2f 20 28 64 6f  >nValue-1) / (do
2120: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2130: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2140: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2150: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2160: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2170: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2180: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2190: 20 7d 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65   }.    p->nValue
21a0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
21b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
21c0: 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69  n of built-in wi
21d0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75  ndow function cu
21e0: 6d 65 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d  me_dist(). Assum
21f0: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
2200: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
2210: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
2220: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
2230: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
2240: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2250: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
2260: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
2270: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2290: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
22a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22b0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
22c0: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70  uct CallCount *p
22d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
22e0: 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50 41  ==1 ); UNUSED_PA
22f0: 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 0a  RAMETER(nArg);..
2300: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2310: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2320: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2330: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2340: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2360: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  al==0 ){.      p
2370: 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74  ->nTotal = sqlit
2380: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2390: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  pArg[0]);.    }.
23a0: 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
23b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
23c0: 64 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65  d cume_distValue
23d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
23e0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
23f0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
2400: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
2410: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2420: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2430: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2440: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
2450: 70 20 26 26 20 70 2d 3e 6e 54 6f 74 61 6c 20 29  p && p->nTotal )
2460: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d  {.    double r =
2470: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74   (double)(p->nSt
2480: 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  ep) / (double)(p
2490: 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73  ->nTotal);.    s
24a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
24b0: 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20  uble(pCtx, r);. 
24c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
24d0: 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e  ext object for n
24e0: 74 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75  tile() window fu
24f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63  nction..*/.struc
2500: 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69  t NtileCtx {.  i
2510: 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20  64 nTotal;      
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2530: 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20  * Total rows in 
2540: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  partition */.  i
2550: 36 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20  64 nParam;      
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2570: 2a 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73  * Parameter pass
2580: 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a  ed to ntile(N) *
2590: 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20  /.  i64 iRow;   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
25c0: 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.};../*.** 
25d0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25e0: 66 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20  f ntile(). This 
25f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
2600: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
2610: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65  s.** been coerce
2620: 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  d to:.**.**   RO
2630: 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  WS UNBOUNDED PRE
2640: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2650: 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63  NT ROW.*/.static
2660: 20 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46   void ntileStepF
2670: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2680: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
2690: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
26a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
26b0: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e  rg.){.  struct N
26c0: 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73  tileCtx *p;.  as
26d0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
26e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26f0: 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  R(nArg);.  p = (
2700: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a  struct NtileCtx*
2710: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2720: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2730: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2740: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
2750: 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b   p->nTotal==0 ){
2760: 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d  .      p->nParam
2770: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2780: 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29  _int64(apArg[0])
2790: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61  ;.      p->nTota
27a0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
27b0: 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d  e_int64(apArg[1]
27c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
27d0: 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20  nParam<=0 ){.   
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
27f0: 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20  ult_error(.     
2800: 20 20 20 20 20 20 20 70 43 74 78 2c 20 22 61 72         pCtx, "ar
2810: 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20  gument of ntile 
2820: 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69  must be a positi
2830: 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a  ve integer", -1.
2840: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2850: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2860: 69 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  iRow++;.  }.}.st
2870: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 56  atic void ntileV
2880: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2890: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
28a0: 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43  .  struct NtileC
28b0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
28c0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
28d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2900: 28 20 70 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d  ( p && p->nParam
2910: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  >0 ){.    int nS
2920: 69 7a 65 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c  ize = (p->nTotal
2930: 20 2f 20 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20   / p->nParam);. 
2940: 20 20 20 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20     if( nSize==0 
2950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2960: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
2970: 74 78 2c 20 70 2d 3e 69 52 6f 77 29 3b 0a 20 20  tx, p->iRow);.  
2980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2990: 36 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e  64 nLarge = p->n
29a0: 54 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61  Total - p->nPara
29b0: 6d 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  m*nSize;.      i
29c0: 36 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72  64 iSmall = nLar
29d0: 67 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20  ge*(nSize+1);.  
29e0: 20 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70      i64 iRow = p
29f0: 2d 3e 69 52 6f 77 2d 31 3b 0a 0a 20 20 20 20 20  ->iRow-1;..     
2a00: 20 61 73 73 65 72 74 28 20 28 6e 4c 61 72 67 65   assert( (nLarge
2a10: 2a 28 6e 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d  *(nSize+1) + (p-
2a20: 3e 6e 50 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a  >nParam-nLarge)*
2a30: 6e 53 69 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61  nSize)==p->nTota
2a40: 6c 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  l );..      if( 
2a50: 69 52 6f 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20  iRow<iSmall ){. 
2a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2a70: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2a80: 2c 20 31 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a  , 1 + iRow/(nSiz
2a90: 65 2b 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e+1));.      }el
2aa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ab0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2ac0: 28 70 43 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67  (pCtx, 1 + nLarg
2ad0: 65 20 2b 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c  e + (iRow-iSmall
2ae0: 29 2f 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  )/nSize);.      
2af0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2b00: 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a  *.** Context obj
2b10: 65 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c  ect for last_val
2b20: 75 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63  ue() window func
2b30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tion..*/.struct 
2b40: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20  LastValueCtx {. 
2b50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b60: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  pVal;.  int nVal
2b70: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.};../*.** Impl
2b80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61  ementation of la
2b90: 73 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73  st_value()..*/.s
2ba0: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f  tatic void last_
2bb0: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20  valueStepFunc(. 
2bc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2bd0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2be0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2bf0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2c00: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
2c10: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
2c20: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
2c30: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2c40: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
2c50: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2c60: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
2c70: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2c80: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
2c90: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
2ca0: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e  ->pVal);.    p->
2cb0: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVal = sqlite3_v
2cc0: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2cd0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ]);.    if( p->p
2ce0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2cf0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2d00: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d20: 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20     p->nVal++;.  
2d30: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2d40: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2d50: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
2d60: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2d70: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2d80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d90: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2da0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2db0: 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  *p;.  UNUSED_PAR
2dc0: 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20  AMETER(nArg);.  
2dd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2de0: 28 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  (apArg);.  p = (
2df0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2e00: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
2e10: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2e20: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
2e30: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
2e40: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c  ) ){.    p->nVal
2e50: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
2e60: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
2e80: 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  ee(p->pVal);.   
2e90: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a     p->pVal = 0;.
2ea0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
2eb0: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2ec0: 75 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  ueValueFunc(sqli
2ed0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2ee0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
2ef0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
2f00: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
2f10: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
2f20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2f30: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2f40: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2f50: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
2f60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f70: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
2f80: 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  Val);.  }.}.stat
2f90: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2fa0: 75 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73  ueFinalizeFunc(s
2fb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2fc0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
2fd0: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b  LastValueCtx *p;
2fe0: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c  .  p = (struct L
2ff0: 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c  astValueCtx*)sql
3000: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3010: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
3020: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
3030: 70 20 26 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a  p && p->pVal ){.
3040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3050: 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 70  lt_value(pCtx, p
3060: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ->pVal);.    sql
3070: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
3080: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
3090: 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d  >pVal = 0;.  }.}
30a0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e  ../*.** Static n
30b0: 61 6d 65 73 20 66 6f 72 20 74 68 65 20 62 75 69  ames for the bui
30c0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
30d0: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
30e0: 65 73 65 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61  ese static.** na
30f0: 6d 65 73 20 61 72 65 20 75 73 65 64 2c 20 72 61  mes are used, ra
3100: 74 68 65 72 20 74 68 61 6e 20 73 74 72 69 6e 67  ther than string
3110: 20 6c 69 74 65 72 61 6c 73 2c 20 73 6f 20 74 68   literals, so th
3120: 61 74 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63  at FuncDef objec
3130: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 61 73 73  ts.** can be ass
3140: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
3150: 61 72 74 69 63 75 6c 61 72 20 77 69 6e 64 6f 77  articular window
3160: 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 64 69 72   function by dir
3170: 65 63 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ect.** compariso
3180: 6e 20 6f 66 20 74 68 65 20 7a 4e 61 6d 65 20 70  n of the zName p
3190: 6f 69 6e 74 65 72 2e 20 20 45 78 61 6d 70 6c 65  ointer.  Example
31a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66  :.**.**       if
31b0: 28 20 70 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d  ( pFuncDef->zNam
31c0: 65 3d 3d 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65  e==row_valueName
31d0: 20 29 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61   ){ ... }.*/.sta
31e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
31f0: 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20  ow_numberName[] 
3200: 3d 20 20 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22  =   "row_number"
3210: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ;.static const c
3220: 68 61 72 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61  har dense_rankNa
3230: 6d 65 5b 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f  me[] =   "dense_
3240: 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f  rank";.static co
3250: 6e 73 74 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d  nst char rankNam
3260: 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 72  e[] =         "r
3270: 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ank";.static con
3280: 73 74 20 63 68 61 72 20 70 65 72 63 65 6e 74 5f  st char percent_
3290: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65  rankName[] = "pe
32a0: 72 63 65 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61  rcent_rank";.sta
32b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 63  tic const char c
32c0: 75 6d 65 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d  ume_distName[] =
32d0: 20 20 20 20 22 63 75 6d 65 5f 64 69 73 74 22 3b      "cume_dist";
32e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
32f0: 61 72 20 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d  ar ntileName[] =
3300: 20 20 20 20 20 20 20 20 22 6e 74 69 6c 65 22 3b          "ntile";
3310: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3320: 61 72 20 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d  ar last_valueNam
3330: 65 5b 5d 20 3d 20 20 20 22 6c 61 73 74 5f 76 61  e[] =   "last_va
3340: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3350: 73 74 20 63 68 61 72 20 6e 74 68 5f 76 61 6c 75  st char nth_valu
3360: 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74  eName[] =    "nt
3370: 68 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  h_value";.static
3380: 20 63 6f 6e 73 74 20 63 68 61 72 20 66 69 72 73   const char firs
3390: 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  t_valueName[] = 
33a0: 20 22 66 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a   "first_value";.
33b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
33c0: 72 20 6c 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20  r leadName[] =  
33d0: 20 20 20 20 20 20 20 22 6c 65 61 64 22 3b 0a 73         "lead";.s
33e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
33f0: 20 6c 61 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20   lagName[] =    
3400: 20 20 20 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a        "lag";../*
3410: 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d  .** No-op implem
3420: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 78 53 74  entations of xSt
3430: 65 70 28 29 20 61 6e 64 20 78 46 69 6e 61 6c 69  ep() and xFinali
3440: 7a 65 28 29 2e 20 20 55 73 65 64 20 61 73 20 70  ze().  Used as p
3450: 6c 61 63 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20  lace-holders.** 
3460: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
3470: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3480: 61 74 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  at never call th
3490: 6f 73 65 20 69 6e 74 65 72 66 61 63 65 73 2e 0a  ose interfaces..
34a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61  **.** The noopVa
34b0: 6c 75 65 46 75 6e 63 28 29 20 69 73 20 63 61 6c  lueFunc() is cal
34c0: 6c 65 64 20 62 75 74 20 69 73 20 65 78 70 65 63  led but is expec
34d0: 74 65 64 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e  ted to do nothin
34e0: 67 2e 20 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53  g.  The.** noopS
34f0: 74 65 70 46 75 6e 63 28 29 20 69 73 20 6e 65 76  tepFunc() is nev
3500: 65 72 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  er called, and s
3510: 6f 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 77  o it is marked w
3520: 69 74 68 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a  ith NO_TEST to.*
3530: 2a 20 6c 65 74 20 74 68 65 20 74 65 73 74 20 63  * let the test c
3540: 6f 76 65 72 61 67 65 20 72 6f 75 74 69 6e 65 20  overage routine 
3550: 6b 6e 6f 77 20 6e 6f 74 20 74 6f 20 65 78 70 65  know not to expe
3560: 63 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ct this function
3570: 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65   to be.** invoke
3580: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3590: 64 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 20  d noopStepFunc( 
35a0: 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
35b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
35c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f   *p,        /*NO
35d0: 5f 54 45 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c  _TEST*/.  int n,
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
3600: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3610: 20 2a 2a 61 20 20 20 20 20 20 20 20 20 20 2f 2a   **a          /*
3620: 4e 4f 5f 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20  NO_TEST*/.){    
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
3650: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
3660: 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
3670: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e  /*NO_TEST*/.  UN
3680: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
3690: 29 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  );       /*NO_TE
36a0: 53 54 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  ST*/.  UNUSED_PA
36b0: 52 41 4d 45 54 45 52 28 61 29 3b 20 20 20 20 20  RAMETER(a);     
36c0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
36d0: 61 73 73 65 72 74 28 30 29 3b 20 20 20 20 20 20  assert(0);      
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
36f0: 54 45 53 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20  TEST*/.}        
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
3720: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70  static void noop
3730: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
3740: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55  3_context *p){ U
3750: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3760: 70 29 3b 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a  p); /*no-op*/ }.
3770: 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74  ./* Window funct
3780: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c  ions that use al
3790: 6c 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61  l window interfa
37a0: 63 65 73 3a 20 78 53 74 65 70 2c 20 78 46 69 6e  ces: xStep, xFin
37b0: 61 6c 2c 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61  al,.** xValue, a
37c0: 6e 64 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23  nd xInverse */.#
37d0: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e  define WINDOWFUN
37e0: 43 41 4c 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  CALL(name,nArg,e
37f0: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41            \.  nA
3820: 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38  rg, (SQLITE_UTF8
3830: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e  |SQLITE_FUNC_WIN
3840: 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30  DOW|extra), 0, 0
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3860: 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20         \.  name 
3870: 23 23 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d  ## StepFunc, nam
3880: 65 20 23 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e  e ## FinalizeFun
3890: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
38a0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
38b0: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
38c0: 49 6e 76 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  InvFunc, name ##
38d0: 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20   Name, {0}      
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20   \.}../* Window 
3910: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
3920: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  re implemented u
3930: 73 69 6e 67 20 62 79 74 65 63 6f 64 65 20 61 6e  sing bytecode an
3940: 64 20 74 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e  d thus have.** n
3950: 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 73 20 66 6f  o-op routines fo
3960: 72 20 74 68 65 69 72 20 6d 65 74 68 6f 64 73 20  r their methods 
3970: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  */.#define WINDO
3980: 57 46 55 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e  WFUNCNOOP(name,n
3990: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
39c0: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
39d0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
39e0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
39f0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
3a00: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3a10: 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f  oopStepFunc, noo
3a20: 70 56 61 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70  pValueFunc, noop
3a30: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
3a60: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
3a70: 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20  # Name, {0}     
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e       \.}../* Win
3ab0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ac0: 61 74 20 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f  at use all windo
3ad0: 77 20 69 6e 74 65 72 66 61 63 65 73 3a 20 78 53  w interfaces: xS
3ae0: 74 65 70 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65  tep, the.** same
3af0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 78 46 69   routine for xFi
3b00: 6e 61 6c 69 7a 65 20 61 6e 64 20 78 56 61 6c 75  nalize and xValu
3b10: 65 20 61 6e 64 20 77 68 69 63 68 20 6e 65 76 65  e and which neve
3b20: 72 20 63 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72  r call.** xInver
3b30: 73 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se. */.#define W
3b40: 49 4e 44 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c  INDOWFUNCX(name,
3b50: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
3b90: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
3ba0: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3bb0: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3bd0: 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46  .  name ## StepF
3be0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
3bf0: 75 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  ueFunc, name ## 
3c00: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3c20: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 61  noopStepFunc, na
3c30: 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20  me ## Name, {0} 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f           \.}.../
3c70: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
3c80: 6f 73 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ose built-in win
3c90: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ca0: 61 74 20 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20  at are not also 
3cb0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76  aggregates..*/.v
3cc0: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
3cd0: 77 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  wFunctions(void)
3ce0: 7b 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63 44  {.  static FuncD
3cf0: 65 66 20 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b  ef aWindowFuncs[
3d00: 5d 20 3d 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57  ] = {.    WINDOW
3d10: 46 55 4e 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72  FUNCX(row_number
3d20: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d30: 44 4f 57 46 55 4e 43 58 28 64 65 6e 73 65 5f 72  DOWFUNCX(dense_r
3d40: 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20  ank, 0, 0),.    
3d50: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b  WINDOWFUNCX(rank
3d60: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d70: 44 4f 57 46 55 4e 43 58 28 70 65 72 63 65 6e 74  DOWFUNCX(percent
3d80: 5f 72 61 6e 6b 2c 20 30 2c 20 53 51 4c 49 54 45  _rank, 0, SQLITE
3d90: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
3da0: 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  E),.    WINDOWFU
3db0: 4e 43 58 28 63 75 6d 65 5f 64 69 73 74 2c 20 30  NCX(cume_dist, 0
3dc0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  , SQLITE_FUNC_WI
3dd0: 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20  NDOW_SIZE),.    
3de0: 57 49 4e 44 4f 57 46 55 4e 43 58 28 6e 74 69 6c  WINDOWFUNCX(ntil
3df0: 65 2c 20 31 2c 20 53 51 4c 49 54 45 5f 46 55 4e  e, 1, SQLITE_FUN
3e00: 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a  C_WINDOW_SIZE),.
3e10: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c      WINDOWFUNCAL
3e20: 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31 2c  L(last_value, 1,
3e30: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
3e40: 55 4e 43 4e 4f 4f 50 28 6e 74 68 5f 76 61 6c 75  UNCNOOP(nth_valu
3e50: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
3e60: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 66 69 72  NDOWFUNCNOOP(fir
3e70: 73 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c  st_value, 1, 0),
3e80: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3e90: 4f 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c  OOP(lead, 1, 0),
3ea0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3eb0: 4f 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c  OOP(lead, 2, 0),
3ec0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ed0: 4f 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c  OOP(lead, 3, 0),
3ee0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ef0: 4f 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a  OOP(lag, 1, 0),.
3f00: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
3f10: 4f 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20  OP(lag, 2, 0),. 
3f20: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
3f30: 50 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20  P(lag, 3, 0),.  
3f40: 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65  };.  sqlite3Inse
3f50: 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61  rtBuiltinFuncs(a
3f60: 57 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72  WindowFuncs, Arr
3f70: 61 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75  aySize(aWindowFu
3f80: 6e 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ncs));.}..static
3f90: 20 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46   Window *windowF
3fa0: 69 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  ind(Parse *pPars
3fb0: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74  e, Window *pList
3fc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3fd0: 61 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ame){.  Window *
3fe0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  p;.  for(p=pList
3ff0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57  ; p; p=p->pNextW
4000: 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  in){.    if( sql
4010: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a  ite3StrICmp(p->z
4020: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
4030: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
4040: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
4050: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4060: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
4070: 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61  window: %s", zNa
4080: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4090: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n p;.}../*.** Th
40a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
40b0: 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  alled immediatel
40c0: 79 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e  y after resolvin
40d0: 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  g the function n
40e0: 61 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e  ame.** for a win
40f0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  dow function wit
4100: 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hin a SELECT sta
4110: 74 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74  tement. Argument
4120: 20 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c   pList is a.** l
4130: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49  inked list of WI
4140: 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73  NDOW definitions
4150: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
4160: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4170: 74 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  t..** Argument p
4180: 46 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63  Func is the func
4190: 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
41a0: 6a 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e  just resolved an
41b0: 64 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65  d pWin.** is the
41c0: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72   Window object r
41d0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
41e0: 61 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20  associated OVER 
41f0: 63 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20  clause. This.** 
4200: 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
4210: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4220: 20 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73   pWin as follows
4230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
4240: 68 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72  he OVER clause r
4250: 65 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65  efered to a name
4260: 64 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20  d window (as in 
4270: 22 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e  "max(x) OVER win
4280: 22 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63  "),.**     searc
4290: 68 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72  h list pList for
42a0: 20 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44   a matching WIND
42b0: 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61  OW definition, a
42c0: 6e 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a  nd update pWin.*
42d0: 2a 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c  *     accordingl
42e0: 79 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49  y. If no such WI
42f0: 4e 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20  NDOW clause can 
4300: 62 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20  be found, leave 
4310: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20  an error.**     
4320: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  in pParse..**.**
4330: 20 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63     * If the func
4340: 74 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d  tion is a built-
4350: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
4360: 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73  on that requires
4370: 20 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64   the.**     wind
4380: 6f 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64  ow to be coerced
4390: 20 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20   (see "BUILT-IN 
43a0: 57 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53  WINDOW FUNCTIONS
43b0: 22 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20  " at the top.** 
43c0: 20 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65      of this file
43d0: 29 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74  ), pWin is updat
43e0: 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ed here..*/.void
43f0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70   sqlite3WindowUp
4400: 64 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  date(.  Parse *p
4410: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
4420: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
4430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
4440: 74 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f  t of named windo
4450: 77 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ws for this SELE
4460: 43 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a  CT */.  Window *
4470: 70 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  pWin,           
4480: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f          /* Windo
4490: 77 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74  w frame to updat
44a0: 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a  e */.  FuncDef *
44b0: 70 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20  pFunc           
44c0: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
44d0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
44e0: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tion */.){.  if(
44f0: 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20   pWin->zName && 
4500: 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 30 20 29  pWin->eType==0 )
4510: 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 20  {.    Window *p 
4520: 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70 50 61  = windowFind(pPa
4530: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e  rse, pList, pWin
4540: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
4550: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
4560: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
4570: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
4580: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
4590: 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  e->db, p->pParti
45a0: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57  tion, 0);.    pW
45b0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
45c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
45d0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  p(pParse->db, p-
45e0: 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  >pOrderBy, 0);. 
45f0: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4600: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4610: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
4620: 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  pStart, 0);.    
4630: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
4640: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
4650: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c  se->db, p->pEnd,
4660: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65   0);.    pWin->e
4670: 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
4680: 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e  t;.    pWin->eEn
4690: 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
46a0: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70   pWin->eType = p
46b0: 2d 3e 65 54 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ->eType;.  }else
46c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  {.    sqlite3Win
46d0: 64 6f 77 43 68 61 69 6e 28 70 50 61 72 73 65 2c  dowChain(pParse,
46e0: 20 70 57 69 6e 2c 20 70 4c 69 73 74 29 3b 0a 20   pWin, pList);. 
46f0: 20 7d 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e   }.  if( pFunc->
4700: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
4710: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29  TE_FUNC_WINDOW )
4720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
4730: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4740: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
4750: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  ilter ){.      s
4760: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4770: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
4780: 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65    "FILTER clause
4790: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
47a0: 64 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  d with aggregate
47b0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
47c0: 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  s".      );.    
47d0: 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 46  }else.    if( pF
47e0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77 5f  unc->zName==row_
47f0: 6e 75 6d 62 65 72 4e 61 6d 65 20 7c 7c 20 70 46  numberName || pF
4800: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 69 6c  unc->zName==ntil
4810: 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  eName ){.      s
4820: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4830: 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72  (db, pWin->pStar
4840: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4850: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4860: 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  pWin->pEnd);.   
4870: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4880: 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30  = pWin->pEnd = 0
4890: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54  ;.      pWin->eT
48a0: 79 70 65 20 3d 20 54 4b 5f 52 4f 57 53 3b 0a 20  ype = TK_ROWS;. 
48b0: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
48c0: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
48d0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
48e0: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
48f0: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
4900: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
4910: 3d 3d 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65  ==dense_rankName
4920: 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65   || pFunc->zName
4930: 3d 3d 72 61 6e 6b 4e 61 6d 65 0a 20 20 20 20 20  ==rankName.     
4940: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
4950: 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d  =percent_rankNam
4960: 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d  e || pFunc->zNam
4970: 65 3d 3d 63 75 6d 65 5f 64 69 73 74 4e 61 6d 65  e==cume_distName
4980: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
4990: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
49a0: 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72 74  db, pWin->pStart
49b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
49c0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
49d0: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
49e0: 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d    pWin->pStart =
49f0: 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b   pWin->pEnd = 0;
4a00: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54 79  .      pWin->eTy
4a10: 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45 3b 0a 20  pe = TK_RANGE;. 
4a20: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
4a30: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
4a40: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
4a50: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
4a60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 69  .    }.  }.  pWi
4a70: 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  n->pFunc = pFunc
4a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
4a90: 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  xt object passed
4aa0: 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74 65 33   through sqlite3
4ab0: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29 20 74  WalkExprList() t
4ac0: 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e 64 6f  o.** selectWindo
4ad0: 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28 29  wRewriteExprCb()
4ae0: 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77   by selectWindow
4af0: 52 65 77 72 69 74 65 45 4c 69 73 74 28 29 2e 0a  RewriteEList()..
4b00: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
4b10: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
4b20: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b 0a 73  WindowRewrite;.s
4b30: 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72  truct WindowRewr
4b40: 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ite {.  Window *
4b50: 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73 74 20  pWin;.  SrcList 
4b60: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
4b70: 74 20 2a 70 53 75 62 3b 0a 20 20 53 65 6c 65 63  t *pSub;.  Selec
4b80: 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b 20 20  t *pSubSelect;  
4b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4ba0: 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65 63 74  rrent sub-select
4bb0: 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b 0a 0a  , if any */.};..
4bc0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66  /*.** Callback f
4bd0: 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20  unction used by 
4be0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
4bf0: 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66 20 6e  iteEList(). If n
4c00: 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74 68 69  ecessary,.** thi
4c10: 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
4c20: 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ds to the output
4c30: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
4c40: 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a 2a 2a   and updates .**
4c50: 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a 70 70   expression (*pp
4c60: 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65 2e 0a  Expr) in place..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
4c80: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
4c90: 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
4ca0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
4cb0: 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74 20  Expr){.  struct 
4cc0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a 70  WindowRewrite *p
4cd0: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52   = pWalker->u.pR
4ce0: 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65 20  ewrite;.  Parse 
4cf0: 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
4d00: 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a  r->pParse;..  /*
4d10: 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
4d20: 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
4d30: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  d from within a 
4d40: 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63  scalar sub-selec
4d50: 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73 65 64  t.  ** that used
4d60: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
4d70: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
4d80: 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79 20 70  rocessed, only p
4d90: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b 5f 43  rocess.  ** TK_C
4da0: 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
4db0: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
4dc0: 69 74 20 28 74 68 65 20 6f 75 74 65 72 20 53 45  it (the outer SE
4dd0: 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a 20 6e  LECT). Do.  ** n
4de0: 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67 72 65  ot process aggre
4df0: 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f 77 20  gates or window 
4e00: 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  functions at all
4e10: 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f 6e 67  , as they belong
4e20: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 63 61  .  ** to the sca
4e30: 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  lar sub-select. 
4e40: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 75   */.  if( p->pSu
4e50: 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 69  bSelect ){.    i
4e60: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
4e70: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
4e80: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
4e90: 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  inue;.    }else{
4ea0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72 63 20  .      int nSrc 
4eb0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  = p->pSrc->nSrc;
4ec0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
4ed0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
4ee0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
4ef0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
4f00: 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d 3e 61  able==p->pSrc->a
4f10: 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
4f20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4f30: 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63 20 29     if( i==nSrc )
4f40: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
4f50: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  inue;.    }.  }.
4f60: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
4f70: 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63 61 73  ->op ){..    cas
4f80: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
4f90: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
4fa0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
4fb0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
4fc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4fd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4fe0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
4ff0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 57  ;.        for(pW
5000: 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e  in=p->pWin; pWin
5010: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
5020: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20  xtWin){.        
5030: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79 2e 70    if( pExpr->y.p
5040: 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20 20  Win==pWin ){.   
5050: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
5060: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70   pWin->pOwner==p
5070: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
5080: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
5090: 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rune;.          
50a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
50b0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
50c0: 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a  l through.  */..
50d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
50e0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
50f0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
5100: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
5110: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5120: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
5130: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  xpr, 0);.      p
5140: 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  ->pSub = sqlite3
5150: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
5160: 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62 2c 20  Parse, p->pSub, 
5170: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
5180: 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20 20 20   p->pSub ){.    
5190: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
51a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
51b0: 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d 3d 30  r, EP_Static)==0
51c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
51d0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
51e0: 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20  r, EP_Static);. 
51f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5200: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
5210: 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  >db, pExpr);.   
5220: 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72       ExprClearPr
5230: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5240: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
5250: 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72 2c 20    memset(pExpr, 
5260: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
5270: 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ;..        pExpr
5280: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
5290: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
52a0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53  >iColumn = p->pS
52b0: 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20  ub->nExpr-1;.   
52c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
52d0: 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69 45  le = p->pWin->iE
52e0: 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d 0a 0a  phCsr;.      }..
52f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5300: 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
5310: 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
5320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5330: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
5340: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
5350: 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52  nt selectWindowR
5360: 65 77 72 69 74 65 53 65 6c 65 63 74 43 62 28 57  ewriteSelectCb(W
5370: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
5380: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
5390: 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f  {.  struct Windo
53a0: 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20 70 57  wRewrite *p = pW
53b0: 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72 69 74  alker->u.pRewrit
53c0: 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 61  e;.  Select *pSa
53d0: 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65 6c 65  ve = p->pSubSele
53e0: 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76 65 3d  ct;.  if( pSave=
53f0: 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  =pSelect ){.    
5400: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
5410: 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nue;.  }else{.  
5420: 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20    p->pSubSelect 
5430: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 73  = pSelect;.    s
5440: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
5450: 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63  (pWalker, pSelec
5460: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75 62 53  t);.    p->pSubS
5470: 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b 0a 20  elect = pSave;. 
5480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
5490: 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Prune;.}.../*.**
54a0: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
54b0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
54c0: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c   in expression-l
54d0: 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f 72 20  ist pEList. For 
54e0: 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  each:.**.**   * 
54f0: 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20 20  TK_COLUMN,.**   
5500: 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
5510: 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  tion, or.**   * 
5520: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
5530: 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20 6f 62  with a Window ob
5540: 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e 6f 74  ject that is not
5550: 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65   a member of the
5560: 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f 77 20   .**     Window 
5570: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
5580: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
5590: 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a 2a 2a  nt (pWin)..**.**
55a0: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65   Append the node
55b0: 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70 72 65   to output expre
55c0: 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70 70 53  ssion-list (*ppS
55d0: 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61 63 65  ub). And replace
55e0: 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20 54 4b   it.** with a TK
55f0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 61  _COLUMN that rea
5600: 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68 20 65  ds the (N-1)th e
5610: 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c 65 20  lement of table 
5620: 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68 43 73  .** pWin->iEphCs
5630: 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  r, where N is th
5640: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
5650: 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75 62 29  ents in (*ppSub)
5660: 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65 6e 64   after.** append
5670: 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e  ing the new one.
5680: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5690: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
56a0: 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72 73  iteEList(.  Pars
56b0: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69  e *pParse, .  Wi
56c0: 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 53 72  ndow *pWin,.  Sr
56d0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20 20 45  cList *pSrc,.  E
56e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5700: 2a 20 52 65 77 72 69 74 65 20 65 78 70 72 65 73  * Rewrite expres
5710: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c 69  sions in this li
5720: 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  st */.  ExprList
5730: 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20 20   **ppSub        
5740: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
5750: 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65 78  T: Sub-select ex
5760: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f  pression-list */
5770: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  .){.  Walker sWa
5780: 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65  lker;.  WindowRe
5790: 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b 0a  write sRewrite;.
57a0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
57b0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61  er, 0, sizeof(Wa
57c0: 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  lker));.  memset
57d0: 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73  (&sRewrite, 0, s
57e0: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72  izeof(WindowRewr
57f0: 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69  ite));..  sRewri
5800: 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62  te.pSub = *ppSub
5810: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69  ;.  sRewrite.pWi
5820: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52 65 77  n = pWin;.  sRew
5830: 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53 72 63  rite.pSrc = pSrc
5840: 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  ;..  sWalker.pPa
5850: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
5860: 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c  sWalker.xExprCal
5870: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69  lback = selectWi
5880: 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43  ndowRewriteExprC
5890: 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53 65  b;.  sWalker.xSe
58a0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
58b0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
58c0: 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73 57  teSelectCb;.  sW
58d0: 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74 65  alker.u.pRewrite
58e0: 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a 20   = &sRewrite;.. 
58f0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61   (void)sqlite3Wa
5900: 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61 6c  lkExprList(&sWal
5910: 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a 20  ker, pEList);.. 
5920: 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72 69   *ppSub = sRewri
5930: 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  te.pSub;.}../*.*
5940: 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70 79 20  * Append a copy 
5950: 6f 66 20 65 61 63 68 20 65 78 70 72 65 73 73 69  of each expressi
5960: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
5970: 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20 74 6f  -list pAppend to
5980: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
5990: 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74 75 72  ist pList. Retur
59a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
59b0: 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  he result list..
59c0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 4c 69  */.static ExprLi
59d0: 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70 70 65  st *exprListAppe
59e0: 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  ndList(.  Parse 
59f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5a00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
5a10: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
5a20: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
5a30: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
5a40: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
5a50: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
5a60: 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70 70 65   ExprList *pAppe
5a70: 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  nd       /* List
5a80: 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61 70   of values to ap
5a90: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
5aa0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
5ab0: 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20 69  pAppend ){.    i
5ac0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 49  nt i;.    int nI
5ad0: 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  nit = pList ? pL
5ae0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
5af0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5b00: 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b 20 69  Append->nExpr; i
5b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
5b20: 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45  *pDup = sqlite3E
5b30: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5b40: 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69 5d  b, pAppend->a[i]
5b50: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
5b60: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5b70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5b80: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
5b90: 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Dup);.      if( 
5ba0: 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e 61  pList ) pList->a
5bb0: 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f 72  [nInit+i].sortOr
5bc0: 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e 61  der = pAppend->a
5bd0: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
5be0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5bf0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
5c00: 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
5c10: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5c20: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
5c30: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
5c40: 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20 53   invoke.** any S
5c50: 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  QL window functi
5c60: 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ons, this functi
5c70: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
5c80: 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a 2a  therwise, it .**
5c90: 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53 45   rewrites the SE
5ca0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 73  LECT statement s
5cb0: 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66 75  o that window fu
5cc0: 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75 6e  nction xStep fun
5cd0: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69 6e  ctions.** are in
5ce0: 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f 72  voked in the cor
5cf0: 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64 65  rect order as de
5d00: 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22 53  scribed under "S
5d10: 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47 22  ELECT REWRITING"
5d20: 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20 6f  .** at the top o
5d30: 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a  f this file..*/.
5d40: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  int sqlite3Windo
5d50: 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20 2a  wRewrite(Parse *
5d60: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
5d70: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
5d80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5d90: 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e 70 50  p->pWin && p->pP
5da0: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 56  rior==0 ){.    V
5db0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
5dc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
5dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
5de0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5df0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
5e00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5e10: 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
5e20: 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
5e30: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
5e40: 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72  .    Expr *pWher
5e50: 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
5e60: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72     ExprList *pGr
5e70: 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
5e80: 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pBy;.    Expr *p
5e90: 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
5ea0: 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ing;.    ExprLis
5eb0: 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a 20  t *pSort = 0;.. 
5ec0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75     ExprList *pSu
5ed0: 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  blist = 0;      
5ee0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c   /* Expression l
5ef0: 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65 72  ist for sub-quer
5f00: 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20  y */.    Window 
5f10: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
5f20: 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72  ;      /* Master
5f30: 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 2a   window object *
5f40: 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57  /.    Window *pW
5f50: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
5f60: 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f 62      /* Window ob
5f70: 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  ject iterator */
5f80: 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ..    p->pSrc = 
5f90: 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  0;.    p->pWhere
5fa0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72   = 0;.    p->pGr
5fb0: 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  oupBy = 0;.    p
5fc0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 0a  ->pHaving = 0;..
5fd0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
5fe0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
5ff0: 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d 73 65  e for the sub-se
6000: 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 74 68  lect. This is th
6010: 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a  e concatenation.
6020: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 77 69      ** of the wi
6030: 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e 20 61  ndow PARTITION a
6040: 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  nd ORDER BY clau
6050: 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20 74 68  ses. Then, if th
6060: 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20 20 20  is makes it.    
6070: 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20 72 65  ** redundant, re
6080: 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20 42  move the ORDER B
6090: 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  Y from the paren
60a0: 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a 20 20  t SELECT.  */.  
60b0: 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69 74 65    pSort = sqlite
60c0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
60d0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
60e0: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53 6f 72  on, 0);.    pSor
60f0: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
6100: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
6110: 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72  Sort, pMWin->pOr
6120: 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
6130: 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f 72 64  pSort && p->pOrd
6140: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
6150: 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
6160: 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 2c 20  tCompare(pSort, 
6170: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  p->pOrderBy, -1)
6180: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
6190: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
61a0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
61b0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70  erBy);.        p
61c0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
61d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
61e0: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 63     /* Assign a c
61f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
6200: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
6210: 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75 66  able used to buf
6220: 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a  fer rows..    **
6230: 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   The OpenEphemer
6240: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  al instruction i
6250: 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20 61  s coded later, a
6260: 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e  fter it is known
6270: 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   how.    ** many
6280: 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61 62   columns the tab
6290: 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a  le will have.  *
62a0: 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70  /.    pMWin->iEp
62b0: 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  hCsr = pParse->n
62c0: 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73  Tab++;.    pPars
62d0: 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 0a 20  e->nTab += 3;.. 
62e0: 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52     selectWindowR
62f0: 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72  ewriteEList(pPar
6300: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c  se, pMWin, pSrc,
6310: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 53 75   p->pEList, &pSu
6320: 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65 6c 65  blist);.    sele
6330: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
6340: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57  List(pParse, pMW
6350: 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 4f 72  in, pSrc, p->pOr
6360: 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74  derBy, &pSublist
6370: 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42  );.    pMWin->nB
6380: 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62  ufferCol = (pSub
6390: 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d  list ? pSublist-
63a0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20  >nExpr : 0);..  
63b0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
63c0: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e 64  PARTITION BY and
63d0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
63e0: 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74 6f 20  sions to the to 
63f0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
6400: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
6410: 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72 65  n list. They are
6420: 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 67   required to fig
6430: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 0a 20  ure out where . 
6440: 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69 65 73     ** boundaries
6450: 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20   for partitions 
6460: 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65 72  and sets of peer
6470: 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f 0a 20   rows lie.  */. 
6480: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78     pSublist = ex
6490: 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74  prListAppendList
64a0: 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73  (pParse, pSublis
64b0: 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  t, pMWin->pParti
64c0: 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75 62 6c  tion);.    pSubl
64d0: 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ist = exprListAp
64e0: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
64f0: 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e   pSublist, pMWin
6500: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  ->pOrderBy);..  
6510: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
6520: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
6530: 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20   to each window 
6540: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a  function to the.
6550: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
6560: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
6570: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
6580: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66   two registers f
6590: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77  or each.    ** w
65a0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d  indow function -
65b0: 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63   one for the acc
65c0: 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65  umulator, anothe
65d0: 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20  r for interim.  
65e0: 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a    ** results.  *
65f0: 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70  /.    for(pWin=p
6600: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
6610: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
6620: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41  {.      pWin->iA
6630: 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73  rgCol = (pSublis
6640: 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45  t ? pSublist->nE
6650: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
6660: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
6670: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
6680: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
6690: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
66a0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
66b0: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
66c0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
66d0: 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  *pFilter = sqlit
66e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
66f0: 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b  in->pFilter, 0);
6700: 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c 69 73  .        pSublis
6710: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
6720: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
6730: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69 6c  , pSublist, pFil
6740: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
6750: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63      pWin->regAcc
6760: 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  um = ++pParse->n
6770: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Mem;.      pWin-
6780: 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70  >regResult = ++p
6790: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
67a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
67b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
67c0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
67d0: 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  um);.    }..    
67e0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
67f0: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 50 41  o ORDER BY or PA
6800: 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61 75 73  RTITION BY claus
6810: 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e 64 6f  e, and the windo
6820: 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  w.    ** functio
6830: 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f 20 61  n accepts zero a
6840: 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68  rguments, and th
6850: 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72  ere are no other
6860: 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20   columns.    ** 
6870: 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e 20 22  selected (e.g. "
6880: 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65  SELECT row_numbe
6890: 72 28 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d  r() OVER () FROM
68a0: 20 74 31 22 29 2c 20 69 74 20 69 73 20 70 6f 73   t1"), it is pos
68b0: 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61  sible.    ** tha
68c0: 74 20 70 53 75 62 6c 69 73 74 20 69 73 20 73 74  t pSublist is st
68d0: 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e 20 41  ill NULL here. A
68e0: 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  dd a constant ex
68f0: 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20 74 6f  pression here to
6900: 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20 65 76   .    ** keep ev
6910: 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c 20 69  erything legal i
6920: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a 20 20  n this case. .  
6930: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
6940: 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  blist==0 ){.    
6950: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c    pSublist = sql
6960: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6970: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
6980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6990: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
69a0: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
69b0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
69c0: 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
69d0: 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20 73 71  }..    pSub = sq
69e0: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
69f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
6a00: 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63 2c 20  pSublist, pSrc, 
6a10: 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
6a20: 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f 72 74  , pHaving, pSort
6a30: 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
6a40: 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
6a50: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
6a60: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
6a70: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  );.    if( p->pS
6a80: 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  rc ){.      p->p
6a90: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
6aa0: 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20 20  t = pSub;.      
6ab0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
6ac0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
6ad0: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  se, p->pSrc);.  
6ae0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6af0: 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50  xpandSubquery(pP
6b00: 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e  arse, &p->pSrc->
6b10: 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  a[0]) ){.       
6b20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6b30: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
6b40: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73  .        pSub->s
6b50: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
6b60: 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 20 20  panded;.        
6b70: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
6b80: 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
6b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
6ba0: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
6bb0: 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSub, 0);.      
6bc0: 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6be0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
6bf0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
6c00: 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 29  pSublist->nExpr)
6c10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6c20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6c30: 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e  OpenDup, pMWin->
6c40: 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57 69 6e  iEphCsr+1, pMWin
6c50: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
6c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c70: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
6c80: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
6c90: 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  r+2, pMWin->iEph
6ca0: 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Csr);.      sqli
6cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6cc0: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57   OP_OpenDup, pMW
6cd0: 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c 20 70  in->iEphCsr+3, p
6ce0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
6cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
6d10: 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  lete(db, pSub);.
6d20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
6d30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6d40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6d50: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  EM;.  }..  retur
6d60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
6d70: 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f  ree the Window o
6d80: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
6d90: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6da0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
6db0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
6dc0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
6dd0: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndow *p){.  if( 
6de0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6df0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6e00: 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  ->pFilter);.    
6e10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6e20: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
6e30: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
6e40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6e50: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
6e60: 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
6e70: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6e80: 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71  p->pEnd);.    sq
6e90: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6ea0: 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a  db, p->pStart);.
6eb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6ec0: 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  e(db, p->zName);
6ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6ee0: 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73 65 29  ee(db, p->zBase)
6ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
6f00: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
6f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
6f20: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
6f30: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20   Window objects 
6f40: 73 74 61 72 74 69 6e 67 20 61 74 20 74 68 65 20  starting at the 
6f50: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
6f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6f70: 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65  WindowListDelete
6f80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
6f90: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c  ndow *p){.  whil
6fa0: 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64  e( p ){.    Wind
6fb0: 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ow *pNext = p->p
6fc0: 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c  NextWin;.    sql
6fd0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
6fe0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  (db, p);.    p =
6ff0: 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pNext;.  }.}../
7000: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
7010: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
7020: 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f 72 20  an PRECEDING or 
7030: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74  FOLLOWING offset
7040: 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  .  The.** value 
7050: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d  should be a non-
7060: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
7070: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
7080: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73  is not a.** cons
7090: 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69 74 20  tant, change it 
70a0: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61  to NULL.  The fa
70b0: 63 74 20 74 68 61 74 20 69 74 20 69 73 20 74 68  ct that it is th
70c0: 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  en a non-negativ
70d0: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77 69 6c  e.** integer wil
70e0: 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61 74 65  l be caught late
70f0: 72 2e 20 20 42 75 74 20 69 74 20 69 73 20 69 6d  r.  But it is im
7100: 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c  portant not to l
7110: 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65  eave.** variable
7120: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 65   values in the e
7130: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
7140: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
7150: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66  sqlite3WindowOff
7160: 73 65 74 45 78 70 72 28 50 61 72 73 65 20 2a 70  setExpr(Parse *p
7170: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7180: 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71  pr){.  if( 0==sq
7190: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
71a0: 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
71b0: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
71c0: 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33  OBJECT ) sqlite3
71d0: 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28  RenameExprUnmap(
71e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
71f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7200: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7210: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 70 45  , pExpr);.    pE
7220: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7230: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
7240: 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  b, TK_NULL, 0, 0
7250: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7260: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
7270: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
7280: 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64 6f 77  urn a new Window
7290: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   object describi
72a0: 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65 66 69  ng a Window Defi
72b0: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f  nition..*/.Windo
72c0: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
72d0: 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65 20 2a  Alloc(.  Parse *
72e0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
72f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
7300: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
7310: 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 79       /* Frame ty
7320: 70 65 2e 20 54 4b 5f 52 41 4e 47 45 20 6f 72 20  pe. TK_RANGE or 
7330: 54 4b 5f 52 4f 57 53 20 2a 2f 0a 20 20 69 6e 74  TK_ROWS */.  int
7340: 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20 2f   eStart,       /
7350: 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43 55  * Start type: CU
7360: 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e 47  RRENT, PRECEDING
7370: 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42  , FOLLOWING, UNB
7380: 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70 72  OUNDED */.  Expr
7390: 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
73a0: 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73 69   Start window si
73b0: 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44 49  ze if TK_PRECEDI
73c0: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
73d0: 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 20  */.  int eEnd,  
73e0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 79         /* End ty
73f0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c  pe: CURRENT, FOL
7400: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
7410: 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47 20  NDED, PRECEDING 
7420: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64 20  */.  Expr *pEnd 
7430: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77 69         /* End wi
7440: 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f  ndow size if TK_
7450: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45  FOLLOWING or PRE
7460: 43 45 44 49 4e 47 20 2a 2f 0a 29 7b 0a 20 20 57  CEDING */.){.  W
7470: 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 30 3b  indow *pWin = 0;
7480: 0a 20 20 69 6e 74 20 62 49 6d 70 6c 69 63 69 74  .  int bImplicit
7490: 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Frame = 0;..  /*
74a0: 20 50 61 72 73 65 72 20 61 73 73 75 72 65 73 20   Parser assures 
74b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
74c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
74d0: 65 3d 3d 30 20 7c 7c 20 65 54 79 70 65 3d 3d 54  e==0 || eType==T
74e0: 4b 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70 65  K_RANGE || eType
74f0: 3d 3d 54 4b 5f 52 4f 57 53 20 29 3b 0a 20 20 61  ==TK_ROWS );.  a
7500: 73 73 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54  ssert( eStart==T
7510: 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74  K_CURRENT || eSt
7520: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
7530: 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  G.           || 
7540: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
7550: 4e 44 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d  NDED || eStart==
7560: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a  TK_FOLLOWING );.
7570: 20 20 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d    assert( eEnd==
7580: 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45  TK_CURRENT || eE
7590: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
75a0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
75b0: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
75c0: 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  D || eEnd==TK_PR
75d0: 45 43 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73  ECEDING );.  ass
75e0: 65 72 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b  ert( (eStart==TK
75f0: 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53  _PRECEDING || eS
7600: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
7610: 4e 47 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29  NG)==(pStart!=0)
7620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65   );.  assert( (e
7630: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
7640: 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  G || eEnd==TK_PR
7650: 45 43 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21  ECEDING)==(pEnd!
7660: 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 65 54  =0) );..  if( eT
7670: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 49  ype==0 ){.    bI
7680: 6d 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 31  mplicitFrame = 1
7690: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 54 4b  ;.    eType = TK
76a0: 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f  _RANGE;.  }..  /
76b0: 2a 20 49 66 20 61 20 66 72 61 6d 65 20 69 73 20  * If a frame is 
76c0: 64 65 63 6c 61 72 65 64 20 22 52 41 4e 47 45 22  declared "RANGE"
76d0: 20 28 6e 6f 74 20 22 52 4f 57 53 22 29 2c 20 74   (not "ROWS"), t
76e0: 68 65 6e 20 69 74 20 6d 61 79 20 6e 6f 74 20 75  hen it may not u
76f0: 73 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 22  se.  ** either "
7700: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
7710: 22 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c  " or "<expr> FOL
7720: 4c 4f 57 49 4e 47 22 2e 0a 20 20 2a 2f 0a 20 20  LOWING"..  */.  
7730: 69 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41  if( eType==TK_RA
7740: 4e 47 45 20 26 26 20 28 70 53 74 61 72 74 21 3d  NGE && (pStart!=
7750: 30 20 7c 7c 20 70 45 6e 64 21 3d 30 29 20 29 7b  0 || pEnd!=0) ){
7760: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7770: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 52 41  rMsg(pParse, "RA
7780: 4e 47 45 20 6d 75 73 74 20 75 73 65 20 6f 6e 6c  NGE must use onl
7790: 79 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20 43  y UNBOUNDED or C
77a0: 55 52 52 45 4e 54 20 52 4f 57 22 29 3b 0a 20 20  URRENT ROW");.  
77b0: 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c    goto windowAll
77c0: 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ocErr;.  }..  /*
77d0: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
77e0: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  he.  ** starting
77f0: 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d   boundary type m
7800: 61 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72  ay not occur ear
7810: 6c 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c  lier in the foll
7820: 6f 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a  owing list than.
7830: 20 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20    ** the ending 
7840: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20  boundary type:. 
7850: 20 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55   **.  **   UNBOU
7860: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20  NDED PRECEDING. 
7870: 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45   **   <expr> PRE
7880: 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55  CEDING.  **   CU
7890: 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20  RRENT ROW.  **  
78a0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
78b0: 47 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44  G.  **   UNBOUND
78c0: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  ED FOLLOWING.  *
78d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65  *.  ** The parse
78e0: 72 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22  r ensures that "
78f0: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
7900: 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75  ING" cannot be u
7910: 73 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67  sed as an ending
7920: 0a 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20  .  ** boundary, 
7930: 61 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e  and than "UNBOUN
7940: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63  DED FOLLOWING" c
7950: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73  annot be used as
7960: 20 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a   a starting.  **
7970: 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e   frame boundary.
7980: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74  .  */.  if( (eSt
7990: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
79a0: 26 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  && eEnd==TK_PREC
79b0: 45 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53  EDING).   || (eS
79c0: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
79d0: 4e 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f  NG && (eEnd==TK_
79e0: 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e  PRECEDING || eEn
79f0: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a  d==TK_CURRENT)).
7a00: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
7a10: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7a20: 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72   "unsupported fr
7a30: 61 6d 65 20 64 65 6c 69 6d 69 74 65 72 20 66 6f  ame delimiter fo
7a40: 72 20 52 4f 57 53 22 29 3b 0a 20 20 20 20 67 6f  r ROWS");.    go
7a50: 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72  to windowAllocEr
7a60: 72 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e 20 3d  r;.  }..  pWin =
7a70: 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65   (Window*)sqlite
7a80: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
7a90: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
7aa0: 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28  (Window));.  if(
7ab0: 20 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20   pWin==0 ) goto 
7ac0: 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a  windowAllocErr;.
7ad0: 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20    pWin->eType = 
7ae0: 65 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65  eType;.  pWin->e
7af0: 53 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b 0a  Start = eStart;.
7b00: 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65    pWin->eEnd = e
7b10: 45 6e 64 3b 0a 20 20 70 57 69 6e 2d 3e 62 49 6d  End;.  pWin->bIm
7b20: 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 62 49  plicitFrame = bI
7b30: 6d 70 6c 69 63 69 74 46 72 61 6d 65 3b 0a 20 20  mplicitFrame;.  
7b40: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
7b50: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
7b60: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 6e  Expr(pParse, pEn
7b70: 64 29 3b 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61  d);.  pWin->pSta
7b80: 72 74 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  rt = sqlite3Wind
7b90: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61  owOffsetExpr(pPa
7ba0: 72 73 65 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  rse, pStart);.  
7bb0: 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69  return pWin;..wi
7bc0: 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20  ndowAllocErr:.  
7bd0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7be0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  e(pParse->db, pE
7bf0: 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  nd);.  sqlite3Ex
7c00: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
7c10: 3e 64 62 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  >db, pStart);.  
7c20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7c30: 2a 2a 20 41 74 74 61 63 68 20 50 41 52 54 49 54  ** Attach PARTIT
7c40: 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59  ION and ORDER BY
7c50: 20 63 6c 61 75 73 65 73 20 70 50 61 72 74 69 74   clauses pPartit
7c60: 69 6f 6e 20 61 6e 64 20 70 4f 72 64 65 72 42 79  ion and pOrderBy
7c70: 20 74 6f 20 77 69 6e 64 6f 77 0a 2a 2a 20 70 57   to window.** pW
7c80: 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 70 61 72  in. Also, if par
7c90: 61 6d 65 74 65 72 20 70 42 61 73 65 20 69 73 20  ameter pBase is 
7ca0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 70 57  not NULL, set pW
7cb0: 69 6e 2d 3e 7a 42 61 73 65 20 74 6f 20 74 68 65  in->zBase to the
7cc0: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  .** equivalent n
7cd0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
7ce0: 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ring..*/.Window 
7cf0: 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 73  *sqlite3WindowAs
7d00: 73 65 6d 62 6c 65 28 0a 20 20 50 61 72 73 65 20  semble(.  Parse 
7d10: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
7d20: 6f 77 20 2a 70 57 69 6e 2c 20 0a 20 20 45 78 70  ow *pWin, .  Exp
7d30: 72 4c 69 73 74 20 2a 70 50 61 72 74 69 74 69 6f  rList *pPartitio
7d40: 6e 2c 20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  n, .  ExprList *
7d50: 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 54 6f 6b  pOrderBy, .  Tok
7d60: 65 6e 20 2a 70 42 61 73 65 0a 29 7b 0a 20 20 69  en *pBase.){.  i
7d70: 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 70  f( pWin ){.    p
7d80: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
7d90: 3d 20 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  = pPartition;.  
7da0: 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79    pWin->pOrderBy
7db0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
7dc0: 20 69 66 28 20 70 42 61 73 65 20 29 7b 0a 20 20   if( pBase ){.  
7dd0: 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20      pWin->zBase 
7de0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
7df0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
7e00: 42 61 73 65 2d 3e 7a 2c 20 70 42 61 73 65 2d 3e  Base->z, pBase->
7e10: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
7e20: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
7e30: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
7e40: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 74  rse->db, pPartit
7e50: 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ion);.    sqlite
7e60: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7e70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
7e80: 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  erBy);.  }.  ret
7e90: 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn pWin;.}../*.
7ea0: 2a 2a 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20  ** Window *pWin 
7eb0: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
7ec0: 65 61 74 65 64 20 66 72 6f 6d 20 61 20 57 49 4e  eated from a WIN
7ed0: 44 4f 57 20 63 6c 61 75 73 65 2e 20 54 6f 6b 6e  DOW clause. Tokn
7ee0: 65 20 70 42 61 73 65 0a 2a 2a 20 69 73 20 74 68  e pBase.** is th
7ef0: 65 20 62 61 73 65 20 77 69 6e 64 6f 77 2e 20 45  e base window. E
7f00: 61 72 6c 69 65 72 20 77 69 6e 64 6f 77 73 20 66  arlier windows f
7f10: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 57 49 4e  rom the same WIN
7f20: 44 4f 57 20 63 6c 61 75 73 65 20 61 72 65 0a 2a  DOW clause are.*
7f30: 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
7f40: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
7f50: 74 69 6e 67 20 61 74 20 70 57 69 6e 2d 3e 70 4e  ting at pWin->pN
7f60: 65 78 74 57 69 6e 2e 20 54 68 69 73 20 66 75 6e  extWin. This fun
7f70: 63 74 69 6f 6e 0a 2a 2a 20 65 69 74 68 65 72 20  ction.** either 
7f80: 75 70 64 61 74 65 73 20 2a 70 57 69 6e 20 61 63  updates *pWin ac
7f90: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 62  cording to the b
7fa0: 61 73 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  ase specificatio
7fb0: 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c 65  n, or else.** le
7fc0: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  aves an error in
7fd0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
7fe0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68   sqlite3WindowCh
7ff0: 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ain(Parse *pPars
8000: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c  e, Window *pWin,
8010: 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 29 7b   Window *pList){
8020: 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 42 61  .  if( pWin->zBa
8030: 73 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  se ){.    sqlite
8040: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8050: 64 62 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  db;.    Window *
8060: 70 45 78 69 73 74 20 3d 20 77 69 6e 64 6f 77 46  pExist = windowF
8070: 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ind(pParse, pLis
8080: 74 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b  t, pWin->zBase);
8090: 0a 20 20 20 20 69 66 28 20 70 45 78 69 73 74 20  .    if( pExist 
80a0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
80b0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
80c0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f       /* Check fo
80d0: 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  r errors */.    
80e0: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 50 61 72    if( pWin->pPar
80f0: 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  tition ){.      
8100: 20 20 7a 45 72 72 20 3d 20 22 50 41 52 54 49 54    zErr = "PARTIT
8110: 49 4f 4e 20 63 6c 61 75 73 65 22 3b 0a 20 20 20  ION clause";.   
8120: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
8130: 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ist->pOrderBy &&
8140: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20   pWin->pOrderBy 
8150: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
8160: 3d 20 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  = "ORDER BY clau
8170: 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  se";.      }else
8180: 20 69 66 28 20 70 45 78 69 73 74 2d 3e 62 49 6d   if( pExist->bIm
8190: 70 6c 69 63 69 74 46 72 61 6d 65 3d 3d 30 20 29  plicitFrame==0 )
81a0: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
81b0: 20 22 66 72 61 6d 65 20 73 70 65 63 69 66 69 63   "frame specific
81c0: 61 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20 7d 0a  ation";.      }.
81d0: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29        if( zErr )
81e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
81f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8200: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
8210: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
8220: 25 73 20 6f 66 20 77 69 6e 64 6f 77 3a 20 25 73  %s of window: %s
8230: 22 2c 20 7a 45 72 72 2c 20 70 57 69 6e 2d 3e 7a  ", zErr, pWin->z
8240: 42 61 73 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Base.        );.
8250: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8260: 20 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74       pWin->pPart
8270: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
8280: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8290: 45 78 69 73 74 2d 3e 70 50 61 72 74 69 74 69 6f  Exist->pPartitio
82a0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  n, 0);.        i
82b0: 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65  f( pExist->pOrde
82c0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
82d0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
82e0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
82f0: 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f          pWin->pO
8300: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
8310: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
8320: 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79  pExist->pOrderBy
8330: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
8340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
8350: 62 46 72 65 65 28 64 62 2c 20 70 57 69 6e 2d 3e  bFree(db, pWin->
8360: 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  zBase);.        
8370: 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 30 3b  pWin->zBase = 0;
8380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8390: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61   }.}../*.** Atta
83a0: 63 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  ch window object
83b0: 20 70 57 69 6e 20 74 6f 20 65 78 70 72 65 73 73   pWin to express
83c0: 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ion p..*/.void s
83d0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61  qlite3WindowAtta
83e0: 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ch(Parse *pParse
83f0: 2c 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f  , Expr *p, Windo
8400: 77 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20  w *pWin){.  if( 
8410: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
8420: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
8430: 49 4f 4e 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ION );.    /* Th
8440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
8450: 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ly called for th
8460: 65 20 70 61 72 73 65 72 2e 20 20 49 66 20 70 57  e parser.  If pW
8470: 69 6e 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a  in was not.    *
8480: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 64 75 65 20  * allocated due 
8490: 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74 68 65 6e 20  to an OOM, then 
84a0: 74 68 65 20 70 61 72 73 65 72 20 77 6f 75 6c 64  the parser would
84b0: 20 66 61 69 6c 20 62 65 66 6f 72 65 20 65 76 65   fail before eve
84c0: 72 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 69 6e  r.    ** invokin
84d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  g this routine *
84e0: 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  /.    if( ALWAYS
84f0: 28 70 57 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  (pWin) ){.      
8500: 70 2d 3e 79 2e 70 57 69 6e 20 3d 20 70 57 69 6e  p->y.pWin = pWin
8510: 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 50  ;.      ExprSetP
8520: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
8530: 6e 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 70 57  nFunc);.      pW
8540: 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 3b 0a  in->pOwner = p;.
8550: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
8560: 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
8570: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8580: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8590: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  se,.           "
85a0: 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f 74 20  DISTINCT is not 
85b0: 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 77 69  supported for wi
85c0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22 29  ndow functions")
85d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
85e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
85f0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
8600: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 69  (pParse->db, pWi
8610: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
8620: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
8630: 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65   two window obje
8640: 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  cts are identica
8650: 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  l, or non-zero o
8660: 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65  therwise..** Ide
8670: 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62  ntical window ob
8680: 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70 72 6f  jects can be pro
8690: 63 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e 67  cessed in a sing
86a0: 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20  le scan..*/.int 
86b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d  sqlite3WindowCom
86c0: 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
86d0: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20  se, Window *p1, 
86e0: 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69  Window *p2){.  i
86f0: 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d 70 32  f( p1->eType!=p2
8700: 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75 72 6e  ->eType ) return
8710: 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 53   1;.  if( p1->eS
8720: 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61 72 74  tart!=p2->eStart
8730: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
8740: 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70 32 2d  f( p1->eEnd!=p2-
8750: 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e 20 31  >eEnd ) return 1
8760: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
8770: 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
8780: 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c 20 70  e, p1->pStart, p
8790: 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29 20 29  2->pStart, -1) )
87a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
87b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
87c0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e  are(pParse, p1->
87d0: 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64 2c 20  pEnd, p2->pEnd, 
87e0: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
87f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
8800: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
8810: 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70 32 2d  >pPartition, p2-
8820: 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d 31 29  >pPartition, -1)
8830: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
8840: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
8850: 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 4f  stCompare(p1->pO
8860: 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f 72 64  rderBy, p2->pOrd
8870: 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65 74 75  erBy, -1) ) retu
8880: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
8890: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
88a0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 63 6f   is called by co
88b0: 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 20 62  de in select.c b
88c0: 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73 20 73  efore it calls s
88d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
88e0: 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e 20 69  ().** to begin i
88f0: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
8900: 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 72   the sub-query r
8910: 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20 75 73  esults. It is us
8920: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 2a  ed to allocate.*
8930: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
8940: 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 63   registers and c
8950: 75 72 73 6f 72 73 20 75 73 65 64 20 62 79 20 73  ursors used by s
8960: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
8970: 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Step()..*/.void 
8980: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
8990: 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70 50 61  eInit(Parse *pPa
89a0: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57  rse, Window *pMW
89b0: 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  in){.  Window *p
89c0: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
89d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
89e0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6e  pParse);.  int n
89f0: 50 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d 3e 70  Part = (pMWin->p
8a00: 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d 57 69  Partition ? pMWi
8a10: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e  n->pPartition->n
8a20: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e 50 61  Expr : 0);.  nPa
8a30: 72 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f  rt += (pMWin->pO
8a40: 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e  rderBy ? pMWin->
8a50: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
8a60: 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 50 61 72  : 0);.  if( nPar
8a70: 74 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  t ){.    pMWin->
8a80: 72 65 67 50 61 72 74 20 3d 20 70 50 61 72 73 65  regPart = pParse
8a90: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
8aa0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
8ab0: 61 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  art;.    sqlite3
8ac0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8ad0: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d  _Null, 0, pMWin-
8ae0: 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d  >regPart, pMWin-
8af0: 3e 72 65 67 50 61 72 74 2b 6e 50 61 72 74 2d 31  >regPart+nPart-1
8b00: 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d 57 69 6e 2d  );.  }..  pMWin-
8b10: 3e 72 65 67 46 69 72 73 74 20 3d 20 2b 2b 70 50  >regFirst = ++pP
8b20: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
8b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8b40: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
8b50: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73  , pMWin->regFirs
8b60: 74 29 3b 0a 20 20 70 4d 57 69 6e 2d 3e 72 65 67  t);.  pMWin->reg
8b70: 53 69 7a 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Size = ++pParse-
8b80: 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
8b90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8ba0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57  _Integer, 0, pMW
8bb0: 69 6e 2d 3e 72 65 67 53 69 7a 65 29 3b 0a 0a 20  in->regSize);.. 
8bc0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
8bd0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
8be0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
8bf0: 20 46 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57   FuncDef *p = pW
8c00: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69  in->pFunc;.    i
8c10: 66 28 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73  f( (p->funcFlags
8c20: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
8c30: 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e  INMAX) && pWin->
8c40: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
8c50: 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  NDED ){.      /*
8c60: 20 54 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73   The inline vers
8c70: 69 6f 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e  ions of min() an
8c80: 64 20 6d 61 78 28 29 20 72 65 71 75 69 72 65 20  d max() require 
8c90: 61 20 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72  a single ephemer
8ca0: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  al.      ** tabl
8cb0: 65 20 61 6e 64 20 33 20 72 65 67 69 73 74 65 72  e and 3 register
8cc0: 73 2e 20 54 68 65 20 72 65 67 69 73 74 65 72 73  s. The registers
8cd0: 20 61 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c   are used as fol
8ce0: 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
8cf0: 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70       **   regApp
8d00: 2b 30 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79  +0: slot to copy
8d10: 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67   min()/max() arg
8d20: 75 6d 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b  ument to for Mak
8d30: 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a  eRecord.      **
8d40: 20 20 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74     regApp+1: int
8d50: 65 67 65 72 20 76 61 6c 75 65 20 75 73 65 64 20  eger value used 
8d60: 74 6f 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61  to ensure keys a
8d70: 72 65 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20  re unique.      
8d80: 2a 2a 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f  **   regApp+2: o
8d90: 75 74 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63  utput of MakeRec
8da0: 6f 72 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ord.      */.   
8db0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
8dc0: 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  st = pWin->pOwne
8dd0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
8de0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
8df0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
8e00: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
8e10: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
8e20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69  0, 0);.      pWi
8e30: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
8e40: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
8e50: 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d    pWin->regApp =
8e60: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
8e70: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
8e80: 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20  Mem += 3;.      
8e90: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20  if( pKeyInfo && 
8ea0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61  pWin->pFunc->zNa
8eb0: 6d 65 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20  me[1]=='i' ){.  
8ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
8ed0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
8ee0: 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  er[0]==0 );.    
8ef0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
8f00: 6f 72 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b  ortOrder[0] = 1;
8f10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8f30: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
8f40: 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41  eral, pWin->csrA
8f50: 70 70 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71  pp, 2);.      sq
8f60: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
8f70: 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50  4(v, pKeyInfo, P
8f80: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
8f90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8fa0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
8fb0: 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  r, 0, pWin->regA
8fc0: 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pp+1);.    }.   
8fd0: 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61   else if( p->zNa
8fe0: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
8ff0: 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66  e || p->zName==f
9000: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29  irst_valueName )
9010: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  {.      /* Alloc
9020: 61 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72  ate two register
9030: 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70  s at pWin->regAp
9040: 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65  p. These will be
9050: 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a   used to.      *
9060: 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74 61 72  * store the star
9070: 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20  t and end index 
9080: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  of the current f
9090: 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rame.  */.      
90a0: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69  assert( pMWin->i
90b0: 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20  EphCsr );.      
90c0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
90d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
90e0: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
90f0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
9100: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
9110: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
9120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9130: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
9140: 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  up, pWin->csrApp
9150: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
9160: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
9170: 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d  e if( p->zName==
9180: 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a  leadName || p->z
9190: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b  Name==lagName ){
91a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
91b0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b  MWin->iEphCsr );
91c0: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
91d0: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
91e0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab++;.      sqli
91f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9200: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69   OP_OpenDup, pWi
9210: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
9220: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
9230: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
9240: 20 22 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70   "PRECEDING <exp
9250: 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 30 29 20 6f  r>" (eCond==0) o
9260: 72 20 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78  r "FOLLOWING <ex
9270: 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 31 29 20  pr>" (eCond==1) 
9280: 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
9290: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
92a0: 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61  gument to nth_va
92b0: 6c 75 65 28 29 20 28 65 43 6f 6e 64 3d 3d 32 29  lue() (eCond==2)
92c0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a   has just been.*
92d0: 2a 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  * evaluated and 
92e0: 74 68 65 20 72 65 73 75 6c 74 20 6c 65 66 74 20  the result left 
92f0: 69 6e 20 72 65 67 69 73 74 65 72 20 72 65 67 2e  in register reg.
9300: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   This function g
9310: 65 6e 65 72 61 74 65 73 20 56 4d 0a 2a 2a 20 63  enerates VM.** c
9320: 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61  ode to check tha
9330: 74 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  t the value is a
9340: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
9350: 74 65 67 65 72 20 61 6e 64 20 74 68 72 6f 77 73  teger and throws
9360: 20 61 6e 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e   an.** exception
9370: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a   if it is not..*
9380: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9390: 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75  ndowCheckIntValu
93a0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
93b0: 20 69 6e 74 20 72 65 67 2c 20 69 6e 74 20 65 43   int reg, int eC
93c0: 6f 6e 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ond){.  static c
93d0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 72 72  onst char *azErr
93e0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 66 72 61 6d  [] = {.    "fram
93f0: 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65  e starting offse
9400: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
9410: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
9420: 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e  ",.    "frame en
9430: 64 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74  ding offset must
9440: 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   be a non-negati
9450: 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20  ve integer",.   
9460: 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e   "second argumen
9470: 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 20 6d  t to nth_value m
9480: 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76  ust be a positiv
9490: 65 20 69 6e 74 65 67 65 72 22 0a 20 20 7d 3b 0a  e integer".  };.
94a0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 4f 70    static int aOp
94b0: 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c 20 4f 50  [] = { OP_Ge, OP
94c0: 5f 47 65 2c 20 4f 50 5f 47 74 20 7d 3b 0a 20 20  _Ge, OP_Gt };.  
94d0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
94e0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
94f0: 3b 0a 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20  ;.  int regZero 
9500: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
9510: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61  Reg(pParse);.  a
9520: 73 73 65 72 74 28 20 65 43 6f 6e 64 3d 3d 30 20  ssert( eCond==0 
9530: 7c 7c 20 65 43 6f 6e 64 3d 3d 31 20 7c 7c 20 65  || eCond==1 || e
9540: 43 6f 6e 64 3d 3d 32 20 29 3b 0a 20 20 73 71 6c  Cond==2 );.  sql
9550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9560: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
9570: 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20 73 71 6c   regZero);.  sql
9580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9590: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
95a0: 72 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65  reg, sqlite3Vdbe
95b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
95c0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
95d0: 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29  eIf(v, eCond==0)
95e0: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
95f0: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b  If(v, eCond==1);
9600: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  .  VdbeCoverageI
9610: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a  f(v, eCond==2);.
9620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9630: 4f 70 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e 64  Op3(v, aOp[eCond
9640: 5d 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69  ], regZero, sqli
9650: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
9660: 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20  dr(v)+2, reg);. 
9670: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
9680: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
9690: 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==0);.  VdbeCov
96a0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
96b0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20  (v, eCond==1);. 
96c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
96d0: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
96e0: 64 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  d==2);.  sqlite3
96f0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
9700: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
9710: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
9720: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
9730: 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c  OE_Abort);.  sql
9740: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
9750: 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72  (v, (void*)azErr
9760: 5b 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41 54  [eCond], P4_STAT
9770: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  IC);.  sqlite3Re
9780: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
9790: 72 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d  rse, regZero);.}
97a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
97b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
97c0: 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
97d0: 20 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63   the window-func
97e0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a  tion associated.
97f0: 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65  ** with the obje
9800: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
9810: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
9820: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
9830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9840: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69  indowArgCount(Wi
9850: 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45  ndow *pWin){.  E
9860: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
9870: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
9880: 2e 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  .pList;.  return
9890: 20 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d   (pList ? pList-
98a0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a  >nExpr : 0);.}..
98b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
98c0: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
98d0: 20 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20   either xStep() 
98e0: 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20  (if bInverse is 
98f0: 30 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72  0) or .** xInver
9900: 73 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20  se (if bInverse 
9910: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72  is non-zero) for
9920: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
9930: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a  ction in the .**
9940: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
9950: 72 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20  rting at pMWin. 
9960: 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e  Or, for built-in
9970: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
9980: 73 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74  s.** that do not
9990: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
99a0: 64 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20  d function API, 
99b0: 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71  generate the req
99c0: 75 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20  uired.** inline 
99d0: 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  VM code..**.** I
99e0: 66 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69  f argument csr i
99f0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
9a00: 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68  r equal to 0, th
9a10: 65 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20  en argument reg 
9a20: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
9a30: 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61  register in an a
9a40: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
9a50: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
9a60: 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
9a70: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61  gh to hold the a
9a80: 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
9a90: 73 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74  s for each funct
9aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
9ab0: 65 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e  e.** the argumen
9ac0: 74 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ts are extracted
9ad0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
9ae0: 74 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74  t row of csr int
9af0: 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f  o the.** array o
9b00: 66 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f  f registers befo
9b10: 72 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41  re invoking OP_A
9b20: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67  ggStep or OP_Agg
9b30: 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72  Inverse.**.** Or
9b40: 2c 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73  , if csr is less
9b50: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
9b60: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65   the array of re
9b70: 67 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69  gisters at reg i
9b80: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70  s.** already pop
9b90: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20  ulated with all 
9ba0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
9bb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
9bc0: 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
9bd0: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
9be0: 20 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20   regPartSize is 
9bf0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
9c00: 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  t is a register 
9c10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
9c20: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
9c30: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
9c40: 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  partition..*/.st
9c50: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
9c60: 41 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65  AggStep(.  Parse
9c70: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e   *pParse, .  Win
9c80: 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20  dow *pMWin,     
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ca0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77  Linked list of w
9cb0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
9cc0: 2a 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20  */.  int csr,   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67       /* Read arg
9cf0: 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73  uments from this
9d00: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
9d10: 20 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20   bInverse,      
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d30: 54 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  True to invoke x
9d40: 49 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20  Inverse instead 
9d50: 6f 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e  of xStep */.  in
9d60: 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20  t reg,          
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d80: 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   Array of regist
9d90: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ers */.  int reg
9da0: 50 61 72 74 53 69 7a 65 20 20 20 20 20 20 20 20  PartSize        
9db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
9dc0: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
9dd0: 73 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69 6f  size of partitio
9de0: 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
9df0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9e00: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69  be(pParse);.  Wi
9e10: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f  ndow *pWin;.  fo
9e20: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
9e30: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
9e40: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 6e  NextWin){.    in
9e50: 74 20 66 6c 61 67 73 20 3d 20 70 57 69 6e 2d 3e  t flags = pWin->
9e60: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
9e70: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 72 67  ;.    int regArg
9e80: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d  ;.    int nArg =
9e90: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
9ea0: 70 57 69 6e 29 3b 0a 0a 20 20 20 20 69 66 28 20  pWin);..    if( 
9eb0: 63 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  csr>=0 ){.      
9ec0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
9ed0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
9ee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
9ef0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9f00: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
9f10: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69   pWin->iArgCol+i
9f20: 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20  , reg+i);.      
9f30: 7d 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d  }.      regArg =
9f40: 20 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20   reg;.      if( 
9f50: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
9f60: 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 20  UNC_WINDOW_SIZE 
9f70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
9f80: 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
9f90: 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67      regArg = reg
9fa0: 50 61 72 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  PartSize;.      
9fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9fc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9fd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
9fe0: 2c 20 72 65 67 50 61 72 74 53 69 7a 65 2c 20 72  , regPartSize, r
9ff0: 65 67 2b 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  eg+nArg);.      
a000: 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 72 67    }.        nArg
a010: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
a020: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
a030: 65 72 74 28 20 21 28 66 6c 61 67 73 20 26 20 53  ert( !(flags & S
a040: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
a050: 57 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 20  W_SIZE) );.     
a060: 20 72 65 67 41 72 67 20 3d 20 72 65 67 20 2b 20   regArg = reg + 
a070: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20  pWin->iArgCol;. 
a080: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
a090: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
a0a0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
a0b0: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20  UNC_MINMAX) .   
a0c0: 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61     && pWin->eSta
a0d0: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
a0e0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
a0f0: 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20  nt addrIsNull = 
a100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a110: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
a120: 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56  regArg);.      V
a130: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a140: 20 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72        if( bInver
a150: 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
a160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a170: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
a180: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
a190: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
a1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a1b0: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41  , OP_SCopy, regA
a1c0: 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  rg, pWin->regApp
a1d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a1e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a1f0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
a200: 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20  Win->regApp, 2, 
a210: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b  pWin->regApp+2);
a220: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a230: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a240: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e  _IdxInsert, pWin
a250: 2d 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e  ->csrApp, pWin->
a260: 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20  regApp+2);.     
a270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a290: 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47  4Int(v, OP_SeekG
a2a0: 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  E, pWin->csrApp,
a2b0: 20 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a   0, regArg, 1);.
a2c0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
a2d0: 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
a2e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a2f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
a300: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d  OP_Delete, pWin-
a310: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
a320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
a330: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
a340: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a350: 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v)-2);.      }. 
a360: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a370: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
a380: 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c  IsNull);.    }el
a390: 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67  se if( pWin->reg
a3a0: 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  App ){.      ass
a3b0: 65 72 74 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63  ert( pWin->pFunc
a3c0: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
a3d0: 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20  ueName.         
a3e0: 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63    || pWin->pFunc
a3f0: 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76  ->zName==first_v
a400: 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 29  alueName.      )
a410: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a420: 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c 20 62  bInverse==0 || b
a430: 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a 20 20  Inverse==1 );.  
a440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a450: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
a460: 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  mm, pWin->regApp
a470: 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20 31 29 3b  +1-bInverse, 1);
a480: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
a490: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d  Win->pFunc->zNam
a4a0: 65 3d 3d 6c 65 61 64 4e 61 6d 65 0a 20 20 20 20  e==leadName.    
a4b0: 20 20 20 20 20 20 20 7c 7c 20 70 57 69 6e 2d 3e         || pWin->
a4c0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61  pFunc->zName==la
a4d0: 67 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20  gName.    ){.   
a4e0: 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
a4f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a500: 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30 3b 0a  int addrIf = 0;.
a510: 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e        if( pWin->
a520: 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  pFilter ){.     
a530: 20 20 20 69 6e 74 20 72 65 67 54 6d 70 3b 0a 20     int regTmp;. 
a540: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
a550: 41 72 67 3d 3d 30 20 7c 7c 20 6e 41 72 67 3d 3d  Arg==0 || nArg==
a560: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
a570: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  pList->nExpr );.
a580: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a590: 6e 41 72 67 20 7c 7c 20 70 57 69 6e 2d 3e 70 4f  nArg || pWin->pO
a5a0: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  wner->x.pList==0
a5b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
a5c0: 63 73 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  csr>0 ){.       
a5d0: 20 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69     regTmp = sqli
a5e0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a5f0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
a600: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a610: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
a620: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
a630: 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29  Col+nArg,regTmp)
a640: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a650: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 54 6d  .          regTm
a660: 70 20 3d 20 72 65 67 41 72 67 20 2b 20 6e 41 72  p = regArg + nAr
a670: 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  g;.        }.   
a680: 20 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71       addrIf = sq
a690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a6a0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
a6b0: 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  Tmp, 0, 1);.    
a6c0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a6d0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (v);.        if(
a6e0: 20 63 73 72 3e 30 20 29 7b 0a 20 20 20 20 20 20   csr>0 ){.      
a6f0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
a700: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
a710: 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20  , regTmp);.     
a720: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a730: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75     if( pWin->pFu
a740: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
a750: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
a760: 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
a770: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
a780: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a790: 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 20 20  nArg>0 );.      
a7a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
a7b0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
a7c0: 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77  Parse, pWin->pOw
a7d0: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  ner->x.pList->a[
a7e0: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
a7f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a800: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
a810: 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73  eq, 0,0,0, (cons
a820: 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50  t char*)pColl, P
a830: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
a840: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a850: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 62  3VdbeAddOp3(v, b
a860: 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67 49  Inverse? OP_AggI
a870: 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67 53  nverse : OP_AggS
a880: 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tep, .          
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 49                bI
a8a0: 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c 20  nverse, regArg, 
a8b0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
a8c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a8d0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
a8e0: 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
a8f0: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
a900: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a910: 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
a920: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 49 66        if( addrIf
a930: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
a940: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
a950: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a960: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
a970: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
a980: 20 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29   either xValue()
a990: 20 28 62 46 69 6e 61 6c 3d 3d 30 29 20 6f 72 20   (bFinal==0) or 
a9a0: 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28  xFinalize().** (
a9b0: 62 46 69 6e 61 6c 3d 3d 31 29 20 66 6f 72 20 65  bFinal==1) for e
a9c0: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
a9d0: 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  ion in the linke
a9e0: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
a9f0: 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c  at.** pMWin. Or,
aa00: 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69   for built-in wi
aa10: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74  ndow-functions t
aa20: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
aa30: 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41  he standard.** A
aa40: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
aa50: 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20 63   equivalent VM c
aa60: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
aa70: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69 6e  oid windowAggFin
aa80: 61 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  al(Parse *pParse
aa90: 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c  , Window *pMWin,
aaa0: 20 69 6e 74 20 62 46 69 6e 61 6c 29 7b 0a 20 20   int bFinal){.  
aab0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
aac0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
aad0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
aae0: 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  ;..  for(pWin=pM
aaf0: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
ab00: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
ab10: 0a 20 20 20 20 69 66 28 20 28 70 57 69 6e 2d 3e  .    if( (pWin->
ab20: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
ab30: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
ab40: 49 4e 4d 41 58 29 20 0a 20 20 20 20 20 26 26 20  INMAX) .     && 
ab50: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
ab60: 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20  _UNBOUNDED .    
ab70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ab80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ab90: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
aba0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
abb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
abc0: 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op1(v, OP_Last, 
abd0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
abe0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
abf0: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
ac00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ac10: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e   OP_Column, pWin
ac20: 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 70 57 69  ->csrApp, 0, pWi
ac30: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
ac40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ac50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69  JumpHere(v, sqli
ac60: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
ac70: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20  dr(v)-2);.      
ac80: 69 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20 20  if( bFinal ){.  
ac90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aca0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
acb0: 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d  setSorter, pWin-
acc0: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
acd0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
ace0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
acf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad00: 20 69 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20   if( bFinal ){. 
ad10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ad20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
ad30: 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72  ggFinal, pWin->r
ad40: 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41  egAccum, windowA
ad50: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a  rgCount(pWin));.
ad60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ad70: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
ad80: 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  Win->pFunc, P4_F
ad90: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20  UNCDEF);.       
ada0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
adb0: 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
adc0: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70  Win->regAccum, p
add0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
ade0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
adf0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ae00: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
ae10: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20  regAccum);.     
ae20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ae30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae40: 33 28 76 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65  3(v, OP_AggValue
ae50: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
ae60: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
ae70: 28 70 57 69 6e 29 2c 0a 20 20 20 20 20 20 20 20  (pWin),.        
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65       pWin->regRe
aea0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73  sult);.        s
aeb0: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
aec0: 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e  P4(v, pWin->pFun
aed0: 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
aee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aef0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
af00: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
af10: 65 73 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  es VM code to in
af20: 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75  voke the sub-rou
af30: 74 69 6e 65 20 61 74 20 61 64 64 72 65 73 73 0a  tine at address.
af40: 2a 2a 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  ** lblFlushPart 
af50: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
af60: 72 74 69 74 69 6f 6e 20 77 69 74 68 20 74 68 65  rtition with the
af70: 20 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f   entire partitio
af80: 6e 20 63 61 63 68 65 64 20 69 6e 0a 2a 2a 20 74  n cached in.** t
af90: 68 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73  he Window.iEphCs
afa0: 72 20 74 65 6d 70 20 74 61 62 6c 65 2e 0a 2a 2f  r temp table..*/
afb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
afc0: 64 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68  dowPartitionCach
afd0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
afe0: 73 65 2c 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c  se,.  Select *p,
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 77        /* The rew
b010: 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74  ritten SELECT st
b020: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65  atement */.  Whe
b030: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
b040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b050: 57 68 65 72 65 49 6e 66 6f 20 74 6f 20 63 61 6c  WhereInfo to cal
b060: 6c 20 57 68 65 72 65 45 6e 64 28 29 20 6f 6e 20  l WhereEnd() on 
b070: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73  */.  int regFlus
b080: 68 50 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  hPart,          
b090: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
b0a0: 20 74 6f 20 75 73 65 20 77 69 74 68 20 47 6f 73   to use with Gos
b0b0: 75 62 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  ub lblFlushPart 
b0c0: 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73  */.  int lblFlus
b0d0: 68 50 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  hPart,          
b0e0: 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
b0f0: 6e 65 20 74 6f 20 47 6f 73 75 62 20 74 6f 20 2a  ne to Gosub to *
b100: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 53 69 7a  /.  int *pRegSiz
b110: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
b120: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69      /* OUT: Regi
b130: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
b140: 70 61 72 74 69 74 69 6f 6e 20 73 69 7a 65 20 2a  partition size *
b150: 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  /.){.  Window *p
b160: 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
b170: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b180: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b190: 65 29 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73  e);.  int iSubCs
b1a0: 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  r = p->pSrc->a[0
b1b0: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ].iCursor;.  int
b1c0: 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   nSub = p->pSrc-
b1d0: 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
b1e0: 3b 0a 20 20 69 6e 74 20 6b 3b 0a 0a 20 20 69 6e  ;.  int k;..  in
b1f0: 74 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  t reg = pParse->
b200: 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72 65  nMem+1;.  int re
b210: 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e 53  gRecord = reg+nS
b220: 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ub;.  int regRow
b230: 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b 31  id = regRecord+1
b240: 3b 0a 0a 20 20 2a 70 52 65 67 53 69 7a 65 20 3d  ;..  *pRegSize =
b250: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 70 50 61   regRowid;.  pPa
b260: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75  rse->nMem += nSu
b270: 62 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  b + 2;..  /* Loa
b280: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  d the column val
b290: 75 65 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20  ues for the row 
b2a0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
b2b0: 73 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20  sub-select.  ** 
b2c0: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
b2d0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
b2e0: 69 6e 67 20 61 74 20 72 65 67 2e 20 2a 2f 0a 20  ing at reg. */. 
b2f0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62   for(k=0; k<nSub
b300: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; k++){.    sqli
b310: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b320: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62   OP_Column, iSub
b330: 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a  Csr, k, reg+k);.
b340: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
b350: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
b360: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20 6e  keRecord, reg, n
b370: 53 75 62 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Sub, regRecord);
b380: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
b390: 74 68 69 73 20 69 73 20 74 68 65 20 73 74 61 72  this is the star
b3a0: 74 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69  t of a new parti
b3b0: 74 69 6f 6e 2e 20 49 66 20 73 6f 2c 20 63 61 6c  tion. If so, cal
b3c0: 6c 20 74 68 65 0a 20 20 2a 2a 20 66 6c 75 73 68  l the.  ** flush
b3d0: 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62 2d 72  _partition sub-r
b3e0: 6f 75 74 69 6e 65 2e 20 20 2a 2f 0a 20 20 69 66  outine.  */.  if
b3f0: 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ( pMWin->pPartit
b400: 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  ion ){.    int a
b410: 64 64 72 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ddr;.    ExprLis
b420: 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
b430: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
b440: 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 70 50    int nPart = pP
b450: 61 72 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  art->nExpr;.    
b460: 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d  int regNewPart =
b470: 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42   reg + pMWin->nB
b480: 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65  ufferCol;.    Ke
b490: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
b4a0: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
b4b0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
b4c0: 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30  rse, pPart, 0, 0
b4d0: 29 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d 20 73  );..    addr = s
b4e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b4f0: 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
b500: 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
b510: 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72 74  n->regPart,nPart
b520: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b530: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
b540: 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
b550: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
b560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b570: 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
b580: 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61 64  dr+2, addr+4, ad
b590: 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43  dr+2);.    VdbeC
b5a0: 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a  overageEqNe(v);.
b5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b5c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
b5d0: 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d  , regNewPart, pM
b5e0: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50  Win->regPart, nP
b5f0: 61 72 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  art-1);.    sqli
b600: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b610: 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c   OP_Gosub, regFl
b620: 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73  ushPart, lblFlus
b630: 68 50 61 72 74 29 3b 0a 20 20 20 20 56 64 62 65  hPart);.    Vdbe
b640: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c  Comment((v, "cal
b650: 6c 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  l flush_partitio
b660: 6e 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n"));.  }..  /* 
b670: 42 75 66 66 65 72 20 74 68 65 20 63 75 72 72 65  Buffer the curre
b680: 6e 74 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70  nt row in the ep
b690: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a  hemeral table. *
b6a0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
b6b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
b6c0: 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  owid, pMWin->iEp
b6d0: 68 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b  hCsr, regRowid);
b6e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
b6f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
b700: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
b710: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65  r, regRecord, re
b720: 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45  gRowid);..  /* E
b730: 6e 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  nd of the input 
b740: 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  loop */.  sqlite
b750: 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
b760: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  );..  /* Invoke 
b770: 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e  "flush_partition
b780: 22 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  " to deal with t
b790: 68 65 20 66 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c  he final (or onl
b7a0: 79 29 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  y) partition */.
b7b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b7c0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
b7d0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
b7e0: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
b7f0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b800: 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72 74  "call flush_part
b810: 69 74 69 6f 6e 22 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ition"));.}../*.
b820: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75  ** Invoke the su
b830: 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 72 65 67  b-routine at reg
b840: 47 6f 73 75 62 20 28 67 65 6e 65 72 61 74 65 64  Gosub (generated
b850: 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65   by code in sele
b860: 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74 75  ct.c) to.** retu
b870: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
b880: 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45 70  ow of Window.iEp
b890: 68 43 73 72 2e 20 49 66 20 61 6c 6c 20 77 69 6e  hCsr. If all win
b8a0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  dow functions ar
b8b0: 65 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 77  e.** aggregate w
b8c0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
b8d0: 74 68 61 74 20 75 73 65 20 74 68 65 20 73 74 61  that use the sta
b8e0: 6e 64 61 72 64 20 41 50 49 2c 20 61 20 73 69 6e  ndard API, a sin
b8f0: 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62 20  gle.** OP_Gosub 
b900: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61  instruction is a
b910: 6c 6c 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ll that this rou
b920: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 2e 20  tine generates. 
b930: 45 78 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a 2a  Extra VM code.**
b940: 20 66 6f 72 20 70 65 72 2d 72 6f 77 20 70 72 6f   for per-row pro
b950: 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20  cessing is only 
b960: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
b970: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c  e following buil
b980: 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20 66  t-in window.** f
b990: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
b9a0: 20 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a 2a    nth_value().**
b9b0: 20 20 20 66 69 72 73 74 5f 76 61 6c 75 65 28 29     first_value()
b9c0: 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20 20  .**   lag().**  
b9d0: 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74 69   lead().*/.stati
b9e0: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74  c void windowRet
b9f0: 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50 61 72  urnOneRow(.  Par
ba00: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 69  se *pParse,.  Wi
ba10: 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20 20 69  ndow *pMWin,.  i
ba20: 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20 20 69  nt regGosub,.  i
ba30: 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a  nt addrGosub.){.
ba40: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
ba50: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
ba60: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
ba70: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
ba80: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
ba90: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
baa0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
bab0: 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
bac0: 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  nc;.    if( pFun
bad0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
bae0: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 7c 7c 20  lueName.     || 
baf0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
bb00: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  rst_valueName.  
bb10: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63    ){.      int c
bb20: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
bb30: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
bb40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
bb50: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
bb60: 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65  .      int tmpRe
bb70: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
bb80: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
bb90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bba0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
bbb0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
bbc0: 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20 20 69  esult);..      i
bbd0: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
bbe0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29  =nth_valueName )
bbf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
bc00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bc10: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d  P_Column, pMWin-
bc20: 3e 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e  >iEphCsr, pWin->
bc30: 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67  iArgCol+1,tmpReg
bc40: 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
bc50: 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70  wCheckIntValue(p
bc60: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32  Parse, tmpReg, 2
bc70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
bc80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bc90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
bca0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52  Integer, 1, tmpR
bcb0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
bcc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bcd0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
bce0: 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65  tmpReg, pWin->re
bcf0: 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20  gApp, tmpReg);. 
bd00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c  AddOp3(v, OP_Gt,
bd20: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
bd30: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
bd40: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
bd50: 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20  eNeverNull(v);. 
bd60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd70: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
bd80: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 30 2c 20  kRowid, csr, 0, 
bd90: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 56  tmpReg);.      V
bda0: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
bdb0: 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20  Taken(v);.      
bdc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bdd0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
bde0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
bdf0: 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  ol, pWin->regRes
be00: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
be10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
be20: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20  bel(v, lbl);.   
be30: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
be40: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
be50: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a   tmpReg);.    }.
be60: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75      else if( pFu
be70: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
be80: 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  ame || pFunc->zN
be90: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a  ame==lagName ){.
bea0: 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d        int nArg =
beb0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
bec0: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
bed0: 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70       int csr = p
bee0: 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20  Win->csrApp;.   
bef0: 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c     int lbl = sql
bf00: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
bf10: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
bf20: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
bf30: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
bf40: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
bf50: 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d  nt iEph = pMWin-
bf60: 3e 69 45 70 68 43 73 72 3b 0a 0a 20 20 20 20 20  >iEphCsr;..     
bf70: 20 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20   if( nArg<3 ){. 
bf80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bf90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
bfa0: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
bfb0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
bfc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
bfd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
bfe0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
bff0: 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  Eph, pWin->iArgC
c000: 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67 52  ol+2, pWin->regR
c010: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
c020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c030: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
c040: 77 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65  wid, iEph, tmpRe
c050: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  g);.      if( nA
c060: 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
c070: 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63  int val = (pFunc
c080: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
c090: 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20  e ? 1 : -1);.   
c0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c0b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
c0c0: 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c  Imm, tmpReg, val
c0d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
c0e0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
c0f0: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
c100: 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41 64  leadName ? OP_Ad
c110: 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29  d : OP_Subtract)
c120: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d  ;.        int tm
c130: 70 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47  pReg2 = sqlite3G
c140: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
c150: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c160: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c170: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
c180: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31   pWin->iArgCol+1
c190: 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20  , tmpReg2);.    
c1a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c1b0: 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70  ddOp3(v, op, tmp
c1c0: 52 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d  Reg2, tmpReg, tm
c1d0: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73  pReg);.        s
c1e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
c1f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
c200: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Reg2);.      }..
c210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c220: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
c230: 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62  ekRowid, csr, lb
c240: 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  l, tmpReg);.    
c250: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
c260: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c270: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c280: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
c290: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69  in->iArgCol, pWi
c2a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
c2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2c0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
c2d0: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
c2e0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
c2f0: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
c300: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
c310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c320: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
c330: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
c340: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  b);.}../*.** Inv
c350: 6f 6b 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e  oke the code gen
c360: 65 72 61 74 65 64 20 62 79 20 77 69 6e 64 6f 77  erated by window
c370: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 29 20 61  ReturnOneRow() a
c380: 6e 64 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20  nd, optionally, 
c390: 74 68 65 0a 2a 2a 20 78 49 6e 76 65 72 73 65 28  the.** xInverse(
c3a0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  ) function for e
c3b0: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
c3c0: 69 6f 6e 2c 20 66 6f 72 20 6f 6e 65 20 6f 72 20  ion, for one or 
c3d0: 6d 6f 72 65 20 72 6f 77 73 0a 2a 2a 20 66 72 6f  more rows.** fro
c3e0: 6d 20 74 68 65 20 57 69 6e 64 6f 77 2e 69 45 70  m the Window.iEp
c3f0: 68 43 73 72 20 74 65 6d 70 20 74 61 62 6c 65 2e  hCsr temp table.
c400: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
c410: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 0a  nerates VM code.
c420: 2a 2a 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  ** similar to:.*
c430: 2a 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 72 65  *.**   while( re
c440: 67 43 74 72 3e 30 20 29 7b 0a 2a 2a 20 20 20 20  gCtr>0 ){.**    
c450: 20 72 65 67 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20   regCtr--;.**   
c460: 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e    windowReturnOn
c470: 65 52 6f 77 28 29 0a 2a 2a 20 20 20 20 20 69 66  eRow().**     if
c480: 28 20 62 49 6e 76 65 72 73 65 20 29 7b 0a 2a 2a  ( bInverse ){.**
c490: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
c4a0: 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  e.**     }.**   
c4b0: 20 20 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e 69    Next (Window.i
c4c0: 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a  EphCsr).**   }.*
c4d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
c4e0: 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a  ndowReturnRows(.
c4f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c500: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
c510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c520: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77 69     /* List of wi
c530: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ndow functions *
c540: 2f 0a 20 20 69 6e 74 20 72 65 67 43 74 72 2c 20  /.  int regCtr, 
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
c570: 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62 65  containing numbe
c580: 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69  r of rows */.  i
c590: 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20  nt regGosub,    
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c5b0: 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 47  * Register for G
c5c0: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 20 2a  osub addrGosub *
c5d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75  /.  int addrGosu
c5e0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
c5f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
c600: 66 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 66 6f  f sub-routine fo
c610: 72 20 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20 2a  r ReturnOneRow *
c620: 2f 0a 20 20 69 6e 74 20 72 65 67 49 6e 76 41 72  /.  int regInvAr
c630: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
c640: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
c650: 72 65 67 69 73 74 65 72 73 20 66 6f 72 20 78 49  registers for xI
c660: 6e 76 65 72 73 65 20 61 72 67 73 20 2a 2f 0a 20  nverse args */. 
c670: 20 69 6e 74 20 72 65 67 49 6e 76 53 69 7a 65 20   int regInvSize 
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e   /* Register con
c6a0: 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20  taining size of 
c6b0: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  partition */.){.
c6c0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64    int addr;.  Vd
c6d0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
c6e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
c6f0: 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
c700: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
c710: 30 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  0);.  addr = sql
c720: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c730: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43  , OP_IfPos, regC
c740: 74 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  tr, sqlite3VdbeC
c750: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 20  urrentAddr(v)+2 
c760: 2c 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  ,1);.  VdbeCover
c770: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
c780: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c790: 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20  P_Goto, 0, 0);. 
c7a0: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
c7b0: 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69  Row(pParse, pMWi
c7c0: 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  n, regGosub, add
c7d0: 72 47 6f 73 75 62 29 3b 0a 20 20 69 66 28 20 72  rGosub);.  if( r
c7e0: 65 67 49 6e 76 41 72 67 20 29 7b 0a 20 20 20 20  egInvArg ){.    
c7f0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
c800: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57  arse, pMWin, pMW
c810: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c 20  in->iEphCsr, 1, 
c820: 72 65 67 49 6e 76 41 72 67 2c 20 72 65 67 49 6e  regInvArg, regIn
c830: 76 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71  vSize);.  }.  sq
c840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c850: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69  v, OP_Next, pMWi
c860: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 61 64 64 72  n->iEphCsr, addr
c870: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
c880: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
c890: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
c8a0: 64 64 72 2b 31 29 3b 20 20 20 2f 2a 20 54 68 65  ddr+1);   /* The
c8b0: 20 4f 50 5f 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f   OP_Goto */.}../
c8c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
c8d0: 64 65 20 74 6f 20 73 65 74 20 74 68 65 20 61 63  de to set the ac
c8e0: 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
c8f0: 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  er for each wind
c900: 6f 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ow function.** i
c910: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
c920: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
c930: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
c940: 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72  to NULL. And per
c950: 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69  form.** any equi
c960: 76 61 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a  valent initializ
c970: 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
c980: 79 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77  y any built-in w
c990: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a  indow functions.
c9a0: 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ** in the list..
c9b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
c9c0: 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61  ndowInitAccum(Pa
c9d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e  rse *pParse, Win
c9e0: 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56  dow *pMWin){.  V
c9f0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
ca00: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
ca10: 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20  .  int regArg;. 
ca20: 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20   int nArg = 0;. 
ca30: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
ca40: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
ca50: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
ca60: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
ca70: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
ca80: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
ca90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
caa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
cab0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
cac0: 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20  um);.    nArg = 
cad0: 4d 41 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77  MAX(nArg, window
cae0: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b  ArgCount(pWin));
caf0: 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
cb00: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
cb10: 4e 61 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75  Name.     || pFu
cb20: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74  nc->zName==first
cb30: 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 29  _valueName.    )
cb40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
cb50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cb60: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
cb70: 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20  ->regApp);.     
cb80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb90: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
cba0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
cbb0: 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  p+1);.    }..   
cbc0: 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e   if( (pFunc->fun
cbd0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
cbe0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20  FUNC_MINMAX) && 
cbf0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 29 7b 0a  pWin->csrApp ){.
cc00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
cc10: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
cc20: 4e 42 4f 55 4e 44 45 44 20 29 3b 0a 20 20 20 20  NBOUNDED );.    
cc30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cc40: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
cc50: 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72  orter, pWin->csr
cc60: 41 70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  App);.      sqli
cc70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cc80: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
cc90: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b  pWin->regApp+1);
cca0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 67  .    }.  }.  reg
ccb0: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
ccc0: 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e  em+1;.  pParse->
ccd0: 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20 20  nMem += nArg;.  
cce0: 72 65 74 75 72 6e 20 72 65 67 41 72 67 3b 0a 7d  return regArg;.}
ccf0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
cd00: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
cd10: 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74 65 33 57  work of sqlite3W
cd20: 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20  indowCodeStep() 
cd30: 66 6f 72 20 61 6c 6c 20 22 52 4f 57 53 22 0a 2a  for all "ROWS".*
cd40: 2a 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 74  * window frame t
cd50: 79 70 65 73 20 65 78 63 65 70 74 20 66 6f 72 20  ypes except for 
cd60: 22 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44  "BETWEEN UNBOUND
cd70: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
cd80: 20 43 55 52 52 45 4e 54 0a 2a 2a 20 52 4f 57 22   CURRENT.** ROW"
cd90: 2e 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f  . Pseudo-code fo
cda0: 72 20 65 61 63 68 20 66 6f 6c 6c 6f 77 73 2e 0a  r each follows..
cdb0: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
cdc0: 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45  EN <expr1> PRECE
cdd0: 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  DING AND <expr2>
cde0: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
cdf0: 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
ce00: 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74    if( new partit
ce10: 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
ce20: 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61    Gosub flush_pa
ce30: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  rtition.**      
ce40: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65   }.**       Inse
ce50: 72 74 20 28 72 65 63 6f 72 64 20 69 6e 20 65 70  rt (record in ep
ce60: 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20 20 20  h-table).**     
ce70: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
ce80: 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 66  ).**     Gosub f
ce90: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a  lush_partition.*
cea0: 2a 20 20 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70  *  .**   flush_p
ceb0: 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20  artition:.**    
cec0: 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20   Once {.**      
ced0: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
cee0: 72 20 2d 3e 20 63 73 72 53 74 61 72 74 29 0a 2a  r -> csrStart).*
cef0: 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20  *       OpenDup 
cf00: 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 45  (iEphCsr -> csrE
cf10: 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  nd).**     }.** 
cf20: 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c      regStart = <
cf30: 65 78 70 72 31 3e 20 20 20 20 20 20 20 20 20 20  expr1>          
cf40: 20 20 20 20 20 20 2f 2f 20 50 52 45 43 45 44 49        // PRECEDI
cf50: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  NG expression.**
cf60: 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
cf70: 78 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 20  xpr2>           
cf80: 20 20 20 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57         // FOLLOW
cf90: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ING expression.*
cfa0: 2a 20 20 20 20 20 69 66 28 20 72 65 67 53 74 61  *     if( regSta
cfb0: 72 74 3c 30 20 7c 7c 20 72 65 67 45 6e 64 3c 30  rt<0 || regEnd<0
cfc0: 20 29 7b 20 65 72 72 6f 72 21 20 7d 0a 2a 2a 20   ){ error! }.** 
cfd0: 20 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c      Rewind (csr,
cfe0: 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29  csrStart,csrEnd)
cff0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
d000: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
d010: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
d020: 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20     Next(csrEnd) 
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 73 6b 69     // if EOF ski
d050: 70 20 41 67 67 73 74 65 70 0a 2a 2a 20 20 20 20  p Aggstep.**    
d060: 20 20 20 41 67 67 73 74 65 70 20 28 63 73 72 45     Aggstep (csrE
d070: 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  nd).**       if(
d080: 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
d090: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
d0a0: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
d0b0: 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
d0c0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
d0d0: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
d0f0: 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75   if EOF goto flu
d100: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
d110: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28  e.**         if(
d120: 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
d130: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
d140: 20 41 67 67 49 6e 76 65 72 73 65 20 28 63 73 72   AggInverse (csr
d150: 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20  Start).**       
d160: 20 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72      Next(csrStar
d170: 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  t).**         }.
d180: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
d190: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
d1a0: 64 6f 6e 65 3a 0a 2a 2a 20 20 20 20 20 52 65 73  done:.**     Res
d1b0: 65 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a  etSorter (csr).*
d1c0: 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a  *     Return.**.
d1d0: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
d1e0: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
d1f0: 20 20 20 20 41 4e 44 20 43 55 52 52 45 4e 54 20      AND CURRENT 
d200: 52 4f 57 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  ROW.** ROWS BETW
d210: 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
d220: 20 20 20 20 20 20 20 20 41 4e 44 20 3c 65 78 70          AND <exp
d230: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20  r> FOLLOWING.** 
d240: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42  ROWS BETWEEN UNB
d250: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
d260: 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c   AND <expr> FOLL
d270: 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68  OWING.**.**   Th
d280: 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20  ese are similar 
d290: 74 6f 20 74 68 65 20 61 62 6f 76 65 2e 20 46 6f  to the above. Fo
d2a0: 72 20 22 43 55 52 52 45 4e 54 20 52 4f 57 22 2c  r "CURRENT ROW",
d2b0: 20 69 6e 74 69 61 6c 69 7a 65 20 74 68 65 0a 2a   intialize the.*
d2c0: 2a 20 20 20 72 65 67 69 73 74 65 72 20 74 6f 20  *   register to 
d2d0: 30 2e 20 46 6f 72 20 22 55 4e 42 4f 55 4e 44 45  0. For "UNBOUNDE
d2e0: 44 20 50 52 45 43 45 44 49 4e 47 22 20 74 6f 20  D PRECEDING" to 
d2f0: 69 6e 66 69 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20  infinity..**.** 
d300: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
d310: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20  pr> PRECEDING   
d320: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
d330: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53  OLLOWING.** ROWS
d340: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
d350: 20 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44   ROW         AND
d360: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
d370: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  WING.**.**     R
d380: 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74  ewind (csr,csrSt
d390: 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 20 2f  art,csrEnd)    /
d3a0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
d3b0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
d3c0: 6e 65 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28  ne.**     while(
d3d0: 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 4e   1 ){.**       N
d3e0: 65 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20  ext(csrEnd)     
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
d400: 45 78 69 74 20 77 68 69 6c 65 28 31 29 20 61 74  Exit while(1) at
d410: 20 45 4f 46 0a 2a 2a 20 20 20 20 20 20 20 41 67   EOF.**       Ag
d420: 67 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a  gstep (csrEnd).*
d430: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77  *     }.**     w
d440: 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
d450: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
d460: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47  alue).**       G
d470: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
d480: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
d490: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
d4a0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
d4b0: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
d4c0: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
d4d0: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
d4e0: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
d4f0: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20       AggInverse 
d500: 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
d510: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 53 74        Next(csrSt
d520: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  art).**       }.
d530: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20  **     }.**.**  
d540: 20 46 6f 72 20 74 68 65 20 22 43 55 52 52 45 4e   For the "CURREN
d550: 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e  T ROW AND UNBOUN
d560: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63  DED FOLLOWING" c
d570: 61 73 65 2c 20 74 68 65 20 66 69 6e 61 6c 20 69  ase, the final i
d580: 66 28 29 20 0a 2a 2a 20 20 20 63 6f 6e 64 69 74  f() .**   condit
d590: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 74 72  ion is always tr
d5a0: 75 65 20 28 61 73 20 69 66 20 72 65 67 53 74 61  ue (as if regSta
d5b0: 72 74 20 77 65 72 65 20 69 6e 69 74 69 61 6c 69  rt were initiali
d5c0: 7a 65 64 20 74 6f 20 30 29 2e 0a 2a 2a 0a 2a 2a  zed to 0)..**.**
d5d0: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
d5e0: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
d5f0: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
d600: 4e 47 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 69 73  NG.** .**   This
d610: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 52 41 4e   is the only RAN
d620: 47 45 20 63 61 73 65 20 68 61 6e 64 6c 65 64 20  GE case handled 
d630: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
d640: 20 49 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   It modifies the
d650: 0a 2a 2a 20 20 20 73 65 63 6f 6e 64 20 77 68 69  .**   second whi
d660: 6c 65 28 20 31 20 29 20 6c 6f 6f 70 20 69 6e 20  le( 1 ) loop in 
d670: 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55  "ROWS BETWEEN CU
d680: 52 52 45 4e 54 20 2e 2e 2e 20 55 4e 42 4f 55 4e  RRENT ... UNBOUN
d690: 44 45 44 2e 2e 2e 22 20 74 6f 0a 2a 2a 20 20 20  DED..." to.**   
d6a0: 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77 68  be:.**.**     wh
d6b0: 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
d6c0: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
d6d0: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 77 68  lue).**       wh
d6e0: 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
d6f0: 20 20 20 20 20 72 65 67 50 65 65 72 2b 2b 0a 2a       regPeer++.*
d700: 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
d710: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
d720: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
d750: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
d760: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  n_done.**       
d770: 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29    if( new peer )
d780: 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20   break;.**      
d790: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c   }.**       whil
d7a0: 65 28 20 28 72 65 67 50 65 65 72 2d 2d 29 3e 30  e( (regPeer--)>0
d7b0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
d7c0: 67 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74  ggInverse (csrSt
d7d0: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  art).**         
d7e0: 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a  Next(csrStart).*
d7f0: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
d800: 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45   }.**.** ROWS BE
d810: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 46 4f 4c  TWEEN <expr> FOL
d820: 4c 4f 57 49 4e 47 20 20 20 20 41 4e 44 20 3c 65  LOWING    AND <e
d830: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  xpr> FOLLOWING.*
d840: 2a 0a 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20  *.**   regEnd = 
d850: 72 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72  regEnd - regStar
d860: 74 0a 2a 2a 20 20 20 52 65 77 69 6e 64 20 28 63  t.**   Rewind (c
d870: 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45  sr,csrStart,csrE
d880: 6e 64 29 20 20 20 2f 2f 20 69 66 20 45 4f 46 20  nd)   // if EOF 
d890: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
d8a0: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
d8b0: 20 41 67 67 73 74 65 70 20 28 63 73 72 45 6e 64   Aggstep (csrEnd
d8c0: 29 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73  ).**     Next(cs
d8d0: 72 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20  rEnd)           
d8e0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
d8f0: 66 61 6c 6c 2d 74 68 72 6f 75 67 68 0a 2a 2a 20  fall-through.** 
d900: 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
d910: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
d920: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
d930: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
d940: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
d950: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20  alue).**        
d960: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
d970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74  .**         Next
d980: 28 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20  (csr)           
d990: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
d9a0: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
d9b0: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  n_done.**       
d9c0: 7d 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 49 6e  }.**       AggIn
d9d0: 76 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29  verse (csrStart)
d9e0: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28  .**       Next (
d9f0: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
da00: 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45   }.**.** ROWS BE
da10: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
da20: 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 3c 65  CEDING    AND <e
da30: 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a  xpr> PRECEDING.*
da40: 2a 0a 2a 2a 20 20 20 52 65 70 6c 61 63 65 20 74  *.**   Replace t
da50: 68 65 20 62 69 74 20 61 66 74 65 72 20 22 52 65  he bit after "Re
da60: 77 69 6e 64 22 20 69 6e 20 74 68 65 20 61 62 6f  wind" in the abo
da70: 76 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20  ve with:.**.**  
da80: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
da90: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
daa0: 20 41 67 67 53 74 65 70 20 28 63 73 72 45 6e 64   AggStep (csrEnd
dab0: 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20  ).**       Next 
dac0: 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20  (csrEnd).**     
dad0: 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61  }.**     AggFina
dae0: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
daf0: 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
db00: 62 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73  b.**     Next(cs
db10: 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
db20: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
db30: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
db40: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 69  on_done.**     i
db50: 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
db60: 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  =0 ){.**       A
db70: 67 67 49 6e 76 65 72 73 65 20 28 63 73 72 32 29  ggInverse (csr2)
db80: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28  .**       Next (
db90: 63 73 72 32 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a  csr2).**     }.*
dba0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
dbb0: 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78   windowCodeRowEx
dbc0: 70 72 53 74 65 70 28 0a 20 20 50 61 72 73 65 20  prStep(.  Parse 
dbd0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65  *pParse, .  Sele
dbe0: 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e  ct *p,.  WhereIn
dbf0: 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e  fo *pWInfo,.  in
dc00: 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69  t regGosub, .  i
dc10: 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a  nt addrGosub.){.
dc20: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20    Window *pMWin 
dc30: 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62  = p->pWin;.  Vdb
dc40: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
dc50: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
dc60: 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72   int regFlushPar
dc70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
dc80: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
dc90: 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61   "Gosub flush_pa
dca0: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e  rtition" */.  in
dcb0: 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 20  t lblFlushPart; 
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcd0: 20 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75   Label for "Gosu
dce0: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
dcf0: 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46  n" */.  int lblF
dd00: 6c 75 73 68 44 6f 6e 65 3b 20 20 20 20 20 20 20  lushDone;       
dd10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
dd20: 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73   for "Gosub flus
dd30: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
dd40: 22 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 65 67 41  " */..  int regA
dd50: 72 67 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  rg;.  int addr;.
dd60: 20 20 69 6e 74 20 63 73 72 53 74 61 72 74 20 3d    int csrStart =
dd70: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
dd80: 0a 20 20 69 6e 74 20 63 73 72 45 6e 64 20 3d 20  .  int csrEnd = 
dd90: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
dda0: 20 20 69 6e 74 20 72 65 67 53 74 61 72 74 3b 20    int regStart; 
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
ddd0: 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
dde0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 3b  */.  int regEnd;
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
de10: 66 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  f <expr> FOLLOWI
de20: 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  NG */.  int addr
de30: 47 6f 74 6f 3b 0a 20 20 69 6e 74 20 61 64 64 72  Goto;.  int addr
de40: 54 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72 49  Top;.  int addrI
de50: 66 50 6f 73 31 20 3d 20 30 3b 0a 20 20 69 6e 74  fPos1 = 0;.  int
de60: 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20 30 3b   addrIfPos2 = 0;
de70: 0a 20 20 69 6e 74 20 72 65 67 53 69 7a 65 20 3d  .  int regSize =
de80: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
de90: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
dea0: 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20 20  _PRECEDING .    
deb0: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
dec0: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
ded0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
dee0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
def0: 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20 7c  LOWING .       |
df00: 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
df10: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20  =TK_UNBOUNDED . 
df20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
df30: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
df40: 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20  LLOWING .       
df50: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
df60: 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
df70: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
df80: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
df90: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
dfa0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
dfb0: 44 49 4e 47 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a  DING .  );..  /*
dfc0: 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74   Allocate regist
dfd0: 65 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f 72  er and label for
dfe0: 20 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72 74   the "flush_part
dff0: 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74 69  ition" sub-routi
e000: 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75 73  ne. */.  regFlus
e010: 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  hPart = ++pParse
e020: 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75  ->nMem;.  lblFlu
e030: 73 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65 33  shPart = sqlite3
e040: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
e050: 61 72 73 65 29 3b 0a 20 20 6c 62 6c 46 6c 75 73  arse);.  lblFlus
e060: 68 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  hDone = sqlite3V
e070: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
e080: 72 73 65 29 3b 0a 0a 20 20 72 65 67 53 74 61 72  rse);..  regStar
e090: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
e0a0: 65 6d 3b 0a 20 20 72 65 67 45 6e 64 20 3d 20 2b  em;.  regEnd = +
e0b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
e0c0: 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f    windowPartitio
e0d0: 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70  nCache(pParse, p
e0e0: 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75  , pWInfo, regFlu
e0f0: 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68  shPart, lblFlush
e100: 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29 3b  Part, &regSize);
e110: 0a 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73  ..  addrGoto = s
e120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
e130: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20  (v, OP_Goto);.. 
e140: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c   /* Start of "fl
e150: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
e160: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
e170: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
e180: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
e190: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e1a0: 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c  2(v, OP_Once, 0,
e1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e1c0: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
e1d0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e1e0: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
e1f0: 28 76 2c 20 22 46 6c 75 73 68 5f 70 61 72 74 69  (v, "Flush_parti
e200: 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 22  tion subroutine"
e210: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
e220: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
e230: 65 6e 44 75 70 2c 20 63 73 72 53 74 61 72 74 2c  enDup, csrStart,
e240: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
e250: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e260: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
e270: 44 75 70 2c 20 63 73 72 45 6e 64 2c 20 70 4d 57  Dup, csrEnd, pMW
e280: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20  in->iEphCsr);.. 
e290: 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 72 65   /* If either re
e2a0: 67 53 74 61 72 74 20 6f 72 20 72 65 67 45 6e 64  gStart or regEnd
e2b0: 20 61 72 65 20 6e 6f 74 20 6e 6f 6e 2d 6e 65 67   are not non-neg
e2c0: 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 2c 20  ative integers, 
e2d0: 74 68 72 6f 77 20 0a 20 20 2a 2a 20 61 6e 20 65  throw .  ** an e
e2e0: 78 63 65 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  xception.  */.  
e2f0: 69 66 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72  if( pMWin->pStar
e300: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
e310: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e320: 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20   pMWin->pStart, 
e330: 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20 77  regStart);.    w
e340: 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c  indowCheckIntVal
e350: 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74  ue(pParse, regSt
e360: 61 72 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  art, 0);.  }.  i
e370: 66 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 20 29  f( pMWin->pEnd )
e380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
e390: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d  rCode(pParse, pM
e3a0: 57 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e  Win->pEnd, regEn
e3b0: 64 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68  d);.    windowCh
e3c0: 65 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72  eckIntValue(pPar
e3d0: 73 65 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a  se, regEnd, 1);.
e3e0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
e3f0: 73 20 69 73 20 22 52 4f 57 53 20 3c 65 78 70 72  s is "ROWS <expr
e400: 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44  1> FOLLOWING AND
e410: 20 52 4f 57 53 20 3c 65 78 70 72 32 3e 20 46 4f   ROWS <expr2> FO
e420: 4c 4c 4f 57 49 4e 47 22 2c 20 64 6f 3a 0a 20 20  LLOWING", do:.  
e430: 2a 2a 0a 20 20 2a 2a 20 20 20 69 66 28 20 72 65  **.  **   if( re
e440: 67 45 6e 64 3c 72 65 67 53 74 61 72 74 20 29 7b  gEnd<regStart ){
e450: 0a 20 20 2a 2a 20 20 20 20 20 2f 2f 20 54 68 65  .  **     // The
e460: 20 66 72 61 6d 65 20 61 6c 77 61 79 73 20 63 6f   frame always co
e470: 6e 73 69 73 74 73 20 6f 66 20 30 20 72 6f 77 73  nsists of 0 rows
e480: 0a 20 20 2a 2a 20 20 20 20 20 72 65 67 53 74 61  .  **     regSta
e490: 72 74 20 3d 20 72 65 67 53 69 7a 65 3b 0a 20 20  rt = regSize;.  
e4a0: 2a 2a 20 20 20 7d 0a 20 20 2a 2a 20 20 20 72 65  **   }.  **   re
e4b0: 67 45 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d 20  gEnd = regEnd - 
e4c0: 72 65 67 53 74 61 72 74 3b 0a 20 20 2a 2f 0a 20  regStart;.  */. 
e4d0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64   if( pMWin->pEnd
e4e0: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   && pMWin->eStar
e4f0: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
e500: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e510: 4d 57 69 6e 2d 3e 70 53 74 61 72 74 21 3d 30 20  MWin->pStart!=0 
e520: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e530: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46  MWin->eEnd==TK_F
e540: 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20  OLLOWING );.    
e550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e560: 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53  3(v, OP_Ge, regS
e570: 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62  tart, sqlite3Vdb
e580: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e590: 32 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  2, regEnd);.    
e5a0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
e5b0: 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 20 20 73 71  rNull(v);.    sq
e5c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e5d0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
e5e0: 69 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  ize, regStart);.
e5f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e600: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
e610: 72 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20  ract, regStart, 
e620: 72 65 67 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b  regEnd, regEnd);
e630: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69  .  }..  if( pMWi
e640: 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57  n->pStart && pMW
e650: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
e660: 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 73  CEDING ){.    as
e670: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 70 45 6e  sert( pMWin->pEn
e680: 64 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d!=0 );.    asse
e690: 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  rt( pMWin->eStar
e6a0: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
e6b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e6c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c  beAddOp3(v, OP_L
e6d0: 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c  e, regStart, sql
e6e0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e6f0: 64 64 72 28 76 29 2b 33 2c 20 72 65 67 45 6e 64  ddr(v)+3, regEnd
e700: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
e710: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b  ageNeverNull(v);
e720: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
e740: 79 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53  y, regSize, regS
e750: 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
e760: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e770: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65  OP_Copy, regSize
e780: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a  , regEnd);.  }..
e790: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
e7a0: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
e7b0: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
e7c0: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
e7d0: 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
e7e0: 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
e7f0: 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
e800: 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
e810: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e820: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e  OP_Rewind, pMWin
e830: 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c 46 6c  ->iEphCsr, lblFl
e840: 75 73 68 44 6f 6e 65 29 3b 0a 20 20 56 64 62 65  ushDone);.  Vdbe
e850: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
e860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e870: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
e880: 73 72 53 74 61 72 74 2c 20 6c 62 6c 46 6c 75 73  srStart, lblFlus
e890: 68 44 6f 6e 65 29 3b 0a 20 20 56 64 62 65 43 6f  hDone);.  VdbeCo
e8a0: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
e8b0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
e8c0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
e8d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e8e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
e8f0: 6e 64 2c 20 63 73 72 45 6e 64 2c 20 6c 62 6c 46  nd, csrEnd, lblF
e900: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 56 64 62  lushDone);.  Vdb
e910: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61  eCoverageNeverTa
e920: 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ken(v);.  sqlite
e930: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
e940: 20 31 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b   1);..  /* Invok
e950: 65 20 41 67 67 53 74 65 70 20 66 75 6e 63 74 69  e AggStep functi
e960: 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  on for each wind
e970: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e  ow function usin
e980: 67 20 74 68 65 20 72 6f 77 20 74 68 61 74 0a 20  g the row that. 
e990: 20 2a 2a 20 63 73 72 45 6e 64 20 63 75 72 72 65   ** csrEnd curre
e9a0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ntly points to. 
e9b0: 4f 72 2c 20 69 66 20 63 73 72 45 6e 64 20 69 73  Or, if csrEnd is
e9c0: 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46 2c   already at EOF,
e9d0: 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 68 69 6e 67  .  ** do nothing
e9e0: 2e 20 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  .  */.  addrTop 
e9f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ea00: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
ea10: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
ea20: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
ea30: 20 20 20 20 61 64 64 72 49 66 50 6f 73 31 20 3d      addrIfPos1 =
ea40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ea50: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
ea60: 72 65 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b 0a  regEnd, 0 , 1);.
ea70: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ea80: 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
ea90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
eaa0: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c  OP_Next, csrEnd,
eab0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
eac0: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
ead0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
eae0: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
eaf0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
eb00: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 77 69 6e 64  OP_Goto);.  wind
eb10: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
eb20: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 45 6e 64 2c  , pMWin, csrEnd,
eb30: 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53   0, regArg, regS
eb40: 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 4d 57 69  ize);.  if( pMWi
eb50: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
eb60: 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  UNDED ){.    sql
eb70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
eb80: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
eb90: 64 72 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69  drTop);.    sqli
eba0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ebb0: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 61 64  v, addr);.    ad
ebc0: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
ebd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ebe0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ebf0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ec00: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
ec10: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
ec20: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
ec30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ec40: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ec50: 61 64 64 72 49 66 50 6f 73 31 29 3b 0a 20 20 20  addrIfPos1);.   
ec60: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d   }.  }..  if( pM
ec70: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
ec80: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61  LLOWING ){.    a
ec90: 64 64 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69  ddrIfPos1 = sqli
eca0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ecb0: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e   OP_IfPos, regEn
ecc0: 64 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56  d, 0 , 1);.    V
ecd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ece0: 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d    }.  if( pMWin-
ecf0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
ed00: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64  OWING ){.    add
ed10: 72 49 66 50 6f 73 32 20 3d 20 73 71 6c 69 74 65  rIfPos2 = sqlite
ed20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ed30: 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72  P_IfPos, regStar
ed40: 74 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56  t, 0 , 1);.    V
ed50: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ed60: 20 20 7d 0a 20 20 77 69 6e 64 6f 77 41 67 67 46    }.  windowAggF
ed70: 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57  inal(pParse, pMW
ed80: 69 6e 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77  in, 0);.  window
ed90: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61  ReturnOneRow(pPa
eda0: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47  rse, pMWin, regG
edb0: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
edc0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
edd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
ede0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
edf0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
ee00: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
ee10: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
ee20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ee30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
ee40: 6f 2c 20 30 2c 20 6c 62 6c 46 6c 75 73 68 44 6f  o, 0, lblFlushDo
ee50: 6e 65 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e  ne);.  if( pMWin
ee60: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
ee70: 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71  LOWING ){.    sq
ee80: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ee90: 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 32 29  e(v, addrIfPos2)
eea0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57  ;.  }..  if( pMW
eeb0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43  in->eStart==TK_C
eec0: 55 52 52 45 4e 54 20 0a 20 20 20 7c 7c 20 70 4d  URRENT .   || pM
eed0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
eee0: 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20 7c 7c  PRECEDING .   ||
eef0: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
ef00: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20  TK_FOLLOWING .  
ef10: 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 53 6b  ){.    int lblSk
ef20: 69 70 49 6e 76 65 72 73 65 20 3d 20 73 71 6c 69  ipInverse = sqli
ef30: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ef40: 28 70 50 61 72 73 65 29 3b 3b 0a 20 20 20 20 69  (pParse);;.    i
ef50: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
ef60: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
ef70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
ef80: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ef90: 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c  IfPos, regStart,
efa0: 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 2c   lblSkipInverse,
efb0: 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
efc0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
efd0: 7d 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  }.    if( pMWin-
efe0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
eff0: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73  OWING ){.      s
f000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f010: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72  (v, OP_Next, csr
f020: 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64  Start, sqlite3Vd
f030: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f040: 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
f050: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f070: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
f080: 30 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73  0, lblSkipInvers
f090: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
f0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f0b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f0c0: 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c  t, csrStart, sql
f0d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f0e0: 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20 20  ddr(v)+1);.     
f0f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 41 6c 77   VdbeCoverageAlw
f100: 61 79 73 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20  aysTaken(v);.   
f110: 20 7d 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67   }.    windowAgg
f120: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
f130: 69 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c  in, csrStart, 1,
f140: 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65   regArg, regSize
f150: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f160: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
f170: 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65  , lblSkipInverse
f180: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  );.  }.  if( pMW
f190: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
f1a0: 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71  LOWING ){.    sq
f1b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f1c0: 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29  e(v, addrIfPos1)
f1d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
f1e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f1f0: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70  Goto, 0, addrTop
f200: 29 3b 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70  );..  /* flush_p
f210: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a  artition_done: *
f220: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
f230: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
f240: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
f250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f260: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
f270: 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ter, pMWin->iEph
f280: 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Csr);.  sqlite3V
f290: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f2a0: 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68  Return, regFlush
f2b0: 50 61 72 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d  Part);.  VdbeCom
f2c0: 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 66 6c  ment((v, "end fl
f2d0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75  ush_partition su
f2e0: 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 0a 20 20  broutine"));..  
f2f0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
f300: 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75  to skip over flu
f310: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  sh_partition */.
f320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f330: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
f340: 6f 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65  o);.}../* .** Re
f350: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
f360: 20 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f   entire partitio
f370: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 63 68  n should be cach
f380: 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 0a 2a  ed in the temp.*
f390: 2a 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 70  * table before p
f3a0: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74  rocessing..*/.st
f3b0: 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43  atic int windowC
f3c0: 61 63 68 65 50 61 72 74 69 74 69 6f 6e 28 57 69  achePartition(Wi
f3d0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20  ndow *pMWin){.  
f3e0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
f3f0: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
f400: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
f410: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
f420: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
f430: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
f440: 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75    if( (pFunc->fu
f450: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
f460: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
f470: 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e  E).     || (pFun
f480: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
f490: 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c  lueName).     ||
f4a0: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
f4b0: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29  first_valueName)
f4c0: 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d  .     || (pFunc-
f4d0: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
f4e0: 29 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63  ).     || (pFunc
f4f0: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65  ->zName==lagName
f500: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
f510: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
f520: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
f530: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ..static void wi
f540: 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20  ndowCodeStep(.  
f550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
f560: 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57    Select *p,.  W
f570: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
f580: 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ,.  int regGosub
f590: 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  , .  int addrGos
f5a0: 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ub.){.  Window *
f5b0: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
f5c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
f5d0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
f5e0: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 46 6c  se);.  int regFl
f5f0: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
f600: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
f610: 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  er for "Gosub fl
f620: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
f630: 2f 0a 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b  /..  int regArg;
f640: 0a 20 20 69 6e 74 20 63 73 72 43 75 72 72 65 6e  .  int csrCurren
f650: 74 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  t = pMWin->iEphC
f660: 73 72 3b 0a 20 20 69 6e 74 20 63 73 72 57 72 69  sr;.  int csrWri
f670: 74 65 20 3d 20 63 73 72 43 75 72 72 65 6e 74 2b  te = csrCurrent+
f680: 31 3b 0a 20 20 69 6e 74 20 63 73 72 53 74 61 72  1;.  int csrStar
f690: 74 20 3d 20 63 73 72 43 75 72 72 65 6e 74 2b 32  t = csrCurrent+2
f6a0: 3b 0a 20 20 69 6e 74 20 63 73 72 45 6e 64 20 3d  ;.  int csrEnd =
f6b0: 20 63 73 72 43 75 72 72 65 6e 74 2b 33 3b 0a 0a   csrCurrent+3;..
f6c0: 20 20 69 6e 74 20 72 65 67 53 74 61 72 74 3b 20    int regStart; 
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
f6f0: 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
f700: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 3b  */.  int regEnd;
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
f730: 66 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  f <expr> FOLLOWI
f740: 4e 47 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 53 75  NG */..  int iSu
f750: 62 43 73 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  bCsr = p->pSrc->
f760: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
f770: 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53  int nSub = p->pS
f780: 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e  rc->a[0].pTab->n
f790: 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b 3b 0a 0a 20  Col;.  int k;.. 
f7a0: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 0a 20   int addrGoto;. 
f7b0: 20 69 6e 74 20 61 64 64 72 49 66 3b 0a 20 20 69   int addrIf;.  i
f7c0: 6e 74 20 61 64 64 72 49 66 45 6e 64 3b 0a 20 20  nt addrIfEnd;.  
f7d0: 69 6e 74 20 61 64 64 72 49 66 53 74 61 72 74 3b  int addrIfStart;
f7e0: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
f7f0: 46 6c 75 73 68 3b 0a 20 20 69 6e 74 20 61 64 64  Flush;.  int add
f800: 72 49 6e 74 65 67 65 72 3b 0a 20 20 69 6e 74 20  rInteger;.  int 
f810: 61 64 64 72 43 61 63 68 65 52 65 77 69 6e 64 3b  addrCacheRewind;
f820: 0a 20 20 69 6e 74 20 61 64 64 72 43 61 63 68 65  .  int addrCache
f830: 4e 65 78 74 3b 0a 0a 20 20 69 6e 74 20 61 64 64  Next;..  int add
f840: 72 53 68 6f 72 74 63 75 74 20 3d 20 30 3b 0a 0a  rShortcut = 0;..
f850: 20 20 69 6e 74 20 62 43 61 63 68 65 20 3d 20 77    int bCache = w
f860: 69 6e 64 6f 77 43 61 63 68 65 50 61 72 74 69 74  indowCachePartit
f870: 69 6f 6e 28 70 4d 57 69 6e 29 3b 0a 0a 20 20 69  ion(pMWin);..  i
f880: 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d  nt reg = pParse-
f890: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72  >nMem+1;.  int r
f8a0: 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e  egRecord = reg+n
f8b0: 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Sub;.  int regRo
f8c0: 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b  wid = regRecord+
f8d0: 31 3b 0a 0a 20 20 62 43 61 63 68 65 20 3d 20 31  1;..  bCache = 1
f8e0: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ;..  pParse->nMe
f8f0: 6d 20 2b 3d 20 31 20 2b 20 6e 53 75 62 20 2b 20  m += 1 + nSub + 
f900: 31 3b 0a 0a 20 20 72 65 67 46 6c 75 73 68 50 61  1;..  regFlushPa
f910: 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rt = ++pParse->n
f920: 4d 65 6d 3b 0a 20 20 72 65 67 53 74 61 72 74 20  Mem;.  regStart 
f930: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
f940: 3b 0a 20 20 72 65 67 45 6e 64 20 3d 20 2b 2b 70  ;.  regEnd = ++p
f950: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
f960: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
f970: 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
f980: 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ING .       || p
f990: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f9a0: 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20  _CURRENT .      
f9b0: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
f9c0: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
f9d0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
f9e0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
f9f0: 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61  OUNDED .  );.  a
fa00: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
fa10: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
fa20: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
fa30: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
fa40: 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ENT .       || p
fa50: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
fa60: 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 20 20  NBOUNDED .      
fa70: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
fa80: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20  =TK_PRECEDING . 
fa90: 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74   );..  /* Load t
faa0: 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  he column values
fab0: 20 66 6f 72 20 74 68 65 20 72 6f 77 20 72 65 74   for the row ret
fac0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 75 62  urned by the sub
fad0: 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 69 6e 74  -select.  ** int
fae0: 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  o an array of re
faf0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
fb00: 20 61 74 20 72 65 67 2e 20 41 73 73 65 6d 62 6c   at reg. Assembl
fb10: 65 20 74 68 65 6d 20 69 6e 74 6f 0a 20 20 2a 2a  e them into.  **
fb20: 20 61 20 72 65 63 6f 72 64 20 69 6e 20 72 65 67   a record in reg
fb30: 69 73 74 65 72 20 72 65 67 52 65 63 6f 72 64 2e  ister regRecord.
fb40: 20 54 4f 44 4f 3a 20 41 6e 20 6f 70 74 69 6d 69   TODO: An optimi
fb50: 7a 61 74 69 6f 6e 20 68 65 72 65 3f 20 2a 2f 0a  zation here? */.
fb60: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75    for(k=0; k<nSu
fb70: 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  b; k++){.    sql
fb80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fb90: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75  , OP_Column, iSu
fba0: 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b  bCsr, k, reg+k);
fbb0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
fbc0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
fbd0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20  akeRecord, reg, 
fbe0: 6e 53 75 62 2c 20 72 65 67 52 65 63 6f 72 64 29  nSub, regRecord)
fbf0: 3b 0a 0a 20 20 2f 2a 20 41 6e 20 69 6e 70 75 74  ;..  /* An input
fc00: 20 72 6f 77 20 68 61 73 20 6a 75 73 74 20 62 65   row has just be
fc10: 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 61 6e 20  en read into an 
fc20: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
fc30: 72 73 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  rs starting.  **
fc40: 20 61 74 20 72 65 67 2e 20 49 66 20 74 68 65 20   at reg. If the 
fc50: 77 69 6e 64 6f 77 20 68 61 73 20 61 20 50 41 52  window has a PAR
fc60: 54 49 54 49 4f 4e 20 63 6c 61 75 73 65 2c 20 74  TITION clause, t
fc70: 68 69 73 20 62 6c 6f 63 6b 20 67 65 6e 65 72 61  his block genera
fc80: 74 65 73 20 0a 20 20 2a 2a 20 56 4d 20 63 6f 64  tes .  ** VM cod
fc90: 65 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  e to check if th
fca0: 65 20 69 6e 70 75 74 20 72 6f 77 20 69 73 20 74  e input row is t
fcb0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65  he start of a ne
fcc0: 77 20 70 61 72 74 69 74 69 6f 6e 2e 0a 20 20 2a  w partition..  *
fcd0: 2a 20 49 66 20 73 6f 2c 20 69 74 20 64 6f 65 73  * If so, it does
fce0: 20 61 6e 20 4f 50 5f 47 6f 73 75 62 20 74 6f 20   an OP_Gosub to 
fcf0: 61 6e 20 61 64 64 72 65 73 73 20 74 6f 20 62 65  an address to be
fd00: 20 66 69 6c 6c 65 64 20 69 6e 20 6c 61 74 65 72   filled in later
fd10: 2e 20 54 68 65 0a 20 20 2a 2a 20 61 64 64 72 65  . The.  ** addre
fd20: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 47 6f 73  ss of the OP_Gos
fd30: 75 62 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ub is stored in 
fd40: 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 61  local variable a
fd50: 64 64 72 47 6f 73 75 62 46 6c 75 73 68 2e 0a 20  ddrGosubFlush.. 
fd60: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
fd70: 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20  >pPartition ){. 
fd80: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
fd90: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
fda0: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
fdb0: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50  tion;.    int nP
fdc0: 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78  art = pPart->nEx
fdd0: 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e  pr;.    int regN
fde0: 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70  ewPart = reg + p
fdf0: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
fe00: 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
fe10: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
fe20: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
fe30: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61  List(pParse, pPa
fe40: 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rt, 0, 0);..    
fe50: 61 64 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33  addrIf = sqlite3
fe60: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fe70: 5f 49 66 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46  _If, pMWin->regF
fe80: 69 72 73 74 29 3b 0a 20 20 20 20 61 64 64 72 20  irst);.    addr 
fe90: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fea0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
feb0: 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  e, regNewPart, p
fec0: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e  MWin->regPart, n
fed0: 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Part);.    sqlit
fee0: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
fef0: 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
ff00: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
ff10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ff20: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
ff30: 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34  , addr+2, addr+4
ff40: 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 56  , addr+2);.    V
ff50: 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28  dbeCoverageEqNe(
ff60: 76 29 3b 0a 20 20 20 20 61 64 64 72 47 6f 73 75  v);.    addrGosu
ff70: 62 46 6c 75 73 68 20 3d 20 73 71 6c 69 74 65 33  bFlush = sqlite3
ff80: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ff90: 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68  _Gosub, regFlush
ffa0: 50 61 72 74 29 3b 0a 20 20 20 20 56 64 62 65 43  Part);.    VdbeC
ffb0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c  omment((v, "call
ffc0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
ffd0: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
ffe0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
fff0: 61 64 64 72 49 66 29 3b 0a 20 20 20 20 73 71 6c  addrIf);.    sql
10000 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10010 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
10020 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  wPart, pMWin->re
10030 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b  gPart, nPart-1);
10040 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72  .  }..  /* Inser
10050 74 20 74 68 65 20 6e 65 77 20 72 6f 77 20 69 6e  t the new row in
10060 74 6f 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  to the ephemeral
10070 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
10080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10090 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 63 73   OP_NewRowid, cs
100a0 72 57 72 69 74 65 2c 20 72 65 67 52 6f 77 69 64  rWrite, regRowid
100b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
100c0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
100d0 65 72 74 2c 20 63 73 72 57 72 69 74 65 2c 20 72  ert, csrWrite, r
100e0 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  egRecord, regRow
100f0 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
10100 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
10110 64 64 49 6d 6d 2c 20 70 4d 57 69 6e 2d 3e 72 65  ddImm, pMWin->re
10120 67 53 69 7a 65 2c 20 31 29 3b 0a 0a 20 20 69 66  gSize, 1);..  if
10130 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ( bCache ){.    
10140 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10150 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10160 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69   0, pMWin->regFi
10170 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rst);.    sqlite
10180 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
10190 29 3b 0a 20 20 20 20 61 64 64 72 49 6e 74 65 67  );.    addrInteg
101a0 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  er = sqlite3Vdbe
101b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
101c0 65 67 65 72 2c 20 30 2c 20 72 65 67 46 6c 75 73  eger, 0, regFlus
101d0 68 50 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20  hPart);.    if( 
101e0 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
101f0 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
10200 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10210 2c 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68  , addrGosubFlush
10220 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  );.    }.    add
10230 72 43 61 63 68 65 52 65 77 69 6e 64 20 3d 20 73  rCacheRewind = s
10240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10250 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
10260 73 72 57 72 69 74 65 29 3b 0a 20 20 7d 65 6c 73  srWrite);.  }els
10270 65 7b 0a 20 20 20 20 61 64 64 72 49 66 20 3d 20  e{.    addrIf = 
10280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10290 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70  1(v, OP_IfNot, p
102a0 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73 74 29 3b  MWin->regFirst);
102b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
102c0 62 6c 6f 63 6b 20 69 73 20 72 75 6e 20 66 6f 72  block is run for
102d0 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f   the first row o
102e0 66 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e  f each partition
102f0 20 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20 77   */.  regArg = w
10300 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70  indowInitAccum(p
10310 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a  Parse, pMWin);..
10320 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10330 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
10340 3e 70 53 74 61 72 74 2c 20 72 65 67 53 74 61 72  >pStart, regStar
10350 74 29 3b 0a 20 20 77 69 6e 64 6f 77 43 68 65 63  t);.  windowChec
10360 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73 65  kIntValue(pParse
10370 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
10380 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10390 65 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d  e(pParse, pMWin-
103a0 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a  >pEnd, regEnd);.
103b0 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74    windowCheckInt
103c0 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65  Value(pParse, re
103d0 67 45 6e 64 2c 20 31 29 3b 0a 0a 20 20 69 66 28  gEnd, 1);..  if(
103e0 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
103f0 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20  TK_FOLLOWING || 
10400 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
10410 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20  PRECEDING ){.   
10420 20 69 6e 74 20 6f 70 20 3d 20 28 28 70 4d 57 69   int op = ((pMWi
10430 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
10440 4c 4c 4f 57 49 4e 47 29 20 3f 20 4f 50 5f 47 65  LLOWING) ? OP_Ge
10450 20 3a 20 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 69   : OP_Le);.    i
10460 6e 74 20 61 64 64 72 47 65 20 3d 20 73 71 6c 69  nt addrGe = sqli
10470 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10480 20 6f 70 2c 20 72 65 67 53 74 61 72 74 2c 20 30   op, regStart, 0
10490 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77  , regEnd);.    w
104a0 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
104b0 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b  arse, pMWin, 0);
104c0 0a 20 20 20 20 69 66 28 20 62 43 61 63 68 65 20  .    if( bCache 
104d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
104e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
104f0 5f 52 6f 77 69 64 2c 20 63 73 72 57 72 69 74 65  _Rowid, csrWrite
10500 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10510 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10520 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45 78  dOp3(v, OP_NotEx
10530 69 73 74 73 2c 20 63 73 72 43 75 72 72 65 6e 74  ists, csrCurrent
10540 2c 20 30 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 0, regRowid);.
10550 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75        windowRetu
10560 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c  rnOneRow(pParse,
10570 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75 62   pMWin, regGosub
10580 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20  , addrGosub);.  
10590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
105a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
105b0 2c 20 63 73 72 57 72 69 74 65 2c 20 61 64 64 72  , csrWrite, addr
105c0 43 61 63 68 65 52 65 77 69 6e 64 2b 31 29 3b 0a  CacheRewind+1);.
105d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
105e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
105f0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
10600 20 63 73 72 43 75 72 72 65 6e 74 2c 20 31 29 3b   csrCurrent, 1);
10610 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65 74  .      windowRet
10620 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65  urnOneRow(pParse
10630 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75  , pMWin, regGosu
10640 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
10650 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10660 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
10670 65 74 53 6f 72 74 65 72 2c 20 63 73 72 43 75 72  etSorter, csrCur
10680 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rent);.    }.   
10690 20 61 64 64 72 53 68 6f 72 74 63 75 74 20 3d 20   addrShortcut = 
106a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
106b0 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
106c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
106d0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 65  mpHere(v, addrGe
106e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  );.  }.  if( pMW
106f0 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
10700 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
10710 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10720 33 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74  3(v, OP_Subtract
10730 2c 20 72 65 67 53 74 61 72 74 2c 20 72 65 67 45  , regStart, regE
10740 6e 64 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20  nd, regStart);. 
10750 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62   }..  sqlite3Vdb
10760 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
10770 77 69 6e 64 2c 20 63 73 72 53 74 61 72 74 2c 20  wind, csrStart, 
10780 31 29 3b 20 20 20 73 71 6c 69 74 65 33 56 64 62  1);   sqlite3Vdb
10790 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
107a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
107b0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
107c0 64 2c 20 63 73 72 43 75 72 72 65 6e 74 2c 20 31  d, csrCurrent, 1
107d0 29 3b 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  ); sqlite3VdbeCh
107e0 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
107f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10800 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
10810 63 73 72 45 6e 64 2c 20 31 29 3b 20 73 71 6c 69  csrEnd, 1); sqli
10820 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
10830 76 2c 20 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  v, 1);..  sqlite
10840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10850 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d  P_Integer, 0, pM
10860 57 69 6e 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a  Win->regFirst);.
10870 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c    addrGoto = sql
10880 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
10890 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f  , OP_Goto);..  /
108a0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
108b0 72 75 6e 20 66 6f 72 20 74 68 65 20 73 65 63 6f  run for the seco
108c0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
108d0 74 20 72 6f 77 73 20 6f 66 20 65 61 63 68 20 70  t rows of each p
108e0 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  artition */.  if
108f0 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ( bCache ){.    
10900 61 64 64 72 43 61 63 68 65 4e 65 78 74 20 3d 20  addrCacheNext = 
10910 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10920 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 65 6c  ntAddr(v);.  }el
10930 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
10940 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
10950 64 64 72 49 66 29 3b 0a 20 20 7d 0a 0a 20 20 69  ddrIf);.  }..  i
10960 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
10970 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
10980 7b 0a 20 20 20 20 61 64 64 72 49 66 45 6e 64 20  {.    addrIfEnd 
10990 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
109a0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
109b0 20 72 65 67 45 6e 64 2c 20 30 2c 20 31 29 3b 0a   regEnd, 0, 1);.
109c0 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e      windowAggFin
109d0 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  al(pParse, pMWin
109e0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
109f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10a00 50 5f 4e 65 78 74 2c 20 63 73 72 43 75 72 72 65  P_Next, csrCurre
10a10 6e 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  nt, sqlite3VdbeC
10a20 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 29  urrentAddr(v)+1)
10a30 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75  ;.    windowRetu
10a40 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c  rnOneRow(pParse,
10a50 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75 62   pMWin, regGosub
10a60 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20  , addrGosub);.  
10a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10a80 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 45  pHere(v, addrIfE
10a90 6e 64 29 3b 0a 0a 20 20 20 20 61 64 64 72 49 66  nd);..    addrIf
10aa0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
10ab0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10ac0 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c  IfPos, regStart,
10ad0 20 30 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   0, 1);.    sqli
10ae0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10af0 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74 61   OP_Next, csrSta
10b00 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt, sqlite3VdbeC
10b10 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 29  urrentAddr(v)+1)
10b20 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53  ;.    windowAggS
10b30 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
10b40 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c 20  n, csrStart, 1, 
10b50 72 65 67 41 72 67 2c 20 70 4d 57 69 6e 2d 3e 72  regArg, pMWin->r
10b60 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c  egSize);.    sql
10b70 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10b80 28 76 2c 20 61 64 64 72 49 66 53 74 61 72 74 29  (v, addrIfStart)
10b90 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20  ;.  }else.  if( 
10ba0 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
10bb0 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20  PRECEDING ){.   
10bc0 20 61 64 64 72 49 66 45 6e 64 20 3d 20 73 71 6c   addrIfEnd = sql
10bd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10be0 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45  , OP_IfPos, regE
10bf0 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 73  nd, 0, 1);.    s
10c00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10c10 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72  (v, OP_Next, csr
10c20 45 6e 64 2c 20 73 71 6c 69 74 65 33 56 64 62 65  End, sqlite3Vdbe
10c30 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
10c40 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67  );.    windowAgg
10c50 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
10c60 69 6e 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72  in, csrEnd, 0, r
10c70 65 67 41 72 67 2c 20 70 4d 57 69 6e 2d 3e 72 65  egArg, pMWin->re
10c80 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69  gSize);.    sqli
10c90 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10ca0 76 2c 20 61 64 64 72 49 66 45 6e 64 29 3b 0a 0a  v, addrIfEnd);..
10cb0 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e      windowAggFin
10cc0 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  al(pParse, pMWin
10cd0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
10ce0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10cf0 50 5f 4e 65 78 74 2c 20 63 73 72 43 75 72 72 65  P_Next, csrCurre
10d00 6e 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  nt, sqlite3VdbeC
10d10 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 29  urrentAddr(v)+1)
10d20 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75  ;.    windowRetu
10d30 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c  rnOneRow(pParse,
10d40 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75 62   pMWin, regGosub
10d50 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20  , addrGosub);.. 
10d60 20 20 20 61 64 64 72 49 66 53 74 61 72 74 20 3d     addrIfStart =
10d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10d80 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
10d90 72 65 67 53 74 61 72 74 2c 20 30 2c 20 31 29 3b  regStart, 0, 1);
10da0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10db0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
10dc0 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c  t, csrStart, sql
10dd0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10de0 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20 77  ddr(v)+1);.    w
10df0 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
10e00 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 53  rse, pMWin, csrS
10e10 74 61 72 74 2c 20 31 2c 20 72 65 67 41 72 67 2c  tart, 1, regArg,
10e20 20 70 4d 57 69 6e 2d 3e 72 65 67 53 69 7a 65 29   pMWin->regSize)
10e30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10e40 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10e50 72 49 66 53 74 61 72 74 29 3b 0a 20 20 7d 65 6c  rIfStart);.  }el
10e60 73 65 7b 0a 20 20 20 20 61 64 64 72 49 66 45 6e  se{.    addrIfEn
10e70 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  d = sqlite3VdbeA
10e80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
10e90 73 2c 20 72 65 67 45 6e 64 2c 20 30 2c 20 31 29  s, regEnd, 0, 1)
10ea0 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46  ;.    windowAggF
10eb0 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57  inal(pParse, pMW
10ec0 69 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  in, 0);.    sqli
10ed0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10ee0 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 43 75 72   OP_Next, csrCur
10ef0 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 56 64 62  rent, sqlite3Vdb
10f00 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
10f10 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52 65  1);.    windowRe
10f20 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73  turnOneRow(pPars
10f30 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73  e, pMWin, regGos
10f40 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
10f50 20 20 20 20 61 64 64 72 49 66 53 74 61 72 74 20      addrIfStart 
10f60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10f70 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
10f80 20 72 65 67 53 74 61 72 74 2c 20 30 2c 20 31 29   regStart, 0, 1)
10f90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10fa0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10fb0 78 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71  xt, csrStart, sq
10fc0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10fd0 41 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20  Addr(v)+1);.    
10fe0 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
10ff0 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
11000 53 74 61 72 74 2c 20 31 2c 20 72 65 67 41 72 67  Start, 1, regArg
11010 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 69 7a 65  , pMWin->regSize
11020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11030 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
11040 64 72 49 66 53 74 61 72 74 29 3b 0a 20 20 20 20  drIfStart);.    
11050 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11060 65 72 65 28 76 2c 20 61 64 64 72 49 66 45 6e 64  ere(v, addrIfEnd
11070 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
11080 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11090 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20 69 66   addrGoto);.  if
110a0 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54  ( pMWin->eEnd!=T
110b0 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20  K_PRECEDING ){. 
110c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
110d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
110e0 20 63 73 72 45 6e 64 2c 20 73 71 6c 69 74 65 33   csrEnd, sqlite3
110f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
11100 76 29 2b 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f  v)+1);.    windo
11110 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
11120 20 70 4d 57 69 6e 2c 20 63 73 72 45 6e 64 2c 20   pMWin, csrEnd, 
11130 30 2c 20 72 65 67 41 72 67 2c 20 70 4d 57 69 6e  0, regArg, pMWin
11140 2d 3e 72 65 67 53 69 7a 65 29 3b 0a 20 20 7d 0a  ->regSize);.  }.
11150 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  .  /* End of the
11160 20 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f 6f 70   main input loop
11170 20 2a 2f 0a 20 20 69 66 28 20 62 43 61 63 68 65   */.  if( bCache
11180 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11190 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
111a0 4e 65 78 74 2c 20 63 73 72 57 72 69 74 65 2c 20  Next, csrWrite, 
111b0 61 64 64 72 43 61 63 68 65 4e 65 78 74 29 3b 0a  addrCacheNext);.
111c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
111d0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 43  umpHere(v, addrC
111e0 61 63 68 65 52 65 77 69 6e 64 29 3b 20 0a 20 20  acheRewind); .  
111f0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 61  }else{.    if( a
11200 64 64 72 53 68 6f 72 74 63 75 74 3e 30 20 29 20  ddrShortcut>0 ) 
11210 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11220 65 72 65 28 76 2c 20 61 64 64 72 53 68 6f 72 74  ere(v, addrShort
11230 63 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  cut);.    sqlite
11240 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
11250 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 6c  );.  }..  /* Fal
11260 6c 20 74 68 72 6f 75 67 68 20 2a 2f 0a 0a 20 20  l through */..  
11270 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  if( pMWin->pPart
11280 69 74 69 6f 6e 20 26 26 20 62 43 61 63 68 65 3d  ition && bCache=
11290 3d 30 20 29 7b 0a 20 20 20 20 61 64 64 72 49 6e  =0 ){.    addrIn
112a0 74 65 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56  teger = sqlite3V
112b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
112c0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 46  Integer, 0, regF
112d0 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20 73  lushPart);.    s
112e0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
112f0 72 65 28 76 2c 20 61 64 64 72 47 6f 73 75 62 46  re(v, addrGosubF
11300 6c 75 73 68 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  lush);.  }..  if
11310 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
11320 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
11330 0a 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65  .    int addrBre
11340 61 6b 3b 0a 20 20 20 20 61 64 64 72 49 66 45 6e  ak;.    addrIfEn
11350 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  d = sqlite3VdbeA
11360 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
11370 73 2c 20 72 65 67 45 6e 64 2c 20 30 2c 20 31 29  s, regEnd, 0, 1)
11380 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
11390 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
113a0 78 74 2c 20 63 73 72 43 75 72 72 65 6e 74 2c 20  xt, csrCurrent, 
113b0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
113c0 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
113d0 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
113e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
113f0 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
11400 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
11410 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30  pParse, pMWin, 0
11420 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74  );.    windowRet
11430 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65  urnOneRow(pParse
11440 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75  , pMWin, regGosu
11450 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
11460 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11470 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
11480 45 6e 64 29 3b 0a 0a 20 20 20 20 61 64 64 72 49  End);..    addrI
11490 66 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  fStart = sqlite3
114a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
114b0 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74  _IfPos, regStart
114c0 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , 0, 1);.    sql
114d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
114e0 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74  , OP_Next, csrSt
114f0 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  art, sqlite3Vdbe
11500 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
11510 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11520 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
11530 6f 74 6f 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  oto);.    window
11540 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
11550 70 4d 57 69 6e 2c 20 63 73 72 53 74 61 72 74 2c  pMWin, csrStart,
11560 20 31 2c 20 72 65 67 41 72 67 2c 20 70 4d 57 69   1, regArg, pMWi
11570 6e 2d 3e 72 65 67 53 69 7a 65 29 3b 0a 20 20 20  n->regSize);.   
11580 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11590 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 53 74  Here(v, addrIfSt
115a0 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
115b0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
115c0 20 61 64 64 72 49 66 53 74 61 72 74 2b 32 29 3b   addrIfStart+2);
115d0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
115e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
115f0 74 6f 2c 20 30 2c 20 61 64 64 72 49 66 45 6e 64  to, 0, addrIfEnd
11600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11610 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
11620 64 72 42 72 65 61 6b 29 3b 0a 20 20 7d 65 6c 73  drBreak);.  }els
11630 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
11640 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
11650 65 78 74 2c 20 63 73 72 43 75 72 72 65 6e 74 2c  ext, csrCurrent,
11660 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
11670 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
11680 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71     addrGoto = sq
11690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
116a0 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
116b0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
116c0 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
116d0 7b 0a 20 20 20 20 20 20 61 64 64 72 49 66 45 6e  {.      addrIfEn
116e0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  d = sqlite3VdbeA
116f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
11700 73 2c 20 72 65 67 45 6e 64 2c 20 30 2c 20 31 29  s, regEnd, 0, 1)
11710 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11720 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11730 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c 20 73 71  Next, csrEnd, sq
11740 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
11750 41 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20  Addr(v)+1);.    
11760 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
11770 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
11780 73 72 45 6e 64 2c 20 30 2c 20 72 65 67 41 72 67  srEnd, 0, regArg
11790 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 69 7a 65  , pMWin->regSize
117a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
117b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
117c0 61 64 64 72 49 66 45 6e 64 29 3b 0a 20 20 20 20  addrIfEnd);.    
117d0 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
117e0 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
117f0 30 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77  0);.      window
11800 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61  ReturnOneRow(pPa
11810 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47  rse, pMWin, regG
11820 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
11830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11840 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61     windowAggFina
11850 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  l(pParse, pMWin,
11860 20 30 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f   0);.      windo
11870 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50  wReturnOneRow(pP
11880 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67  arse, pMWin, reg
11890 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
118a0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 66 53  );.      addrIfS
118b0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
118c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
118d0 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c 20  fPos, regStart, 
118e0 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 1);.      sql
118f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11900 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74  , OP_Next, csrSt
11910 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  art, sqlite3Vdbe
11920 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
11930 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41  );.      windowA
11940 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
11950 4d 57 69 6e 2c 20 63 73 72 53 74 61 72 74 2c 20  MWin, csrStart, 
11960 31 2c 20 72 65 67 41 72 67 2c 20 70 4d 57 69 6e  1, regArg, pMWin
11970 2d 3e 72 65 67 53 69 7a 65 29 3b 0a 20 20 20 20  ->regSize);.    
11980 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
11990 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 53  pHere(v, addrIfS
119a0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
119b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
119c0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
119d0 64 72 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 7d  drGoto-1);.    }
119e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
119f0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
11a00 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Goto);.  }...  i
11a10 66 28 20 62 43 61 63 68 65 20 26 26 20 61 64 64  f( bCache && add
11a20 72 53 68 6f 72 74 63 75 74 3e 30 20 29 20 73 71  rShortcut>0 ) sq
11a30 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11a40 65 28 76 2c 20 61 64 64 72 53 68 6f 72 74 63 75  e(v, addrShortcu
11a50 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
11a60 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
11a70 73 65 74 53 6f 72 74 65 72 2c 20 63 73 72 43 75  setSorter, csrCu
11a80 72 72 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  rrent);.  sqlite
11a90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11aa0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d  P_Integer, 0, pM
11ab0 57 69 6e 2d 3e 72 65 67 53 69 7a 65 29 3b 0a 20  Win->regSize);. 
11ac0 20 69 66 28 20 62 43 61 63 68 65 3d 3d 30 20 29   if( bCache==0 )
11ad0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11ae0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
11af0 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46  , 1, pMWin->regF
11b00 69 72 73 74 29 3b 0a 20 20 69 66 28 20 70 4d 57  irst);.  if( pMW
11b10 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29  in->pPartition )
11b20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11b30 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61 64 64  eChangeP1(v, add
11b40 72 49 6e 74 65 67 65 72 2c 20 73 71 6c 69 74 65  rInteger, sqlite
11b50 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11b60 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (v));.    sqlite
11b70 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11b80 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75  P_Return, regFlu
11b90 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  shPart);.  }.}..
11ba0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11bb0 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ion does the wor
11bc0 6b 20 6f 66 20 73 71 6c 69 74 65 33 57 69 6e 64  k of sqlite3Wind
11bd0 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72  owCodeStep() for
11be0 20 63 61 73 65 73 20 74 68 61 74 0a 2a 2a 20 77   cases that.** w
11bf0 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
11c00 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69 6e 64   handled by wind
11c10 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
11c20 70 28 29 20 77 68 65 6e 20 74 68 65 72 65 20 61  p() when there a
11c30 72 65 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72  re.** one or mor
11c40 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
11c50 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w-functions that
11c60 20 72 65 71 75 69 72 65 20 74 68 65 20 65 6e 74   require the ent
11c70 69 72 65 20 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ire partition.**
11c80 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 69 6e   to be cached in
11c90 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65   a temp table be
11ca0 66 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 63 61  fore any rows ca
11cb0 6e 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 41  n be returned. A
11cc0 64 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a 2a 2a 20  dditionally..** 
11cd0 22 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43  "RANGE BETWEEN C
11ce0 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
11cf0 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
11d00 4e 47 22 20 69 73 20 61 6c 77 61 79 73 20 68 61  NG" is always ha
11d10 6e 64 6c 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  ndled by.** this
11d20 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
11d30 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 63 6f 72   Pseudo-code cor
11d40 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
11d50 65 20 56 4d 20 63 6f 64 65 20 67 65 6e 65 72 61  e VM code genera
11d60 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
11d70 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61 63 68  tion.** for each
11d80 20 74 79 70 65 20 6f 66 20 77 69 6e 64 6f 77 20   type of window 
11d90 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
11da0 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
11db0 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
11dc0 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
11dd0 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70  .**.**   flush_p
11de0 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20  artition:.**    
11df0 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20   Once {.**      
11e00 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
11e10 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a  r -> csrLead).**
11e20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 49 6e       }.**     In
11e30 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20  teger ctr 0.**  
11e40 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28     foreach row (
11e50 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20  csrLead){.**    
11e60 20 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20     if( new peer 
11e70 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
11e80 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a  gFinal (xValue).
11e90 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  **         for(i
11ea0 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b  =0; i<ctr; i++){
11eb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f  .**           Go
11ec0 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
11ed0 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20             Next 
11ee0 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20  iEphCsr.**      
11ef0 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
11f00 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a  Integer ctr 0.**
11f10 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
11f20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65    AggStep (csrLe
11f30 61 64 29 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63  ad).**       Inc
11f40 72 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  r ctr.**     }.*
11f50 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61  *.**     AggFina
11f60 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a  l (xFinalize).**
11f70 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11f80 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20  ctr; i++){.**   
11f90 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
11fa0 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  sub.**       Nex
11fb0 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20  t iEphCsr.**    
11fc0 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73   }.**.**     Res
11fd0 65 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a  etSorter (csr).*
11fe0 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a  *     Return.**.
11ff0 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
12000 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
12010 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
12020 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61  ROW.**.**   As a
12030 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
12040 74 20 74 68 65 20 22 69 66 28 20 6e 65 77 20 70  t the "if( new p
12050 65 65 72 20 29 22 20 62 72 61 6e 63 68 20 69 73  eer )" branch is
12060 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e 0a 2a   always taken..*
12070 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
12080 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
12090 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
120a0 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  **.**   As above
120b0 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 65 61  , except that ea
120c0 63 68 20 6f 66 20 74 68 65 20 66 6f 72 28 29 20  ch of the for() 
120d0 6c 6f 6f 70 73 20 62 65 63 6f 6d 65 73 3a 0a 2a  loops becomes:.*
120e0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  *.**         for
120f0 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b  (i=0; i<ctr; i++
12100 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
12110 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
12120 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
12130 49 6e 76 65 72 73 65 20 28 69 45 70 68 43 73 72  Inverse (iEphCsr
12140 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  ).**           N
12150 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20  ext iEphCsr.**  
12160 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52         }.**.** R
12170 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
12180 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
12190 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
121a0 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
121b0 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
121c0 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a  :.**     Once {.
121d0 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70  **       OpenDup
121e0 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72   (iEphCsr -> csr
121f0 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a  Lead).**     }.*
12200 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  *     foreach ro
12210 77 20 28 63 73 72 4c 65 61 64 29 20 7b 0a 2a 2a  w (csrLead) {.**
12220 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
12230 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20  csrLead).**     
12240 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  }.**     foreach
12250 20 72 6f 77 20 28 69 45 70 68 43 73 72 29 20 7b   row (iEphCsr) {
12260 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
12270 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
12280 20 7d 0a 2a 2a 20 0a 2a 2a 20 52 41 4e 47 45 20   }.** .** RANGE 
12290 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
122a0 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
122b0 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  D FOLLOWING.**.*
122c0 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74  *   flush_partit
122d0 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65  ion:.**     Once
122e0 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e   {.**       Open
122f0 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20  Dup (iEphCsr -> 
12300 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20  csrLead).**     
12310 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  }.**     foreach
12320 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a   row (csrLead){.
12330 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70  **       AggStep
12340 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20   (csrLead).**   
12350 20 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e    }.**     Rewin
12360 64 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  d (csrLead).**  
12370 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20 30     Integer ctr 0
12380 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20  .**     foreach 
12390 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a 2a  row (csrLead){.*
123a0 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
123b0 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20  peer ){.**      
123c0 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
123d0 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  lue).**         
123e0 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20  for(i=0; i<ctr; 
123f0 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  i++){.**        
12400 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
12410 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ub.**           
12420 41 67 67 49 6e 76 65 72 73 65 20 28 69 45 70 68  AggInverse (iEph
12430 43 73 72 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  Csr).**         
12440 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a    Next iEphCsr.*
12450 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
12460 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
12470 74 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  tr 0.**       }.
12480 2a 2a 20 20 20 20 20 20 20 49 6e 63 72 20 63 74  **       Incr ct
12490 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  r.**     }.**.**
124a0 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
124b0 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20  Finalize).**    
124c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
124d0 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
124e0 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
124f0 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 69 45  **       Next iE
12500 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  phCsr.**     }.*
12510 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f  *.**     ResetSo
12520 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20  rter (csr).**   
12530 20 20 52 65 74 75 72 6e 0a 2a 2f 0a 73 74 61 74    Return.*/.stat
12540 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f  ic void windowCo
12550 64 65 43 61 63 68 65 53 74 65 70 28 0a 20 20 50  deCacheStep(.  P
12560 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
12570 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68   Select *p,.  Wh
12580 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
12590 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
125a0 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75   .  int addrGosu
125b0 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  b.){.  Window *p
125c0 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
125d0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
125e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
125f0 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69  e);.  int k;.  i
12600 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70 72 4c  nt addr;.  ExprL
12610 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57  ist *pPart = pMW
12620 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a  in->pPartition;.
12630 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
12640 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f  erBy = pMWin->pO
12650 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 50  rderBy;.  int nP
12660 65 65 72 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  eer = pOrderBy ?
12670 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
12680 20 3a 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 4e   : 0;.  int regN
12690 65 77 50 65 65 72 3b 0a 0a 20 20 69 6e 74 20 61  ewPeer;..  int a
126a0 64 64 72 47 6f 74 6f 3b 20 20 20 20 20 20 20 20  ddrGoto;        
126b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
126c0 64 72 65 73 73 20 6f 66 20 47 6f 74 6f 20 75 73  dress of Goto us
126d0 65 64 20 74 6f 20 6a 75 6d 70 20 66 6c 75 73 68  ed to jump flush
126e0 5f 70 61 72 2e 2e 20 2a 2f 0a 20 20 69 6e 74 20  _par.. */.  int 
126f0 61 64 64 72 4e 65 78 74 3b 20 20 20 20 20 20 20  addrNext;       
12700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
12710 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78  ump here for nex
12720 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 6c  t iteration of l
12730 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  oop */.  int reg
12740 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69 6e 74  FlushPart;.  int
12750 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 0a 20   lblFlushPart;. 
12760 20 69 6e 74 20 63 73 72 4c 65 61 64 3b 0a 20 20   int csrLead;.  
12770 69 6e 74 20 72 65 67 43 74 72 3b 0a 20 20 69 6e  int regCtr;.  in
12780 74 20 72 65 67 41 72 67 3b 20 20 20 20 20 20 20  t regArg;       
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
127a0 20 52 65 67 69 73 74 65 72 20 61 72 72 61 79 20   Register array 
127b0 74 6f 20 6d 61 72 74 69 61 6c 20 66 75 6e 63 74  to martial funct
127c0 69 6f 6e 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e  ion args */.  in
127d0 74 20 72 65 67 53 69 7a 65 3b 0a 20 20 69 6e 74  t regSize;.  int
127e0 20 6c 62 6c 45 6d 70 74 79 3b 0a 20 20 69 6e 74   lblEmpty;.  int
127f0 20 62 52 65 76 65 72 73 65 20 3d 20 70 4d 57 69   bReverse = pMWi
12800 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26 26 20 70  n->pOrderBy && p
12810 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
12820 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20  _CURRENT .      
12830 20 20 20 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45      && pMWin->eE
12840 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
12850 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d  ;..  assert( (pM
12860 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
12870 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57  UNBOUNDED && pMW
12880 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
12890 52 45 4e 54 29 20 0a 20 20 20 20 20 20 20 7c 7c  RENT) .       ||
128a0 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
128b0 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26  =TK_UNBOUNDED &&
128c0 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
128d0 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20 20 20  _UNBOUNDED) .   
128e0 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
128f0 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
12900 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  T && pMWin->eEnd
12910 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20  ==TK_CURRENT) . 
12920 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d        || (pMWin-
12930 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
12940 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  ENT && pMWin->eE
12950 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
12960 29 20 0a 20 20 29 3b 0a 0a 20 20 6c 62 6c 45 6d  ) .  );..  lblEm
12970 70 74 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pty = sqlite3Vdb
12980 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
12990 65 29 3b 0a 20 20 72 65 67 4e 65 77 50 65 65 72  e);.  regNewPeer
129a0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
129b0 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  1;.  pParse->nMe
129c0 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a 20 20 2f  m += nPeer;..  /
129d0 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
129e0 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f  ter and label fo
129f0 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72  r the "flush_par
12a00 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74  tition" sub-rout
12a10 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75  ine. */.  regFlu
12a20 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73  shPart = ++pPars
12a30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c  e->nMem;.  lblFl
12a40 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65  ushPart = sqlite
12a50 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70  3VdbeMakeLabel(p
12a60 50 61 72 73 65 29 3b 0a 0a 20 20 63 73 72 4c 65  Parse);..  csrLe
12a70 61 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ad = pParse->nTa
12a80 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20 3d 20  b++;.  regCtr = 
12a90 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12aa0 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69  .  windowPartiti
12ab0 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  onCache(pParse, 
12ac0 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c  p, pWInfo, regFl
12ad0 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73  ushPart, lblFlus
12ae0 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29  hPart, &regSize)
12af0 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73  ;.  addrGoto = s
12b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
12b10 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20  (v, OP_Goto);.. 
12b20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c   /* Start of "fl
12b30 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
12b40 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
12b50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
12b60 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
12b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12b80 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c  2(v, OP_Once, 0,
12b90 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
12ba0 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
12bb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12bc0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12bd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
12be0 44 75 70 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d  Dup, csrLead, pM
12bf0 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a  Win->iEphCsr);..
12c00 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
12c10 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
12c20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
12c30 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
12c40 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
12c50 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
12c60 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
12c70 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
12c80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12c90 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
12ca0 65 67 43 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  egCtr);.  sqlite
12cb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12cc0 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61  P_Rewind, csrLea
12cd0 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  d, lblEmpty);.  
12ce0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
12cf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12d00 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
12d10 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
12d20 72 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  r, lblEmpty);.  
12d30 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
12d40 72 54 61 6b 65 6e 28 76 29 3b 0a 0a 20 20 69 66  rTaken(v);..  if
12d50 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20  ( bReverse ){.  
12d60 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20 73 71    int addr2 = sq
12d70 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12d80 41 64 64 72 28 76 29 3b 0a 20 20 20 20 77 69 6e  Addr(v);.    win
12d90 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
12da0 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61  e, pMWin, csrLea
12db0 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65  d, 0, regArg, re
12dc0 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69  gSize);.    sqli
12dd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12de0 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61   OP_Next, csrLea
12df0 64 2c 20 61 64 64 72 32 29 3b 0a 20 20 20 20 56  d, addr2);.    V
12e00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
12e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12e20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
12e30 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20 6c 62 6c  nd, csrLead, lbl
12e40 45 6d 70 74 79 29 3b 0a 20 20 20 20 56 64 62 65  Empty);.    Vdbe
12e50 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
12e60 65 6e 28 76 29 3b 0a 20 20 7d 0a 20 20 61 64 64  en(v);.  }.  add
12e70 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
12e80 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
12e90 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  );..  if( pOrder
12ea0 42 79 20 26 26 20 28 70 4d 57 69 6e 2d 3e 65 45  By && (pMWin->eE
12eb0 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c  nd==TK_CURRENT |
12ec0 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
12ed0 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 29 7b 0a  =TK_CURRENT) ){.
12ee0 20 20 20 20 69 6e 74 20 62 43 75 72 72 65 6e 74      int bCurrent
12ef0 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72   = (pMWin->eStar
12f00 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a  t==TK_CURRENT);.
12f10 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70      int addrJump
12f20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12f30 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
12f40 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 2a 2f  OP_Jump below */
12f50 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
12f60 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
12f70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66  ){.      int iOf
12f80 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  f = pMWin->nBuff
12f90 65 72 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f  erCol + (pPart ?
12fa0 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20   pPart->nExpr : 
12fb0 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  0);.      int re
12fc0 67 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72  gPeer = pMWin->r
12fd0 65 67 50 61 72 74 20 2b 20 28 70 50 61 72 74 20  egPart + (pPart 
12fe0 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a  ? pPart->nExpr :
12ff0 20 30 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e   0);.      KeyIn
13000 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
13010 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
13020 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
13030 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30  , pOrderBy, 0, 0
13040 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  );.      for(k=0
13050 3b 20 6b 3c 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b  ; k<nPeer; k++){
13060 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13070 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
13080 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 4c 65 61 64  _Column, csrLead
13090 2c 20 69 4f 66 66 2b 6b 2c 20 72 65 67 4e 65 77  , iOff+k, regNew
130a0 50 65 65 72 2b 6b 29 3b 0a 20 20 20 20 20 20 7d  Peer+k);.      }
130b0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
130c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
130d0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
130e0 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65  egNewPeer, regPe
130f0 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
13100 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
13110 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
13120 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
13130 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64  INFO);.      add
13140 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  rJump = sqlite3V
13150 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13160 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c  Jump, addr+2, 0,
13170 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
13180 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
131a0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
131b0 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  opy, regNewPeer,
131c0 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 2d   regPeer, nPeer-
131d0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77  1);.    }..    w
131e0 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28  indowReturnRows(
131f0 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72  pParse, pMWin, r
13200 65 67 43 74 72 2c 20 72 65 67 47 6f 73 75 62 2c  egCtr, regGosub,
13210 20 61 64 64 72 47 6f 73 75 62 2c 20 0a 20 20 20   addrGosub, .   
13220 20 20 20 20 20 28 62 43 75 72 72 65 6e 74 20 3f       (bCurrent ?
13230 20 72 65 67 41 72 67 20 3a 20 30 29 2c 20 28 62   regArg : 0), (b
13240 43 75 72 72 65 6e 74 20 3f 20 72 65 67 53 69 7a  Current ? regSiz
13250 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20  e : 0).    );.  
13260 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29    if( addrJump )
13270 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13280 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70  Here(v, addrJump
13290 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 52  );.  }..  if( bR
132a0 65 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  everse==0 ){.   
132b0 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
132c0 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
132d0 72 4c 65 61 64 2c 20 30 2c 20 72 65 67 41 72 67  rLead, 0, regArg
132e0 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 7d 0a  , regSize);.  }.
132f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13300 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
13310 2c 20 72 65 67 43 74 72 2c 20 31 29 3b 0a 20 20  , regCtr, 1);.  
13320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13330 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
13340 72 4c 65 61 64 2c 20 61 64 64 72 4e 65 78 74 29  rLead, addrNext)
13350 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
13360 28 76 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65  (v);..  windowRe
13370 74 75 72 6e 52 6f 77 73 28 70 50 61 72 73 65 2c  turnRows(pParse,
13380 20 70 4d 57 69 6e 2c 20 72 65 67 43 74 72 2c 20   pMWin, regCtr, 
13390 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
133a0 73 75 62 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73  sub, 0, 0);..  s
133b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
133c0 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70  eLabel(v, lblEmp
133d0 74 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ty);.  sqlite3Vd
133e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
133f0 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69  esetSorter, pMWi
13400 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73  n->iEphCsr);.  s
13410 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
13420 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
13430 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20  egFlushPart);.. 
13440 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
13450 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c   to skip over fl
13460 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f  ush_partition */
13470 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
13480 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
13490 74 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  to);.}.../*.** R
134a0 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
134b0 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
134c0 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
134d0 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20  .**.**   ....** 
134e0 20 20 20 20 69 66 28 20 6e 65 77 20 70 61 72 74      if( new part
134f0 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20  ition ){.**     
13500 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e    AggFinal (xFin
13510 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20  alize).**       
13520 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
13530 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74 53 6f  **       ResetSo
13540 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a  rter eph-table.*
13550 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65  *     }.**     e
13560 6c 73 65 20 69 66 28 20 6e 65 77 20 70 65 65 72  lse if( new peer
13570 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
13580 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
13590 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
135a0 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
135b0 20 52 65 73 65 74 53 6f 72 74 65 72 20 65 70 68   ResetSorter eph
135c0 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a  -table.**     }.
135d0 2a 2a 20 20 20 20 20 41 67 67 53 74 65 70 0a 2a  **     AggStep.*
135e0 2a 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65  *     Insert (re
135f0 63 6f 72 64 20 69 6e 74 6f 20 65 70 68 2d 74 61  cord into eph-ta
13600 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65  ble).**   sqlite
13610 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
13620 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
13630 6c 69 7a 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62  lize).**   Gosub
13640 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a   addrGosub.**.**
13650 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
13660 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
13670 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  NG AND UNBOUNDED
13680 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
13690 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
136a0 65 70 74 20 74 61 6b 65 20 6e 6f 20 61 63 74 69  ept take no acti
136b0 6f 6e 20 66 6f 72 20 61 20 22 6e 65 77 20 70 65  on for a "new pe
136c0 65 72 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20  er". Invoke.**  
136d0 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
136e0 20 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65   once only for e
136f0 61 63 68 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ach partition..*
13700 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
13710 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
13720 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
13730 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c  *.**   As above,
13740 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65   except that the
13750 20 22 6e 65 77 20 70 65 65 72 22 20 63 6f 6e 64   "new peer" cond
13760 69 74 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64  ition is handled
13770 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d   in the.**   sam
13780 65 20 77 61 79 20 61 73 20 22 6e 65 77 20 70 61  e way as "new pa
13790 72 74 69 74 69 6f 6e 22 20 28 73 6f 20 74 68 65  rtition" (so the
137a0 72 65 20 69 73 20 6e 6f 20 22 65 6c 73 65 20 69  re is no "else i
137b0 66 22 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a  f" block)..**.**
137c0 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
137d0 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
137e0 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
137f0 57 0a 2a 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62  W.** .**   As ab
13800 6f 76 65 2c 20 65 78 63 65 70 74 20 61 73 73 75  ove, except assu
13810 6d 65 20 65 76 65 72 79 20 72 6f 77 20 69 73 20  me every row is 
13820 61 20 22 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f  a "new peer"..*/
13830 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
13840 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
13850 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
13860 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
13870 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
13880 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
13890 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
138a0 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
138b0 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
138c0 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
138d0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
138e0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
138f0 20 6b 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73   k;.  int iSubCs
13900 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  r = p->pSrc->a[0
13910 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ].iCursor;.  int
13920 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   nSub = p->pSrc-
13930 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
13940 3b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50  ;.  int reg = pP
13950 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
13960 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
13970 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20  reg+nSub;.  int 
13980 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65  regRowid = regRe
13990 63 6f 72 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64  cord+1;.  int ad
139a0 64 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  dr;.  ExprList *
139b0 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70  pPart = pMWin->p
139c0 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70  Partition;.  Exp
139d0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
139e0 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
139f0 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d  y;..  assert( pM
13a00 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
13a10 41 4e 47 45 20 0a 20 20 20 20 20 20 7c 7c 20 28  ANGE .      || (
13a20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
13a30 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70  K_UNBOUNDED && p
13a40 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
13a50 55 52 52 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20  URRENT).  );..  
13a60 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e  assert( (pMWin->
13a70 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
13a80 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
13a90 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  End==TK_CURRENT)
13aa0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
13ab0 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
13ac0 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
13ad0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
13ae0 4e 44 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  NDED).       || 
13af0 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
13b00 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
13b10 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
13b20 52 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c  RRENT).       ||
13b30 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
13b40 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70  =TK_CURRENT && p
13b50 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
13b60 4e 42 4f 55 4e 44 45 44 20 26 26 20 21 70 4f 72  NBOUNDED && !pOr
13b70 64 65 72 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69  derBy).  );..  i
13b80 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
13b90 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
13ba0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
13bb0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d  ;.  }..  pParse-
13bc0 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20  >nMem += nSub + 
13bd0 32 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  2;..  /* Load th
13be0 65 20 69 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c  e individual col
13bf0 75 6d 6e 20 76 61 6c 75 65 73 20 6f 66 20 74 68  umn values of th
13c00 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  e row returned b
13c10 79 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 73  y.  ** the sub-s
13c20 65 6c 65 63 74 20 69 6e 74 6f 20 61 6e 20 61 72  elect into an ar
13c30 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
13c40 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  . */.  for(k=0; 
13c50 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20  k<nSub; k++){.  
13c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13c70 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
13c80 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65  , iSubCsr, k, re
13c90 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  g+k);.  }..  /* 
13ca0 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
13cb0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
13cc0 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 6f 72  new partition or
13cd0 20 70 65 65 72 20 67 72 6f 75 70 2e 20 2a 2f 0a   peer group. */.
13ce0 20 20 69 66 28 20 70 50 61 72 74 20 7c 7c 20 70    if( pPart || p
13cf0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
13d00 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 50 61 72  nt nPart = (pPar
13d10 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72  t ? pPart->nExpr
13d20 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 61   : 0);.    int a
13d30 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 20  ddrGoto = 0;.   
13d40 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20   int addrJump = 
13d50 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65 72  0;.    int nPeer
13d60 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70   = (pOrderBy ? p
13d70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
13d80 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50   0);..    if( pP
13d90 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  art ){.      int
13da0 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65   regNewPart = re
13db0 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  g + pMWin->nBuff
13dc0 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20 4b 65 79  erCol;.      Key
13dd0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
13de0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
13df0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
13e00 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29  se, pPart, 0, 0)
13e10 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
13e20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13e30 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
13e40 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
13e50 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72 74  n->regPart,nPart
13e60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13e70 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
13e80 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
13e90 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
13ea0 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73      addrJump = s
13eb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13ec0 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
13ed0 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b  r+2, 0, addr+2);
13ee0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
13ef0 61 67 65 45 71 4e 65 28 76 29 3b 0a 20 20 20 20  ageEqNe(v);.    
13f00 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
13f10 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
13f20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  1);.      if( pO
13f30 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
13f40 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c    addrGoto = sql
13f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
13f60 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
13f70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
13f80 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
13f90 20 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50       int regNewP
13fa0 65 65 72 20 3d 20 72 65 67 20 2b 20 70 4d 57 69  eer = reg + pMWi
13fb0 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20  n->nBufferCol + 
13fc0 6e 50 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  nPart;.      int
13fd0 20 72 65 67 50 65 65 72 20 3d 20 70 4d 57 69 6e   regPeer = pMWin
13fe0 2d 3e 72 65 67 50 61 72 74 20 2b 20 6e 50 61 72  ->regPart + nPar
13ff0 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 61 64  t;..      if( ad
14000 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33  drJump ) sqlite3
14010 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14020 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20  addrJump);.     
14030 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
14040 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
14050 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
14060 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
14070 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
14080 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
14090 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
140a0 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
140b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
140c0 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
140d0 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65  egNewPeer, regPe
140e0 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20  er, nPeer);.    
140f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14100 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
14110 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
14120 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
14130 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69   addrJump = sqli
14140 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14150 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32   OP_Jump, addr+2
14160 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  , 0, addr+2);.  
14170 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
14180 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
14190 73 65 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72  se{.        addr
141a0 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Jump = 0;.      
141b0 7d 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  }.      windowAg
141c0 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
141d0 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74  MWin, pMWin->eSt
141e0 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  art==TK_CURRENT)
141f0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ;.      if( addr
14200 47 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56 64  Goto ) sqlite3Vd
14210 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
14220 64 72 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a  drGoto);.    }..
14230 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14240 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
14250 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
14260 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75  sr,sqlite3VdbeCu
14270 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b  rrentAddr(v)+3);
14280 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
14290 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
142a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
142b0 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75  P_Gosub, regGosu
142c0 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
142d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
142e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
142f0 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
14300 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
14310 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20  entAddr(v)-1);. 
14320 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
14330 76 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  v);..    sqlite3
14340 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14350 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d  _ResetSorter, pM
14360 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
14370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14380 64 4f 70 33 28 0a 20 20 20 20 20 20 20 20 76 2c  dOp3(.        v,
14390 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 2b 70 4d   OP_Copy, reg+pM
143a0 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 2c  Win->nBufferCol,
143b0 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
143c0 20 6e 50 61 72 74 2b 6e 50 65 65 72 2d 31 0a 20   nPart+nPeer-1. 
143d0 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 61     );..    if( a
143e0 64 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74 65  ddrJump ) sqlite
143f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
14400 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a   addrJump);.  }.
14410 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 65  .  /* Invoke ste
14420 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 77  p function for w
14430 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
14440 2a 2f 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74  */.  windowAggSt
14450 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
14460 2c 20 2d 31 2c 20 30 2c 20 72 65 67 2c 20 30 29  , -1, 0, reg, 0)
14470 3b 0a 0a 20 20 2f 2a 20 42 75 66 66 65 72 20 74  ;..  /* Buffer t
14480 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
14490 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  n the ephemeral 
144a0 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20  table. */.  if( 
144b0 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
144c0 6c 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l>0 ){.    sqlit
144d0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
144e0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
144f0 65 67 2c 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  eg, pMWin->nBuff
14500 65 72 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64  erCol, regRecord
14510 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
14520 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14530 32 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c  2(v, OP_Blob, 0,
14540 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20   regRecord);.   
14550 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
14560 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 22  ndP4(v, (void*)"
14570 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ", 0);.  }.  sql
14580 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14590 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
145a0 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
145b0 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  egRowid);.  sqli
145c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
145d0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69   OP_Insert, pMWi
145e0 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
145f0 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29  ecord, regRowid)
14600 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20  ;..  /* End the 
14610 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f  database scan lo
14620 6f 70 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  op. */.  sqlite3
14630 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
14640 3b 0a 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69  ;..  windowAggFi
14650 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
14660 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 1);.  sqlite3
14670 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14680 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e  _Rewind, pMWin->
14690 69 45 70 68 43 73 72 2c 73 71 6c 69 74 65 33 56  iEphCsr,sqlite3V
146a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
146b0 29 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+3);.  VdbeCove
146c0 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
146d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
146e0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
146f0 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
14700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14710 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
14720 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
14730 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14740 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20  ntAddr(v)-1);.  
14750 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
14760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
14770 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
14780 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65  duplicate of the
14790 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69   Window object i
147a0 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 0a  ndicated by the.
147b0 2a 2a 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  ** third argumen
147c0 74 2e 20 53 65 74 20 74 68 65 20 57 69 6e 64 6f  t. Set the Windo
147d0 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f  w.pOwner field o
147e0 66 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  f the new object
147f0 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a   to.** pOwner..*
14800 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
14810 33 57 69 6e 64 6f 77 44 75 70 28 73 71 6c 69 74  3WindowDup(sqlit
14820 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f  e3 *db, Expr *pO
14830 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29  wner, Window *p)
14840 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77  {.  Window *pNew
14850 20 3d 20 30 3b 0a 20 20 69 66 28 20 41 4c 57 41   = 0;.  if( ALWA
14860 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70 4e 65  YS(p) ){.    pNe
14870 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
14880 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
14890 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20  of(Window));.   
148a0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
148b0 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d     pNew->zName =
148c0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
148d0 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  (db, p->zName);.
148e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c        pNew->pFil
148f0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ter = sqlite3Exp
14900 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c  rDup(db, p->pFil
14910 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  ter, 0);.      p
14920 4e 65 77 2d 3e 70 46 75 6e 63 20 3d 20 70 2d 3e  New->pFunc = p->
14930 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70 4e 65  pFunc;.      pNe
14940 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20  w->pPartition = 
14950 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
14960 75 70 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  up(db, p->pParti
14970 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  tion, 0);.      
14980 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
14990 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
149a0 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  Dup(db, p->pOrde
149b0 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  rBy, 0);.      p
149c0 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e  New->eType = p->
149d0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 4e 65  eType;.      pNe
149e0 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e  w->eEnd = p->eEn
149f0 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  d;.      pNew->e
14a00 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
14a10 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
14a20 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45  Start = sqlite3E
14a30 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 53  xprDup(db, p->pS
14a40 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tart, 0);.      
14a50 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pNew->pEnd = sql
14a60 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
14a70 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20  p->pEnd, 0);.   
14a80 20 20 20 70 4e 65 77 2d 3e 70 4f 77 6e 65 72 20     pNew->pOwner 
14a90 3d 20 70 4f 77 6e 65 72 3b 0a 20 20 20 20 7d 0a  = pOwner;.    }.
14aa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
14ab0 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  w;.}../*.** Retu
14ac0 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  rn a copy of the
14ad0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
14ae0 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 70  Window objects p
14af0 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20  assed as the.** 
14b00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
14b10 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69  .*/.Window *sqli
14b20 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 75 70  te3WindowListDup
14b30 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
14b40 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64  ndow *p){.  Wind
14b50 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57 69 6e 64  ow *pWin;.  Wind
14b60 6f 77 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  ow *pRet = 0;.  
14b70 57 69 6e 64 6f 77 20 2a 2a 70 70 20 3d 20 26 70  Window **pp = &p
14b80 52 65 74 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e  Ret;..  for(pWin
14b90 3d 70 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  =p; pWin; pWin=p
14ba0 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
14bb0 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69 74 65      *pp = sqlite
14bc0 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c 20 30  3WindowDup(db, 0
14bd0 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 69 66 28  , pWin);.    if(
14be0 20 2a 70 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b   *pp==0 ) break;
14bf0 0a 20 20 20 20 70 70 20 3d 20 26 28 28 2a 70 70  .    pp = &((*pp
14c00 29 2d 3e 70 4e 65 78 74 57 69 6e 29 3b 0a 20 20  )->pNextWin);.  
14c10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
14c20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
14c30 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 68  e3WhereBegin() h
14c40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
14c50 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 53  called for the S
14c60 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
14c70 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20 74 68  .** passed as th
14c80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14c90 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
14ca0 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e  tion is invoked.
14cb0 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a   It generates.**
14cc0 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c 61 74   code to populat
14cd0 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72 65 67  e the Window.reg
14ce0 52 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 20  Result register 
14cf0 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
14d00 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
14d10 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72  invoke the sub-r
14d20 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74 72 75  outine at instru
14d30 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75 62 20  ction addrGosub 
14d40 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 72 6f  once for each ro
14d50 77 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  w..** This funct
14d60 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
14d70 33 57 68 65 72 65 45 6e 64 28 29 20 62 65 66 6f  3WhereEnd() befo
14d80 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a  re returning. .*
14d90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
14da0 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a 20 20  ndowCodeStep(.  
14db0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
14de0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74 74        /* Rewritt
14e10 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  en SELECT statem
14e20 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ent */.  WhereIn
14e30 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20  fo *pWInfo,     
14e40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
14e50 65 78 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  ext returned by 
14e60 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
14e70 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  n() */.  int reg
14e80 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20  Gosub,          
14e90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
14ea0 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75  ster for OP_Gosu
14eb0 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  b */.  int addrG
14ec0 6f 73 75 62 20 20 20 20 20 20 20 20 20 20 20 20  osub            
14ed0 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73         /* OP_Gos
14ee0 75 62 20 68 65 72 65 20 74 6f 20 72 65 74 75 72  ub here to retur
14ef0 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b  n each row */.){
14f00 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
14f10 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 0a 20 20 2f   = p->pWin;..  /
14f20 2a 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  * There are thre
14f30 65 20 64 69 66 66 65 72 65 6e 74 20 66 75 6e 63  e different func
14f40 74 69 6f 6e 73 20 74 68 61 74 20 6d 61 79 20 62  tions that may b
14f50 65 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65  e used to do the
14f60 20 77 6f 72 6b 0a 20 20 2a 2a 20 6f 66 20 74 68   work.  ** of th
14f70 69 73 20 6f 6e 65 2c 20 64 65 70 65 6e 64 69 6e  is one, dependin
14f80 67 20 6f 6e 20 74 68 65 20 77 69 6e 64 6f 77 20  g on the window 
14f90 66 72 61 6d 65 20 61 6e 64 20 74 68 65 20 73 70  frame and the sp
14fa0 65 63 69 66 69 63 20 62 75 69 6c 74 2d 69 6e 0a  ecific built-in.
14fb0 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63    ** window func
14fc0 74 69 6f 6e 73 20 75 73 65 64 20 28 69 66 20 61  tions used (if a
14fd0 6e 79 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  ny)..  **.  ** w
14fe0 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72  indowCodeRowExpr
14ff0 53 74 65 70 28 29 20 68 61 6e 64 6c 65 73 20 61  Step() handles a
15000 6c 6c 20 22 52 4f 57 53 22 20 77 69 6e 64 6f 77  ll "ROWS" window
15010 20 66 72 61 6d 65 73 2c 20 65 78 63 65 70 74 20   frames, except 
15020 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  for:.  **.  **  
15030 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
15040 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
15050 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
15060 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  W.  **.  ** The 
15070 65 78 63 65 70 74 69 6f 6e 20 69 73 20 62 65 63  exception is bec
15080 61 75 73 65 20 77 69 6e 64 6f 77 43 6f 64 65 52  ause windowCodeR
15090 6f 77 45 78 70 72 53 74 65 70 28 29 20 69 6d 70  owExprStep() imp
150a0 6c 65 6d 65 6e 74 73 20 61 6c 6c 20 77 69 6e 64  lements all wind
150b0 6f 77 0a 20 20 2a 2a 20 66 72 61 6d 65 20 74 79  ow.  ** frame ty
150c0 70 65 73 20 62 79 20 63 61 63 68 69 6e 67 20 74  pes by caching t
150d0 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
150e0 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20 74 61  ion in a temp ta
150f0 62 6c 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 22 52  ble, and.  ** "R
15100 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
15110 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
15120 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 22  AND CURRENT ROW"
15130 20 69 73 20 65 61 73 79 20 65 6e 6f 75 67 68 20   is easy enough 
15140 74 6f 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  to.  ** implemen
15150 74 20 77 69 74 68 6f 75 74 20 73 75 63 68 20 61  t without such a
15160 20 63 61 63 68 65 2e 0a 20 20 2a 2a 0a 20 20 2a   cache..  **.  *
15170 2a 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68  * windowCodeCach
15180 65 53 74 65 70 28 29 20 69 73 20 75 73 65 64 20  eStep() is used 
15190 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  for:.  **.  **  
151a0 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
151b0 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
151c0 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
151d0 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 74 20  NG.  **.  ** It 
151e0 69 73 20 61 6c 73 6f 20 75 73 65 64 20 66 6f 72  is also used for
151f0 20 61 6e 79 74 68 69 6e 67 20 6e 6f 74 20 68 61   anything not ha
15200 6e 64 6c 65 64 20 62 79 20 77 69 6e 64 6f 77 43  ndled by windowC
15210 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 29  odeRowExprStep()
15220 20 0a 20 20 2a 2a 20 74 68 61 74 20 69 6e 76 6f   .  ** that invo
15230 6b 65 73 20 61 20 62 75 69 6c 74 2d 69 6e 20 77  kes a built-in w
15240 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
15250 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
15260 20 65 6e 74 69 72 65 20 0a 20 20 2a 2a 20 70 61   entire .  ** pa
15270 72 74 69 74 69 6f 6e 20 74 6f 20 62 65 20 63 61  rtition to be ca
15280 63 68 65 64 20 69 6e 20 61 20 74 65 6d 70 20 74  ched in a temp t
15290 61 62 6c 65 20 62 65 66 6f 72 65 20 61 6e 79 20  able before any 
152a0 72 6f 77 73 20 61 72 65 20 72 65 74 75 72 6e 65  rows are returne
152b0 64 0a 20 20 2a 2a 20 28 65 2e 67 2e 20 6e 74 68  d.  ** (e.g. nth
152c0 5f 76 61 6c 75 65 28 29 20 6f 72 20 70 65 72 63  _value() or perc
152d0 65 6e 74 5f 72 61 6e 6b 28 29 29 2e 0a 20 20 2a  ent_rank())..  *
152e0 2a 0a 20 20 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  *.  ** Finally, 
152f0 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
15300 73 20 6e 6f 20 62 75 69 6c 74 2d 69 6e 20 77 69  s no built-in wi
15310 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 68  ndow function th
15320 61 74 20 72 65 71 75 69 72 65 73 0a 20 20 2a 2a  at requires.  **
15330 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e 20 74   the partition t
15340 6f 20 62 65 20 63 61 63 68 65 64 2c 20 77 69 6e  o be cached, win
15350 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
15360 65 70 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  ep() is used for
15370 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 41  :.  **.  **   RA
15380 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
15390 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
153a0 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
153b0 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45  .  **   RANGE BE
153c0 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
153d0 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e  PRECEDING AND UN
153e0 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
153f0 47 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42  G.  **   RANGE B
15400 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
15410 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  OW AND CURRENT R
15420 4f 57 20 0a 20 20 2a 2a 20 20 20 52 4f 57 53 20  OW .  **   ROWS 
15430 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
15440 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
15450 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a  CURRENT ROW.  **
15460 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65  .  ** windowCode
15470 44 65 66 61 75 6c 74 53 74 65 70 28 29 20 69 73  DefaultStep() is
15480 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66   the only one of
15490 20 74 68 65 20 74 68 72 65 65 20 66 75 6e 63 74   the three funct
154a0 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 64  ions that.  ** d
154b0 6f 65 73 20 6e 6f 74 20 63 61 63 68 65 20 65 61  oes not cache ea
154c0 63 68 20 70 61 72 74 69 74 69 6f 6e 20 69 6e 20  ch partition in 
154d0 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
154e0 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f  ore beginning to
154f0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 72 6f 77  .  ** return row
15500 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  s..  */.  if( pM
15510 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52  Win->eType==TK_R
15520 4f 57 53 20 0a 20 20 20 26 26 20 28 70 4d 57 69  OWS .   && (pMWi
15530 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
15540 42 4f 55 4e 44 45 44 7c 7c 70 4d 57 69 6e 2d 3e  BOUNDED||pMWin->
15550 65 45 6e 64 21 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd!=TK_CURRENT
15560 7c 7c 21 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72  ||!pMWin->pOrder
15570 42 79 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  By).  ){.    if(
15580 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21   (pMWin->eStart!
15590 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 26 26  =TK_PRECEDING &&
155a0 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d   pMWin->eStart!=
155b0 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 0a 20 20  TK_FOLLOWING).  
155c0 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 45     || (pMWin->eE
155d0 6e 64 21 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd!=TK_FOLLOWING
155e0 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 21   && pMWin->eEnd!
155f0 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 29 20 0a  =TK_PRECEDING) .
15600 20 20 20 20 29 7b 0a 20 20 20 20 20 20 56 64 62      ){.      Vdb
15610 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
15620 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22  pParse->pVdbe, "
15630 42 65 67 69 6e 20 52 6f 77 45 78 70 72 53 74 65  Begin RowExprSte
15640 70 28 29 22 29 29 3b 0a 20 20 20 20 20 20 77 69  p()"));.      wi
15650 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53  ndowCodeRowExprS
15660 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  tep(pParse, p, p
15670 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c  WInfo, regGosub,
15680 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20   addrGosub);.   
15690 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
156a0 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56  ment((pParse->pV
156b0 64 62 65 2c 20 22 45 6e 64 20 52 6f 77 45 78 70  dbe, "End RowExp
156c0 72 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20  rStep()"));.    
156d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 56 64 62  }else{.      Vdb
156e0 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
156f0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22  pParse->pVdbe, "
15700 42 65 67 69 6e 20 77 69 6e 64 6f 77 43 6f 64 65  Begin windowCode
15710 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20 20  Step()"));.     
15720 20 77 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28   windowCodeStep(
15730 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
15740 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  o, regGosub, add
15750 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56  rGosub);.      V
15760 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
15770 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  ((pParse->pVdbe,
15780 20 22 45 6e 64 20 77 69 6e 64 6f 77 43 6f 64 65   "End windowCode
15790 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20 7d  Step()"));.    }
157a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 57 69  .  }else{.    Wi
157b0 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20  ndow *pWin;.    
157c0 69 6e 74 20 62 43 61 63 68 65 20 3d 20 30 3b 20  int bCache = 0; 
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
157e0 20 54 72 75 65 20 74 6f 20 75 73 65 20 43 61 63   True to use Cac
157f0 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a 20 20 20  heStep() */..   
15800 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
15810 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
15820 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
15830 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
15840 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b       bCache = 1;
15850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15860 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
15870 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
15880 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
15890 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
158a0 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
158b0 6e 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  nc;.        if( 
158c0 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  (pFunc->funcFlag
158d0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
158e0 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a 20 20 20  WINDOW_SIZE).   
158f0 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d        || (pFunc-
15900 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
15910 65 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  eName).         
15920 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  || (pFunc->zName
15930 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  ==first_valueNam
15940 65 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  e).         || (
15950 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  pFunc->zName==le
15960 61 64 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  adName).        
15970 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
15980 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20 20  e==lagName).    
15990 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
159a0 20 62 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20   bCache = 1;.   
159b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
159c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
159d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74      }..    /* Ot
159e0 68 65 72 77 69 73 65 2c 20 63 61 6c 6c 20 77 69  herwise, call wi
159f0 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53  ndowCodeDefaultS
15a00 74 65 70 28 29 2e 20 20 2a 2f 0a 20 20 20 20 69  tep().  */.    i
15a10 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20 20  f( bCache ){.   
15a20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
15a30 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56  ment((pParse->pV
15a40 64 62 65 2c 20 22 42 65 67 69 6e 20 43 61 63 68  dbe, "Begin Cach
15a50 65 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20  eStep()"));.    
15a60 20 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68    windowCodeCach
15a70 65 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c  eStep(pParse, p,
15a80 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75   pWInfo, regGosu
15a90 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
15aa0 20 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43       VdbeModuleC
15ab0 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e  omment((pParse->
15ac0 70 56 64 62 65 2c 20 22 45 6e 64 20 43 61 63 68  pVdbe, "End Cach
15ad0 65 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20  eStep()"));.    
15ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 56 64 62  }else{.      Vdb
15af0 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
15b00 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22  pParse->pVdbe, "
15b10 42 65 67 69 6e 20 44 65 66 61 75 6c 74 53 74 65  Begin DefaultSte
15b20 70 28 29 22 29 29 3b 0a 20 20 20 20 20 20 77 69  p()"));.      wi
15b30 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53  ndowCodeDefaultS
15b40 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  tep(pParse, p, p
15b50 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c  WInfo, regGosub,
15b60 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20   addrGosub);.   
15b70 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
15b80 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56  ment((pParse->pV
15b90 64 62 65 2c 20 22 45 6e 64 20 44 65 66 61 75 6c  dbe, "End Defaul
15ba0 74 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20  tStep()"));.    
15bb0 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
15bc0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
15bd0 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a           INDOWFUNC */.