/ Hex Artifact Content
Login

Artifact b2316f6082849e6a98a7f46209528721082533297c3c8b535edd5581863610d7:


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 0a 20 20 66 6f 72 28 70 57 69 6e 3d  t);..  for(pWin=
8b70: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
8b80: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
8b90: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
8ba0: 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  p = pWin->pFunc;
8bb0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66 75 6e  .    if( (p->fun
8bc0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
8bd0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20  FUNC_MINMAX) && 
8be0: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
8bf0: 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
8c00: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c 69 6e      /* The inlin
8c10: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d 69  e versions of mi
8c20: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 72 65  n() and max() re
8c30: 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65 20 65  quire a single e
8c40: 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20 20 2a  phemeral.      *
8c50: 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20 72 65  * table and 3 re
8c60: 67 69 73 74 65 72 73 2e 20 54 68 65 20 72 65 67  gisters. The reg
8c70: 69 73 74 65 72 73 20 61 72 65 20 75 73 65 64 20  isters are used 
8c80: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
8c90: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
8ca0: 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74 20 74  regApp+0: slot t
8cb0: 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d 61 78  o copy min()/max
8cc0: 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66  () argument to f
8cd0: 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20  or MakeRecord.  
8ce0: 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b      **   regApp+
8cf0: 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  1: integer value
8d00: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
8d10: 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 0a  keys are unique.
8d20: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70        **   regAp
8d30: 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66 20 4d  p+2: output of M
8d40: 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20  akeRecord.      
8d50: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
8d60: 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d  t *pList = pWin-
8d70: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
8d80: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
8d90: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
8da0: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
8db0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
8dc0: 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
8dd0: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
8de0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
8df0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
8e00: 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gApp = pParse->n
8e10: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61  Mem+1;.      pPa
8e20: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a  rse->nMem += 3;.
8e30: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
8e40: 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46 75 6e  fo && pWin->pFun
8e50: 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27  c->zName[1]=='i'
8e60: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
8e70: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
8e80: 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 30 20 29  ortOrder[0]==0 )
8e90: 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
8ea0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
8eb0: 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 1;.      }. 
8ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ed0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
8ee0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 57 69 6e  nEphemeral, pWin
8ef0: 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a 20 20  ->csrApp, 2);.  
8f00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8f10: 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49  ppendP4(v, pKeyI
8f20: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
8f30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8f40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f50: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
8f60: 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20  ->regApp+1);.   
8f70: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
8f80: 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  p->zName==nth_va
8f90: 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e  lueName || p->zN
8fa0: 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  ame==first_value
8fb0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Name ){.      /*
8fc0: 20 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65   Allocate two re
8fd0: 67 69 73 74 65 72 73 20 61 74 20 70 57 69 6e 2d  gisters at pWin-
8fe0: 3e 72 65 67 41 70 70 2e 20 54 68 65 73 65 20 77  >regApp. These w
8ff0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 0a 20  ill be used to. 
9000: 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68       ** store th
9010: 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
9020: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75 72  index of the cur
9030: 72 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a  rent frame.  */.
9040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
9050: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a  Win->iEphCsr );.
9060: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
9070: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  pp = pParse->nMe
9080: 6d 2b 31 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  m+1;.      pWin-
9090: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
90a0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
90b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
90c0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
90d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
90e0: 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e  _OpenDup, pWin->
90f0: 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69  csrApp, pMWin->i
9100: 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20  EphCsr);.    }. 
9110: 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a     else if( p->z
9120: 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c  Name==leadName |
9130: 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e  | p->zName==lagN
9140: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ame ){.      ass
9150: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ert( pMWin->iEph
9160: 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69  Csr );.      pWi
9170: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
9180: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
9190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
91a0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
91b0: 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  p, pWin->csrApp,
91c0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
91d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
91e0: 2a 0a 2a 2a 20 41 20 22 50 52 45 43 45 44 49 4e  *.** A "PRECEDIN
91f0: 47 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64  G <expr>" (eCond
9200: 3d 3d 30 29 20 6f 72 20 22 46 4f 4c 4c 4f 57 49  ==0) or "FOLLOWI
9210: 4e 47 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e  NG <expr>" (eCon
9220: 64 3d 3d 31 29 20 6f 72 20 74 68 65 0a 2a 2a 20  d==1) or the.** 
9230: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63  value of the sec
9240: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
9250: 6e 74 68 5f 76 61 6c 75 65 28 29 20 28 65 43 6f  nth_value() (eCo
9260: 6e 64 3d 3d 32 29 20 68 61 73 20 6a 75 73 74 20  nd==2) has just 
9270: 62 65 65 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65  been.** evaluate
9280: 64 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  d and the result
9290: 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
92a0: 72 20 72 65 67 2e 20 54 68 69 73 20 66 75 6e 63  r reg. This func
92b0: 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56  tion generates V
92c0: 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 63 68 65  M.** code to che
92d0: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
92e0: 65 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  e is a non-negat
92f0: 69 76 65 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ive integer and 
9300: 74 68 72 6f 77 73 20 61 6e 0a 2a 2a 20 65 78 63  throws an.** exc
9310: 65 70 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20  eption if it is 
9320: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  not..*/.static v
9330: 6f 69 64 20 77 69 6e 64 6f 77 43 68 65 63 6b 49  oid windowCheckI
9340: 6e 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70  ntValue(Parse *p
9350: 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c 20  Parse, int reg, 
9360: 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73 74  int eCond){.  st
9370: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9380: 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20  *azErr[] = {.   
9390: 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67   "frame starting
93a0: 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20   offset must be 
93b0: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
93c0: 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72  nteger",.    "fr
93d0: 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65  ame ending offse
93e0: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
93f0: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
9400: 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20 61  ",.    "second a
9410: 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76  rgument to nth_v
9420: 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20 70  alue must be a p
9430: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 22  ositive integer"
9440: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69  .  };.  static i
9450: 6e 74 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50 5f  nt aOp[] = { OP_
9460: 47 65 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 74  Ge, OP_Ge, OP_Gt
9470: 20 7d 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   };.  Vdbe *v = 
9480: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9490: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65  Parse);.  int re
94a0: 67 5a 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 47  gZero = sqlite3G
94b0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
94c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 43 6f  );.  assert( eCo
94d0: 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64 3d 3d  nd==0 || eCond==
94e0: 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20 29 3b  1 || eCond==2 );
94f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9500: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
9510: 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b  er, 0, regZero);
9520: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9530: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
9540: 65 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74  eInt, reg, sqlit
9550: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
9560: 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43  r(v)+2);.  VdbeC
9570: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
9580: 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f  nd==0);.  VdbeCo
9590: 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e  verageIf(v, eCon
95a0: 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==1);.  VdbeCov
95b0: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
95c0: 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ==2);.  sqlite3V
95d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4f 70  dbeAddOp3(v, aOp
95e0: 5b 65 43 6f 6e 64 5d 2c 20 72 65 67 5a 65 72 6f  [eCond], regZero
95f0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
9600: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
9610: 65 67 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  eg);.  VdbeCover
9620: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76  ageNeverNullIf(v
9630: 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56  , eCond==0);.  V
9640: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
9650: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
9660: 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  =1);.  VdbeCover
9670: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76  ageNeverNullIf(v
9680: 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73  , eCond==2);.  s
9690: 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
96a0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
96b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
96c0: 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 45  P_Halt, SQLITE_E
96d0: 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29 3b  RROR, OE_Abort);
96e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70  .  sqlite3VdbeAp
96f0: 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
9700: 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c 20 50  )azErr[eCond], P
9710: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  4_STATIC);.  sql
9720: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9730: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 5a 65  eg(pParse, regZe
9740: 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ro);.}../*.** Re
9750: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
9760: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
9770: 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 64 6f  sed to the windo
9780: 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  w-function assoc
9790: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
97a0: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
97b0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
97c0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
97d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
97e0: 20 69 6e 74 20 77 69 6e 64 6f 77 41 72 67 43 6f   int windowArgCo
97f0: 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70 57 69 6e  unt(Window *pWin
9800: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
9810: 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  List = pWin->pOw
9820: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  ner->x.pList;.  
9830: 72 65 74 75 72 6e 20 28 70 4c 69 73 74 20 3f 20  return (pList ? 
9840: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
9850: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
9860: 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20  rate VM code to 
9870: 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78 53  invoke either xS
9880: 74 65 70 28 29 20 28 69 66 20 62 49 6e 76 65 72  tep() (if bInver
9890: 73 65 20 69 73 20 30 29 20 6f 72 20 0a 2a 2a 20  se is 0) or .** 
98a0: 78 49 6e 76 65 72 73 65 20 28 69 66 20 62 49 6e  xInverse (if bIn
98b0: 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  verse is non-zer
98c0: 6f 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  o) for each wind
98d0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  ow function in t
98e0: 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
98f0: 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  st starting at p
9900: 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75  MWin. Or, for bu
9910: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
9920: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  nctions.** that 
9930: 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73  do not use the s
9940: 74 61 6e 64 61 72 64 20 66 75 6e 63 74 69 6f 6e  tandard function
9950: 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74   API, generate t
9960: 68 65 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 69  he required.** i
9970: 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65 2e 0a 2a  nline VM code..*
9980: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
9990: 20 63 73 72 20 69 73 20 67 72 65 61 74 65 72 20   csr is greater 
99a0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
99b0: 20 30 2c 20 74 68 65 6e 20 61 72 67 75 6d 65 6e   0, then argumen
99c0: 74 20 72 65 67 20 69 73 0a 2a 2a 20 74 68 65 20  t reg is.** the 
99d0: 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
99e0: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
99f0: 67 69 73 74 65 72 73 20 67 75 61 72 61 6e 74 65  gisters guarante
9a00: 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a  ed to be large.*
9a10: 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  * enough to hold
9a20: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 72   the array of ar
9a30: 67 75 6d 65 6e 74 73 20 66 6f 72 20 65 61 63 68  guments for each
9a40: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68   function. In th
9a50: 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 61  is case.** the a
9a60: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65 78 74  rguments are ext
9a70: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
9a80: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63  current row of c
9a90: 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 61  sr into the.** a
9aa0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
9ab0: 73 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e  s before invokin
9ac0: 67 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  g OP_AggStep or 
9ad0: 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a  OP_AggInverse.**
9ae0: 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73 72 20 69  .** Or, if csr i
9af0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
9b00: 2c 20 74 68 65 6e 20 74 68 65 20 61 72 72 61 79  , then the array
9b10: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 74   of registers at
9b20: 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c 72 65 61   reg is.** alrea
9b30: 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  dy populated wit
9b40: 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72  h all columns fr
9b50: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  om the current r
9b60: 6f 77 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ow of the sub-qu
9b70: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ery..**.** If ar
9b80: 67 75 6d 65 6e 74 20 72 65 67 50 61 72 74 53 69  gument regPartSi
9b90: 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ze is non-zero, 
9ba0: 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 67  then it is a reg
9bb0: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
9bc0: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
9bd0: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 63 75  f rows in the cu
9be0: 72 72 65 6e 74 20 70 61 72 74 69 74 69 6f 6e 2e  rrent partition.
9bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9c00: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 0a 20  windowAggStep(. 
9c10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9c20: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
9c30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9c40: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
9c50: 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63  t of window func
9c60: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 63  tions */.  int c
9c70: 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
9c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
9c90: 61 64 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  ad arguments fro
9ca0: 6d 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  m this cursor */
9cb0: 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 73 65 2c  .  int bInverse,
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
9ce0: 76 6f 6b 65 20 78 49 6e 76 65 72 73 65 20 69 6e  voke xInverse in
9cf0: 73 74 65 61 64 20 6f 66 20 78 53 74 65 70 20 2a  stead of xStep *
9d00: 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20 20 20 20  /.  int reg,    
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
9d30: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
9d40: 6e 74 20 72 65 67 50 61 72 74 53 69 7a 65 20 20  nt regPartSize  
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d60: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  * Register conta
9d70: 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61  ining size of pa
9d80: 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rtition */.){.  
9d90: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9da0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
9db0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
9dc0: 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ;.  for(pWin=pMW
9dd0: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
9de0: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
9df0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
9e00: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
9e10: 63 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  cFlags;.    int 
9e20: 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  regArg;.    int 
9e30: 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67  nArg = windowArg
9e40: 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 0a 20 20  Count(pWin);..  
9e50: 20 20 69 66 28 20 63 73 72 3e 3d 30 20 29 7b 0a    if( csr>=0 ){.
9e60: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9e70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
9e80: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
9e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ea0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
9eb0: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
9ec0: 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a  gCol+i, reg+i);.
9ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
9ee0: 67 41 72 67 20 3d 20 72 65 67 3b 0a 20 20 20 20  gArg = reg;.    
9ef0: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
9f00: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
9f10: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
9f20: 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a   if( nArg==0 ){.
9f30: 20 20 20 20 20 20 20 20 20 20 72 65 67 41 72 67            regArg
9f40: 20 3d 20 72 65 67 50 61 72 74 53 69 7a 65 3b 0a   = regPartSize;.
9f50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9f60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9f70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9f80: 5f 53 43 6f 70 79 2c 20 72 65 67 50 61 72 74 53  _SCopy, regPartS
9f90: 69 7a 65 2c 20 72 65 67 2b 6e 41 72 67 29 3b 0a  ize, reg+nArg);.
9fa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9fb0: 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 20 20 20 20    nArg++;.      
9fc0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
9fd0: 20 20 20 61 73 73 65 72 74 28 20 21 28 66 6c 61     assert( !(fla
9fe0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
9ff0: 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 20 29 3b  _WINDOW_SIZE) );
a000: 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d 20  .      regArg = 
a010: 72 65 67 20 2b 20 70 57 69 6e 2d 3e 69 41 72 67  reg + pWin->iArg
a020: 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Col;.    }..    
a030: 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63  if( (pWin->pFunc
a040: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
a050: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
a060: 29 20 0a 20 20 20 20 20 20 26 26 20 70 57 69 6e  ) .      && pWin
a070: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
a080: 4f 55 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20  OUNDED .    ){. 
a090: 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e       int addrIsN
a0a0: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
a0b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
a0c0: 4e 75 6c 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20  Null, regArg);. 
a0d0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
a0e0: 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e(v);.      if( 
a0f0: 62 49 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20  bInverse==0 ){. 
a100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a110: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
a120: 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  ddImm, pWin->reg
a130: 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20  App+1, 1);.     
a140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a150: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
a160: 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e  , regArg, pWin->
a170: 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20  regApp);.       
a180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a190: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
a1a0: 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  ord, pWin->regAp
a1b0: 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41  p, 2, pWin->regA
a1c0: 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73  pp+2);.        s
a1d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a1e0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a1f0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
a200: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b  pWin->regApp+2);
a210: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a230: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a240: 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63  _SeekGE, pWin->c
a250: 73 72 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67  srApp, 0, regArg
a260: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
a270: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
a280: 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20  aken(v);.       
a290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2a0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
a2b0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a   pWin->csrApp);.
a2c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a2d0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73  dbeJumpHere(v, s
a2e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
a2f0: 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20  tAddr(v)-2);.   
a300: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a310: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a320: 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20  , addrIsNull);. 
a330: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69     }else if( pWi
a340: 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20  n->regApp ){.   
a350: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d     assert( pWin-
a360: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e  >pFunc->zName==n
a370: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20  th_valueName.   
a380: 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69 6e 2d          || pWin-
a390: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66  >pFunc->zName==f
a3a0: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  irst_valueName. 
a3b0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a3c0: 73 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d 3d  sert( bInverse==
a3d0: 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d 31  0 || bInverse==1
a3e0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
a3f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a400: 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e  P_AddImm, pWin->
a410: 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72 73  regApp+1-bInvers
a420: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 1);.    }else
a430: 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63   if( pWin->pFunc
a440: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
a450: 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  e.           || 
a460: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61  pWin->pFunc->zNa
a470: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a 20 20 20 20  me==lagName.    
a480: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  ){.      /* no-o
a490: 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  p */.    }else{.
a4a0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 66        int addrIf
a4b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
a4c0: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
a4d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
a4e0: 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tmp;.        ass
a4f0: 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c 20  ert( nArg==0 || 
a500: 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e  nArg==pWin->pOwn
a510: 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  er->x.pList->nEx
a520: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  pr );.        as
a530: 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20 70 57  sert( nArg || pW
a540: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
a550: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
a560: 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a 20    if( csr>0 ){. 
a570: 20 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20           regTmp 
a580: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a590: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
a5a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a5b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a5c0: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
a5d0: 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72 67 2c 72  ->iArgCol+nArg,r
a5e0: 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  egTmp);.        
a5f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a600: 20 72 65 67 54 6d 70 20 3d 20 72 65 67 41 72 67   regTmp = regArg
a610: 20 2b 20 6e 41 72 67 3b 0a 20 20 20 20 20 20 20   + nArg;.       
a620: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 49   }.        addrI
a630: 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  f = sqlite3VdbeA
a640: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
a650: 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20 31 29  t, regTmp, 0, 1)
a660: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
a670: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
a680: 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a     if( csr>0 ){.
a690: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a6a0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
a6b0: 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70 29 3b  pParse, regTmp);
a6c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 69   }.      if( pWi
a6e0: 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  n->pFunc->funcFl
a6f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
a700: 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
a710: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
a720: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  Coll;.        as
a730: 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29 3b 0a  sert( nArg>0 );.
a740: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
a750: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
a760: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 57 69  lSeq(pParse, pWi
a770: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
a780: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
a790: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a7a0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a7b0: 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30 2c  _CollSeq, 0,0,0,
a7c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 43   (const char*)pC
a7d0: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
a7e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a800: 33 28 76 2c 20 62 49 6e 76 65 72 73 65 3f 20 4f  3(v, bInverse? O
a810: 50 5f 41 67 67 49 6e 76 65 72 73 65 20 3a 20 4f  P_AggInverse : O
a820: 50 5f 41 67 67 53 74 65 70 2c 20 0a 20 20 20 20  P_AggStep, .    
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 20 20 20 20 62 49 6e 76 65 72 73 65 2c 20 72 65      bInverse, re
a850: 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41  gArg, pWin->regA
a860: 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  ccum);.      sql
a870: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
a880: 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c  (v, pWin->pFunc,
a890: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
a8a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
a8b0: 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
a8c0: 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Arg);.      if( 
a8d0: 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65 33  addrIf ) sqlite3
a8e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
a8f0: 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20  addrIf);.    }. 
a900: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
a910: 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20  rate VM code to 
a920: 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56  invoke either xV
a930: 61 6c 75 65 28 29 20 28 62 46 69 6e 61 6c 3d 3d  alue() (bFinal==
a940: 30 29 20 6f 72 20 78 46 69 6e 61 6c 69 7a 65 28  0) or xFinalize(
a950: 29 0a 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d 31 29  ).** (bFinal==1)
a960: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
a970: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
a980: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
a990: 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70 4d 57 69  rting at.** pMWi
a9a0: 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74  n. Or, for built
a9b0: 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  -in window-funct
a9c0: 69 6f 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ions that do not
a9d0: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
a9e0: 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e 65 72 61  d.** API, genera
a9f0: 74 65 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  te the equivalen
aa00: 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  t VM code..*/.st
aa10: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
aa20: 41 67 67 46 69 6e 61 6c 28 50 61 72 73 65 20 2a  AggFinal(Parse *
aa30: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
aa40: 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46 69 6e 61  pMWin, int bFina
aa50: 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
aa60: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
aa70: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
aa80: 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70   *pWin;..  for(p
aa90: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
aaa0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
aab0: 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 28  tWin){.    if( (
aac0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
aad0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
aae0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20  FUNC_MINMAX) .  
aaf0: 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61     && pWin->eSta
ab00: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
ab10: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73   .    ){.      s
ab20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ab30: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ab40: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
ab50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ab60: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ab70: 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41  Last, pWin->csrA
ab80: 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  pp);.      VdbeC
ab90: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
aba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
abb0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
abc0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
abd0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  0, pWin->regResu
abe0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
abf0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
ac00: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
ac10: 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a  rentAddr(v)-2);.
ac20: 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c        if( bFinal
ac30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ac40: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ac50: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
ac60: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a   pWin->csrApp);.
ac70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
ac80: 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41  e if( pWin->regA
ac90: 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c 73 65 7b  pp ){.    }else{
aca0: 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61  .      if( bFina
acb0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
acc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
acd0: 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
ace0: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 77  Win->regAccum, w
acf0: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57  indowArgCount(pW
ad00: 69 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  in));.        sq
ad10: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
ad20: 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63  4(v, pWin->pFunc
ad30: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
ad40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ad50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
ad60: 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  opy, pWin->regAc
ad70: 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  cum, pWin->regRe
ad80: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73  sult);.        s
ad90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ada0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
adb0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
adc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
add0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ade0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
adf0: 67 56 61 6c 75 65 2c 20 70 57 69 6e 2d 3e 72 65  gValue, pWin->re
ae00: 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41 72  gAccum, windowAr
ae10: 67 43 6f 75 6e 74 28 70 57 69 6e 29 2c 0a 20 20  gCount(pWin),.  
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d             pWin-
ae40: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
ae50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ae60: 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e  AppendP4(v, pWin
ae70: 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
ae80: 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DEF);.      }.  
ae90: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
aea0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   This function g
aeb0: 65 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65  enerates VM code
aec0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73   to invoke the s
aed0: 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 61 64  ub-routine at ad
aee0: 64 72 65 73 73 0a 2a 2a 20 6c 62 6c 46 6c 75 73  dress.** lblFlus
aef0: 68 50 61 72 74 20 6f 6e 63 65 20 66 6f 72 20 65  hPart once for e
af00: 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 77 69  ach partition wi
af10: 74 68 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  th the entire pa
af20: 72 74 69 74 69 6f 6e 20 63 61 63 68 65 64 20 69  rtition cached i
af30: 6e 0a 2a 2a 20 74 68 65 20 57 69 6e 64 6f 77 2e  n.** the Window.
af40: 69 45 70 68 43 73 72 20 74 65 6d 70 20 74 61 62  iEphCsr temp tab
af50: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
af60: 69 64 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69  id windowPartiti
af70: 6f 6e 43 61 63 68 65 28 0a 20 20 50 61 72 73 65  onCache(.  Parse
af80: 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 65 6c 65   *pParse,.  Sele
af90: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
afb0: 68 65 20 72 65 77 72 69 74 74 65 6e 20 53 45 4c  he rewritten SEL
afc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
afd0: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
afe0: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
aff0: 20 20 20 2f 2a 20 57 68 65 72 65 49 6e 66 6f 20     /* WhereInfo 
b000: 74 6f 20 63 61 6c 6c 20 57 68 65 72 65 45 6e 64  to call WhereEnd
b010: 28 29 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  () on */.  int r
b020: 65 67 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20  egFlushPart,    
b030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b040: 67 69 73 74 65 72 20 74 6f 20 75 73 65 20 77 69  gister to use wi
b050: 74 68 20 47 6f 73 75 62 20 6c 62 6c 46 6c 75 73  th Gosub lblFlus
b060: 68 50 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  hPart */.  int l
b070: 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20  blFlushPart,    
b080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
b090: 62 72 6f 75 74 69 6e 65 20 74 6f 20 47 6f 73 75  broutine to Gosu
b0a0: 62 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  b to */.  int *p
b0b0: 52 65 67 53 69 7a 65 20 20 20 20 20 20 20 20 20  RegSize         
b0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
b0d0: 3a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  : Register conta
b0e0: 69 6e 69 6e 67 20 70 61 72 74 69 74 69 6f 6e 20  ining partition 
b0f0: 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e  size */.){.  Win
b100: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
b110: 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  pWin;.  Vdbe *v 
b120: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b130: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
b140: 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72  iSubCsr = p->pSr
b150: 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
b160: 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d  .  int nSub = p-
b170: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
b180: 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b 3b  ->nCol;.  int k;
b190: 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50  ..  int reg = pP
b1a0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
b1b0: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
b1c0: 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20  reg+nSub;.  int 
b1d0: 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65  regRowid = regRe
b1e0: 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70 52 65 67  cord+1;..  *pReg
b1f0: 53 69 7a 65 20 3d 20 72 65 67 52 6f 77 69 64 3b  Size = regRowid;
b200: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
b210: 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20 20  += nSub + 2;..  
b220: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6c 75  /* Load the colu
b230: 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  mn values for th
b240: 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  e row returned b
b250: 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  y the sub-select
b260: 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 61 72  .  ** into an ar
b270: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
b280: 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
b290: 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  . */.  for(k=0; 
b2a0: 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20  k<nSub; k++){.  
b2b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b2c0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b2d0: 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65  , iSubCsr, k, re
b2e0: 67 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  g+k);.  }.  sqli
b2f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b300: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
b310: 72 65 67 2c 20 6e 53 75 62 2c 20 72 65 67 52 65  reg, nSub, regRe
b320: 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  cord);..  /* Che
b330: 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ck if this is th
b340: 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
b350: 20 70 61 72 74 69 74 69 6f 6e 2e 20 49 66 20 73   partition. If s
b360: 6f 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  o, call the.  **
b370: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
b380: 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 20 2a   sub-routine.  *
b390: 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  /.  if( pMWin->p
b3a0: 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20  Partition ){.   
b3b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45   int addr;.    E
b3c0: 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d  xprList *pPart =
b3d0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
b3e0: 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72  on;.    int nPar
b3f0: 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72  t = pPart->nExpr
b400: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77  ;.    int regNew
b410: 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57  Part = reg + pMW
b420: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a  in->nBufferCol;.
b430: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
b440: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
b450: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
b460: 73 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  st(pParse, pPart
b470: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61 64  , 0, 0);..    ad
b480: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
b490: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
b4a0: 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74  pare, regNewPart
b4b0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
b4c0: 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  ,nPart);.    sql
b4d0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
b4e0: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
b4f0: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
b500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b510: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
b520: 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72  mp, addr+2, addr
b530: 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20  +4, addr+2);.   
b540: 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e   VdbeCoverageEqN
b550: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
b560: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b570: 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 61  P_Copy, regNewPa
b580: 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  rt, pMWin->regPa
b590: 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20  rt, nPart-1);.  
b5a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b5b0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
b5c0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
b5d0: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
b5e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b5f0: 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61  , "call flush_pa
b600: 72 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20 7d 0a  rtition"));.  }.
b610: 0a 20 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65  .  /* Buffer the
b620: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20   current row in 
b630: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
b640: 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ble. */.  sqlite
b650: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b660: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69  P_NewRowid, pMWi
b670: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
b680: 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
b690: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b6a0: 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e  _Insert, pMWin->
b6b0: 69 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f  iEphCsr, regReco
b6c0: 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  rd, regRowid);..
b6d0: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
b6e0: 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
b6f0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
b700: 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49  pWInfo);..  /* I
b710: 6e 76 6f 6b 65 20 22 66 6c 75 73 68 5f 70 61 72  nvoke "flush_par
b720: 74 69 74 69 6f 6e 22 20 74 6f 20 64 65 61 6c 20  tition" to deal 
b730: 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 28  with the final (
b740: 6f 72 20 6f 6e 6c 79 29 20 70 61 72 74 69 74 69  or only) partiti
b750: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  on */.  sqlite3V
b760: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b770: 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50  Gosub, regFlushP
b780: 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72  art, lblFlushPar
b790: 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  t);.  VdbeCommen
b7a0: 74 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73  t((v, "call flus
b7b0: 68 5f 70 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a  h_partition"));.
b7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
b7d0: 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20  the sub-routine 
b7e0: 61 74 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e  at regGosub (gen
b7f0: 65 72 61 74 65 64 20 62 79 20 63 6f 64 65 20 69  erated by code i
b800: 6e 20 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a  n select.c) to.*
b810: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  * return the cur
b820: 72 65 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64  rent row of Wind
b830: 6f 77 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61  ow.iEphCsr. If a
b840: 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ll window functi
b850: 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65  ons are.** aggre
b860: 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63  gate window func
b870: 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74  tions that use t
b880: 68 65 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c  he standard API,
b890: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f   a single.** OP_
b8a0: 47 6f 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f  Gosub instructio
b8b0: 6e 20 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68  n is all that th
b8c0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
b8d0: 61 74 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63  ates. Extra VM c
b8e0: 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72  ode.** for per-r
b8f0: 6f 77 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ow processing is
b900: 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20   only generated 
b910: 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  for the followin
b920: 67 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  g built-in windo
b930: 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  w.** functions:.
b940: 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75  **.**   nth_valu
b950: 65 28 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76  e().**   first_v
b960: 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28  alue().**   lag(
b970: 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f  ).**   lead().*/
b980: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
b990: 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28  dowReturnOneRow(
b9a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b9b0: 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ,.  Window *pMWi
b9c0: 6e 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  n,.  int regGosu
b9d0: 62 2c 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  b,.  int addrGos
b9e0: 75 62 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ub.){.  Vdbe *v 
b9f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
ba00: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
ba10: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28  ow *pWin;.  for(
ba20: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
ba30: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
ba40: 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63  xtWin){.    Func
ba50: 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69  Def *pFunc = pWi
ba60: 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66  n->pFunc;.    if
ba70: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
ba80: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  nth_valueName.  
ba90: 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61     || pFunc->zNa
baa0: 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e  me==first_valueN
bab0: 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ame.    ){.     
bac0: 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d   int csr = pWin-
bad0: 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69  >csrApp;.      i
bae0: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
baf0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
bb00: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
bb10: 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65   tmpReg = sqlite
bb20: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
bb30: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
bb40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bb50: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
bb60: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 0a 20  ->regResult);.. 
bb70: 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e       if( pFunc->
bb80: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
bb90: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
bba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bbb0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
bbc0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
bbd0: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c  pWin->iArgCol+1,
bbe0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20  tmpReg);.       
bbf0: 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56   windowCheckIntV
bc00: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 74 6d 70  alue(pParse, tmp
bc10: 52 65 67 2c 20 32 29 3b 0a 20 20 20 20 20 20 7d  Reg, 2);.      }
bc20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
bc30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bc40: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
bc50: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
bc60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
bc70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
bc80: 5f 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70 57  _Add, tmpReg, pW
bc90: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70 52  in->regApp, tmpR
bca0: 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
bcb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bcc0: 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67  OP_Gt, pWin->reg
bcd0: 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52  App+1, lbl, tmpR
bce0: 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  eg);.      VdbeC
bcf0: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
bd00: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
bd10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bd20: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73  OP_SeekRowid, cs
bd30: 72 2c 20 30 2c 20 74 6d 70 52 65 67 29 3b 0a 20  r, 0, 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 54 61 6b 65 6e 28 76 29 3b 0a  eNeverTaken(v);.
bd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bd70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
bd80: 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d  lumn, csr, pWin-
bd90: 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e  >iArgCol, pWin->
bda0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
bdb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
bdc0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
bdd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bde0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
bdf0: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a  Parse, tmpReg);.
be00: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
be10: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
be20: 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46 75  =leadName || pFu
be30: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61  nc->zName==lagNa
be40: 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  me ){.      int 
be50: 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  nArg = pWin->pOw
be60: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  ner->x.pList->nE
be70: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  xpr;.      int c
be80: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
be90: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
bea0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
beb0: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
bec0: 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65  .      int tmpRe
bed0: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
bee0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
bef0: 20 20 20 20 20 69 6e 74 20 69 45 70 68 20 3d 20       int iEph = 
bf00: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a  pMWin->iEphCsr;.
bf10: 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c  .      if( nArg<
bf20: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
bf30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bf40: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
bf50: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
bf60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bf80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
bf90: 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d  umn, iEph, pWin-
bfa0: 3e 69 41 72 67 43 6f 6c 2b 32 2c 20 70 57 69 6e  >iArgCol+2, pWin
bfb0: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
bfc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
bfd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bfe0: 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45 70 68 2c   OP_Rowid, iEph,
bff0: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
c000: 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
c010: 20 20 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20        int val = 
c020: 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c  (pFunc->zName==l
c030: 65 61 64 4e 61 6d 65 20 3f 20 31 20 3a 20 2d 31  eadName ? 1 : -1
c040: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c050: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c060: 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65  OP_AddImm, tmpRe
c070: 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 7d  g, val);.      }
c080: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
c090: 74 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e 7a  t op = (pFunc->z
c0a0: 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f  Name==leadName ?
c0b0: 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53 75 62   OP_Add : OP_Sub
c0c0: 74 72 61 63 74 29 3b 0a 20 20 20 20 20 20 20 20  tract);.        
c0d0: 69 6e 74 20 74 6d 70 52 65 67 32 20 3d 20 73 71  int tmpReg2 = sq
c0e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
c0f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
c100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c110: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
c120: 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72   iEph, pWin->iAr
c130: 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67 32 29  gCol+1, tmpReg2)
c140: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c150: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
c160: 70 2c 20 74 6d 70 52 65 67 32 2c 20 74 6d 70 52  p, tmpReg2, tmpR
c170: 65 67 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  eg, tmpReg);.   
c180: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
c190: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
c1a0: 65 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20  e, tmpReg2);.   
c1b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
c1c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c1d0: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63   OP_SeekRowid, c
c1e0: 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29  sr, lbl, tmpReg)
c1f0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
c200: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
c210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c220: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
c230: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
c240: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
c250: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
c260: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
c270: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
c280: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
c290: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
c2a0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  tmpReg);.    }. 
c2b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
c2c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
c2d0: 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  ub, regGosub, ad
c2e0: 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a  drGosub);.}../*.
c2f0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 6f  ** Invoke the co
c300: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
c310: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
c320: 6f 77 28 29 20 61 6e 64 2c 20 6f 70 74 69 6f 6e  ow() and, option
c330: 61 6c 6c 79 2c 20 74 68 65 0a 2a 2a 20 78 49 6e  ally, the.** xIn
c340: 76 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  verse() function
c350: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
c360: 20 66 75 6e 63 74 69 6f 6e 2c 20 66 6f 72 20 6f   function, for o
c370: 6e 65 20 6f 72 20 6d 6f 72 65 20 72 6f 77 73 0a  ne or more rows.
c380: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64  ** from the Wind
c390: 6f 77 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20  ow.iEphCsr temp 
c3a0: 74 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74  table. This rout
c3b0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 4d  ine generates VM
c3c0: 20 63 6f 64 65 0a 2a 2a 20 73 69 6d 69 6c 61 72   code.** similar
c3d0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 77 68 69   to:.**.**   whi
c3e0: 6c 65 28 20 72 65 67 43 74 72 3e 30 20 29 7b 0a  le( regCtr>0 ){.
c3f0: 2a 2a 20 20 20 20 20 72 65 67 43 74 72 2d 2d 3b  **     regCtr--;
c400: 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f 77 52 65  .**     windowRe
c410: 74 75 72 6e 4f 6e 65 52 6f 77 28 29 0a 2a 2a 20  turnOneRow().** 
c420: 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73 65      if( bInverse
c430: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
c440: 49 6e 76 65 72 73 65 0a 2a 2a 20 20 20 20 20 7d  Inverse.**     }
c450: 0a 2a 2a 20 20 20 20 20 4e 65 78 74 20 28 57 69  .**     Next (Wi
c460: 6e 64 6f 77 2e 69 45 70 68 43 73 72 29 0a 2a 2a  ndow.iEphCsr).**
c470: 20 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76     }.*/.static v
c480: 6f 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72 6e  oid windowReturn
c490: 52 6f 77 73 28 0a 20 20 50 61 72 73 65 20 2a 70  Rows(.  Parse *p
c4a0: 50 61 72 73 65 2c 0a 20 20 57 69 6e 64 6f 77 20  Parse,.  Window 
c4b0: 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20  *pMWin,         
c4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
c4d0: 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   of window funct
c4e0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ions */.  int re
c4f0: 67 43 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  gCtr,           
c500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
c510: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
c520: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
c530: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  */.  int regGosu
c540: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
c550: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
c560: 20 66 6f 72 20 47 6f 73 75 62 20 61 64 64 72 47   for Gosub addrG
c570: 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64  osub */.  int ad
c580: 64 72 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20  drGosub,        
c590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
c5a0: 72 65 73 73 20 6f 66 20 73 75 62 2d 72 6f 75 74  ress of sub-rout
c5b0: 69 6e 65 20 66 6f 72 20 52 65 74 75 72 6e 4f 6e  ine for ReturnOn
c5c0: 65 52 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65  eRow */.  int re
c5d0: 67 49 6e 76 41 72 67 2c 20 20 20 20 20 20 20 20  gInvArg,        
c5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
c5f0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
c600: 66 6f 72 20 78 49 6e 76 65 72 73 65 20 61 72 67  for xInverse arg
c610: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 6e  s */.  int regIn
c620: 76 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  vSize           
c630: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
c640: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 69  er containing si
c650: 7a 65 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20  ze of partition 
c660: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
c670: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
c680: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c690: 72 73 65 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67  rse);.  windowAg
c6a0: 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
c6b0: 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 61 64 64 72  MWin, 0);.  addr
c6c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c6d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
c6e0: 2c 20 72 65 67 43 74 72 2c 20 73 71 6c 69 74 65  , regCtr, sqlite
c6f0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
c700: 28 76 29 2b 32 20 2c 31 29 3b 0a 20 20 56 64 62  (v)+2 ,1);.  Vdb
c710: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c730: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
c740: 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 74   0);.  windowRet
c750: 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65  urnOneRow(pParse
c760: 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75  , pMWin, regGosu
c770: 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
c780: 20 69 66 28 20 72 65 67 49 6e 76 41 72 67 20 29   if( regInvArg )
c790: 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53  {.    windowAggS
c7a0: 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
c7b0: 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  n, pMWin->iEphCs
c7c0: 72 2c 20 31 2c 20 72 65 67 49 6e 76 41 72 67 2c  r, 1, regInvArg,
c7d0: 20 72 65 67 49 6e 76 53 69 7a 65 29 3b 0a 20 20   regInvSize);.  
c7e0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
c7f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
c800: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
c810: 2c 20 61 64 64 72 29 3b 0a 20 20 56 64 62 65 43  , addr);.  VdbeC
c820: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
c830: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c840: 65 28 76 2c 20 61 64 64 72 2b 31 29 3b 20 20 20  e(v, addr+1);   
c850: 2f 2a 20 54 68 65 20 4f 50 5f 47 6f 74 6f 20 2a  /* The OP_Goto *
c860: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  /.}../*.** Gener
c870: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 65 74 20  ate code to set 
c880: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
c890: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
c8a0: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
c8b0: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b  n.** in the link
c8c0: 65 64 20 6c 69 73 74 20 70 61 73 73 65 64 20 61  ed list passed a
c8d0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
c8e0: 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41  ument to NULL. A
c8f0: 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e  nd perform.** an
c900: 79 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 69  y equivalent ini
c910: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75  tialization requ
c920: 69 72 65 64 20 62 79 20 61 6e 79 20 62 75 69 6c  ired by any buil
c930: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
c940: 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  tions.** in the 
c950: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
c960: 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74 41 63  int windowInitAc
c970: 63 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73  cum(Parse *pPars
c980: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  e, Window *pMWin
c990: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
c9a0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c9b0: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67  arse);.  int reg
c9c0: 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  Arg;.  int nArg 
c9d0: 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  = 0;.  Window *p
c9e0: 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d  Win;.  for(pWin=
c9f0: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
ca00: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
ca10: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
ca20: 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46  pFunc = pWin->pF
ca30: 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  unc;.    sqlite3
ca40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ca50: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
ca60: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e  regAccum);.    n
ca70: 41 72 67 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20  Arg = MAX(nArg, 
ca80: 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70  windowArgCount(p
ca90: 57 69 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 70  Win));.    if( p
caa0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
cab0: 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20  _valueName.     
cac0: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
cad0: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
cae0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
caf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cb00: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
cb10: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b  , pWin->regApp);
cb20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cb30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
cb40: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
cb50: 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20  >regApp+1);.    
cb60: 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e  }..    if( (pFun
cb70: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
cb80: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
cb90: 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72 41  X) && pWin->csrA
cba0: 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pp ){.      asse
cbb0: 72 74 28 20 70 57 69 6e 2d 3e 65 53 74 61 72 74  rt( pWin->eStart
cbc0: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  !=TK_UNBOUNDED )
cbd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cbe0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
cbf0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69  ResetSorter, pWi
cc00: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
cc10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cc20: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
cc30: 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  r, 0, pWin->regA
cc40: 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pp+1);.    }.  }
cc50: 0a 20 20 72 65 67 41 72 67 20 3d 20 70 50 61 72  .  regArg = pPar
cc60: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50  se->nMem+1;.  pP
cc70: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41  arse->nMem += nA
cc80: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  rg;.  return reg
cc90: 41 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  Arg;.}.../*.** T
cca0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
ccb0: 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 71  s the work of sq
ccc0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
ccd0: 74 65 70 28 29 20 66 6f 72 20 61 6c 6c 20 22 52  tep() for all "R
cce0: 4f 57 53 22 0a 2a 2a 20 77 69 6e 64 6f 77 20 66  OWS".** window f
ccf0: 72 61 6d 65 20 74 79 70 65 73 20 65 78 63 65 70  rame types excep
cd00: 74 20 66 6f 72 20 22 42 45 54 57 45 45 4e 20 55  t for "BETWEEN U
cd10: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
cd20: 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 0a 2a  NG AND CURRENT.*
cd30: 2a 20 52 4f 57 22 2e 20 50 73 65 75 64 6f 2d 63  * ROW". Pseudo-c
cd40: 6f 64 65 20 66 6f 72 20 65 61 63 68 20 66 6f 6c  ode for each fol
cd50: 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  lows..**.** ROWS
cd60: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
cd70: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
cd80: 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
cd90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a 2a  .**.**     ....*
cda0: 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
cdb0: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
cdc0: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
cdd0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ush_partition.**
cde0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
cdf0: 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64    Insert (record
ce00: 20 69 6e 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a   in eph-table).*
ce10: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  *     sqlite3Whe
ce20: 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 47  reEnd().**     G
ce30: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
ce40: 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20 20 20 66  tion.**  .**   f
ce50: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a  lush_partition:.
ce60: 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a  **     Once {.**
ce70: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
ce80: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 53 74  iEphCsr -> csrSt
ce90: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 4f 70  art).**       Op
cea0: 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d  enDup (iEphCsr -
ceb0: 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20  > csrEnd).**    
cec0: 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67 53 74 61   }.**     regSta
ced0: 72 74 20 3d 20 3c 65 78 70 72 31 3e 20 20 20 20  rt = <expr1>    
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 50              // P
cef0: 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
cf00: 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65 67 45 6e  ion.**     regEn
cf10: 64 20 3d 20 3c 65 78 70 72 32 3e 20 20 20 20 20  d = <expr2>     
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
cf30: 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73  FOLLOWING expres
cf40: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69 66 28 20  sion.**     if( 
cf50: 72 65 67 53 74 61 72 74 3c 30 20 7c 7c 20 72 65  regStart<0 || re
cf60: 67 45 6e 64 3c 30 20 29 7b 20 65 72 72 6f 72 21  gEnd<0 ){ error!
cf70: 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64   }.**     Rewind
cf80: 20 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63   (csr,csrStart,c
cf90: 73 72 45 6e 64 29 20 20 20 20 20 20 2f 2f 20 69  srEnd)      // i
cfa0: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
cfb0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
cfc0: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73  **       Next(cs
cfd0: 72 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20  rEnd)           
cfe0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
cff0: 4f 46 20 73 6b 69 70 20 41 67 67 73 74 65 70 0a  OF skip Aggstep.
d000: 2a 2a 20 20 20 20 20 20 20 41 67 67 73 74 65 70  **       Aggstep
d010: 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20   (csrEnd).**    
d020: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
d030: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
d040: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
d050: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  lue).**         
d060: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
d070: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
d080: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
d090: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
d0a0: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
d0b0: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  on_done.**      
d0c0: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
d0d0: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
d0e0: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
d0f0: 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  e (csrStart).** 
d100: 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63            Next(c
d110: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
d120: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d      }.**       }
d130: 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74  .**   flush_part
d140: 69 74 69 6f 6e 5f 64 6f 6e 65 3a 0a 2a 2a 20 20  ition_done:.**  
d150: 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 28     ResetSorter (
d160: 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75  csr).**     Retu
d170: 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  rn.**.** ROWS BE
d180: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
d190: 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 43 55  CEDING    AND CU
d1a0: 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 52 4f 57  RRENT ROW.** ROW
d1b0: 53 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  S BETWEEN CURREN
d1c0: 54 20 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e  T ROW         AN
d1d0: 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
d1e0: 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  NG.** ROWS BETWE
d1f0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
d200: 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
d210: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  > FOLLOWING.**.*
d220: 2a 20 20 20 54 68 65 73 65 20 61 72 65 20 73 69  *   These are si
d230: 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 61 62 6f  milar to the abo
d240: 76 65 2e 20 46 6f 72 20 22 43 55 52 52 45 4e 54  ve. For "CURRENT
d250: 20 52 4f 57 22 2c 20 69 6e 74 69 61 6c 69 7a 65   ROW", intialize
d260: 20 74 68 65 0a 2a 2a 20 20 20 72 65 67 69 73 74   the.**   regist
d270: 65 72 20 74 6f 20 30 2e 20 46 6f 72 20 22 55 4e  er to 0. For "UN
d280: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
d290: 47 22 20 74 6f 20 69 6e 66 69 6e 69 74 79 2e 0a  G" to infinity..
d2a0: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
d2b0: 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  EN <expr> PRECED
d2c0: 49 4e 47 20 20 20 20 41 4e 44 20 55 4e 42 4f 55  ING    AND UNBOU
d2d0: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
d2e0: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43  * ROWS BETWEEN C
d2f0: 55 52 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20  URRENT ROW      
d300: 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44     AND UNBOUNDED
d310: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
d320: 20 20 20 20 20 52 65 77 69 6e 64 20 28 63 73 72       Rewind (csr
d330: 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64  ,csrStart,csrEnd
d340: 29 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67  )    // if EOF g
d350: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
d360: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
d370: 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20  while( 1 ){.**  
d380: 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64       Next(csrEnd
d390: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
d3a0: 20 20 20 2f 2f 20 45 78 69 74 20 77 68 69 6c 65     // Exit while
d3b0: 28 31 29 20 61 74 20 45 4f 46 0a 2a 2a 20 20 20  (1) at EOF.**   
d3c0: 20 20 20 20 41 67 67 73 74 65 70 20 28 63 73 72      Aggstep (csr
d3d0: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  End).**     }.**
d3e0: 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
d3f0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e  .**       AggFin
d400: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
d410: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
d420: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65  osub.**       Ne
d430: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
d440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
d450: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
d460: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
d470: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65  **       if( (re
d480: 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
d490: 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 49 6e  **         AggIn
d4a0: 76 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29  verse (csrStart)
d4b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74  .**         Next
d4c0: 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
d4d0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a      }.**     }.*
d4e0: 2a 0a 2a 2a 20 20 20 46 6f 72 20 74 68 65 20 22  *.**   For the "
d4f0: 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
d500: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
d510: 49 4e 47 22 20 63 61 73 65 2c 20 74 68 65 20 66  ING" case, the f
d520: 69 6e 61 6c 20 69 66 28 29 20 0a 2a 2a 20 20 20  inal if() .**   
d530: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 61 6c 77  condition is alw
d540: 61 79 73 20 74 72 75 65 20 28 61 73 20 69 66 20  ays true (as if 
d550: 72 65 67 53 74 61 72 74 20 77 65 72 65 20 69 6e  regStart were in
d560: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 29 2e  itialized to 0).
d570: 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
d580: 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
d590: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
d5a0: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 0a 2a 2a 20  OLLOWING.** .** 
d5b0: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e    This is the on
d5c0: 6c 79 20 52 41 4e 47 45 20 63 61 73 65 20 68 61  ly RANGE case ha
d5d0: 6e 64 6c 65 64 20 62 79 20 74 68 69 73 20 72 6f  ndled by this ro
d5e0: 75 74 69 6e 65 2e 20 49 74 20 6d 6f 64 69 66 69  utine. It modifi
d5f0: 65 73 20 74 68 65 0a 2a 2a 20 20 20 73 65 63 6f  es the.**   seco
d600: 6e 64 20 77 68 69 6c 65 28 20 31 20 29 20 6c 6f  nd while( 1 ) lo
d610: 6f 70 20 69 6e 20 22 52 4f 57 53 20 42 45 54 57  op in "ROWS BETW
d620: 45 45 4e 20 43 55 52 52 45 4e 54 20 2e 2e 2e 20  EEN CURRENT ... 
d630: 55 4e 42 4f 55 4e 44 45 44 2e 2e 2e 22 20 74 6f  UNBOUNDED..." to
d640: 0a 2a 2a 20 20 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  .**   be:.**.** 
d650: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
d660: 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61  **       AggFina
d670: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
d680: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
d690: 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 50 65  **         regPe
d6a0: 65 72 2b 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  er++.**         
d6b0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
d6c0: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
d6d0: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
d6e0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
d6f0: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
d700: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
d710: 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20          if( new 
d720: 70 65 65 72 20 29 20 62 72 65 61 6b 3b 0a 2a 2a  peer ) break;.**
d730: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
d740: 20 20 77 68 69 6c 65 28 20 28 72 65 67 50 65 65    while( (regPee
d750: 72 2d 2d 29 3e 30 20 29 7b 0a 2a 2a 20 20 20 20  r--)>0 ){.**    
d760: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20       AggInverse 
d770: 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
d780: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 53 74        Next(csrSt
d790: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  art).**       }.
d7a0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52  **     }.**.** R
d7b0: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
d7c0: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 20 20 20  r> FOLLOWING    
d7d0: 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  AND <expr> FOLLO
d7e0: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 72 65 67  WING.**.**   reg
d7f0: 45 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d 20 72  End = regEnd - r
d800: 65 67 53 74 61 72 74 0a 2a 2a 20 20 20 52 65 77  egStart.**   Rew
d810: 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72  ind (csr,csrStar
d820: 74 2c 63 73 72 45 6e 64 29 20 20 20 2f 2f 20 69  t,csrEnd)   // i
d830: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
d840: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
d850: 2a 2a 20 20 20 20 20 41 67 67 73 74 65 70 20 28  **     Aggstep (
d860: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 4e  csrEnd).**     N
d870: 65 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20  ext(csrEnd)     
d880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
d890: 66 20 45 4f 46 20 66 61 6c 6c 2d 74 68 72 6f 75  f EOF fall-throu
d8a0: 67 68 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72  gh.**     if( (r
d8b0: 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  egEnd--)<=0 ){.*
d8c0: 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67  *       if( (reg
d8d0: 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
d8e0: 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e  *         AggFin
d8f0: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
d900: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
d910: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
d920: 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20    Next(csr)     
d930: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
d940: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
d950: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
d960: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
d970: 20 41 67 67 49 6e 76 65 72 73 65 20 28 63 73 72   AggInverse (csr
d980: 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20  Start).**       
d990: 4e 65 78 74 20 28 63 73 72 53 74 61 72 74 29 0a  Next (csrStart).
d9a0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52  **     }.**.** R
d9b0: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
d9c0: 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20  r> PRECEDING    
d9d0: 41 4e 44 20 3c 65 78 70 72 3e 20 50 52 45 43 45  AND <expr> PRECE
d9e0: 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 52 65 70  DING.**.**   Rep
d9f0: 6c 61 63 65 20 74 68 65 20 62 69 74 20 61 66 74  lace the bit aft
da00: 65 72 20 22 52 65 77 69 6e 64 22 20 69 6e 20 74  er "Rewind" in t
da10: 68 65 20 61 62 6f 76 65 20 77 69 74 68 3a 0a 2a  he above with:.*
da20: 2a 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65  *.**     if( (re
da30: 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a  gEnd--)<=0 ){.**
da40: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
da50: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20  csrEnd).**      
da60: 20 4e 65 78 74 20 28 63 73 72 45 6e 64 29 0a 2a   Next (csrEnd).*
da70: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41  *     }.**     A
da80: 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29  ggFinal (xValue)
da90: 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 61 64  .**     Gosub ad
daa0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 4e  drGosub.**     N
dab0: 65 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20  ext(csr)        
dac0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20            // if 
dad0: 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70  EOF goto flush_p
dae0: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a  artition_done.**
daf0: 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61       if( (regSta
db00: 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  rt--)<=0 ){.**  
db10: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20       AggInverse 
db20: 28 63 73 72 32 29 0a 2a 2a 20 20 20 20 20 20 20  (csr2).**       
db30: 4e 65 78 74 20 28 63 73 72 32 29 0a 2a 2a 20 20  Next (csr2).**  
db40: 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69     }.**.*/.stati
db50: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64  c void windowCod
db60: 65 52 6f 77 45 78 70 72 53 74 65 70 28 0a 20 20  eRowExprStep(.  
db70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
db80: 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57    Select *p,.  W
db90: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
dba0: 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ,.  int regGosub
dbb0: 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  , .  int addrGos
dbc0: 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ub.){.  Window *
dbd0: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
dbe0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
dbf0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
dc00: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 46 6c  se);.  int regFl
dc10: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
dc20: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
dc30: 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  er for "Gosub fl
dc40: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
dc50: 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  /.  int lblFlush
dc60: 50 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  Part;           
dc70: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
dc80: 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61   "Gosub flush_pa
dc90: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e  rtition" */.  in
dca0: 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 3b 20  t lblFlushDone; 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcc0: 20 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75   Label for "Gosu
dcd0: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
dce0: 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20 20 69 6e  n_done" */..  in
dcf0: 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20  t regArg;.  int 
dd00: 61 64 64 72 3b 0a 20 20 69 6e 74 20 63 73 72 53  addr;.  int csrS
dd10: 74 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tart = pParse->n
dd20: 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 63 73 72  Tab++;.  int csr
dd30: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  End = pParse->nT
dd40: 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 72 65 67 53  ab++;.  int regS
dd50: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
dd70: 65 20 6f 66 20 3c 65 78 70 72 3e 20 50 52 45 43  e of <expr> PREC
dd80: 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72  EDING */.  int r
dd90: 65 67 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  egEnd;          
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
ddb0: 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 46  alue of <expr> F
ddc0: 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e  OLLOWING */.  in
ddd0: 74 20 61 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e  t addrGoto;.  in
dde0: 74 20 61 64 64 72 54 6f 70 3b 0a 20 20 69 6e 74  t addrTop;.  int
ddf0: 20 61 64 64 72 49 66 50 6f 73 31 20 3d 20 30 3b   addrIfPos1 = 0;
de00: 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50 6f 73  .  int addrIfPos
de10: 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  2 = 0;.  int reg
de20: 53 69 7a 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Size = 0;..  ass
de30: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61  ert( pMWin->eSta
de40: 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
de50: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
de60: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
de70: 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c  RRENT .       ||
de80: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
de90: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20  TK_FOLLOWING .  
dea0: 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
deb0: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
dec0: 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  DED .  );.  asse
ded0: 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  rt( pMWin->eEnd=
dee0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20  =TK_FOLLOWING . 
def0: 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
df00: 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
df10: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
df20: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
df30: 55 4e 44 45 44 20 0a 20 20 20 20 20 20 20 7c 7c  UNDED .       ||
df40: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
df50: 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b  _PRECEDING .  );
df60: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
df70: 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62  register and lab
df80: 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73  el for the "flus
df90: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62  h_partition" sub
dfa0: 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72  -routine. */.  r
dfb0: 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b  egFlushPart = ++
dfc0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
dfd0: 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73  lblFlushPart = s
dfe0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
dff0: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 6c  bel(pParse);.  l
e000: 62 6c 46 6c 75 73 68 44 6f 6e 65 20 3d 20 73 71  blFlushDone = sq
e010: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e020: 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72  el(pParse);..  r
e030: 65 67 53 74 61 72 74 20 3d 20 2b 2b 70 50 61 72  egStart = ++pPar
e040: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
e050: 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
e060: 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61  Mem;..  windowPa
e070: 72 74 69 74 69 6f 6e 43 61 63 68 65 28 70 50 61  rtitionCache(pPa
e080: 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
e090: 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62  regFlushPart, lb
e0a0: 6c 46 6c 75 73 68 50 61 72 74 2c 20 26 72 65 67  lFlushPart, &reg
e0b0: 53 69 7a 65 29 3b 0a 0a 20 20 61 64 64 72 47 6f  Size);..  addrGo
e0c0: 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
e0d0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
e0e0: 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20  o);..  /* Start 
e0f0: 6f 66 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74  of "flush_partit
e100: 69 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ion" */.  sqlite
e110: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
e120: 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72  l(v, lblFlushPar
e130: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
e140: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e  eAddOp2(v, OP_On
e150: 63 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64  ce, 0, sqlite3Vd
e160: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e170: 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  +3);.  VdbeCover
e180: 61 67 65 28 76 29 3b 0a 20 20 56 64 62 65 43 6f  age(v);.  VdbeCo
e190: 6d 6d 65 6e 74 28 28 76 2c 20 22 46 6c 75 73 68  mment((v, "Flush
e1a0: 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62 72 6f  _partition subro
e1b0: 75 74 69 6e 65 22 29 29 3b 0a 20 20 73 71 6c 69  utine"));.  sqli
e1c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e1d0: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72   OP_OpenDup, csr
e1e0: 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  Start, pMWin->iE
e1f0: 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65  phCsr);.  sqlite
e200: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e210: 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e  P_OpenDup, csrEn
e220: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
e230: 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74  r);..  /* If eit
e240: 68 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20  her regStart or 
e250: 72 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e  regEnd are not n
e260: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
e270: 67 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a  gers, throw .  *
e280: 2a 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  * an exception. 
e290: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
e2a0: 3e 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73  >pStart ){.    s
e2b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e2c0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53  Parse, pMWin->pS
e2d0: 74 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b  tart, regStart);
e2e0: 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b  .    windowCheck
e2f0: 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  IntValue(pParse,
e300: 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20   regStart, 0);. 
e310: 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
e320: 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  pEnd ){.    sqli
e330: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e340: 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c  se, pMWin->pEnd,
e350: 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69   regEnd);.    wi
e360: 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75  ndowCheckIntValu
e370: 65 28 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64  e(pParse, regEnd
e380: 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
e390: 49 66 20 74 68 69 73 20 69 73 20 22 52 4f 57 53  If this is "ROWS
e3a0: 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49   <expr1> FOLLOWI
e3b0: 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c 65 78 70  NG AND ROWS <exp
e3c0: 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2c 20  r2> FOLLOWING", 
e3d0: 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  do:.  **.  **   
e3e0: 69 66 28 20 72 65 67 45 6e 64 3c 72 65 67 53 74  if( regEnd<regSt
e3f0: 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20 20 20 20  art ){.  **     
e400: 2f 2f 20 54 68 65 20 66 72 61 6d 65 20 61 6c 77  // The frame alw
e410: 61 79 73 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ays consists of 
e420: 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20 20 20 20  0 rows.  **     
e430: 72 65 67 53 74 61 72 74 20 3d 20 72 65 67 53 69  regStart = regSi
e440: 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20 20 2a  ze;.  **   }.  *
e450: 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67  *   regEnd = reg
e460: 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74 3b 0a  End - regStart;.
e470: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e    */.  if( pMWin
e480: 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69 6e 2d  ->pEnd && pMWin-
e490: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
e4a0: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73  OWING ){.    ass
e4b0: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61  ert( pMWin->pSta
e4c0: 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rt!=0 );.    ass
e4d0: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  ert( pMWin->eEnd
e4e0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
e4f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e500: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65  eAddOp3(v, OP_Ge
e510: 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c 69  , regStart, sqli
e520: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e530: 64 72 28 76 29 2b 32 2c 20 72 65 67 45 6e 64 29  dr(v)+2, regEnd)
e540: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
e550: 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a  geNeverNull(v);.
e560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e570: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
e580: 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53 74  , regSize, regSt
e590: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
e5a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e5b0: 50 5f 53 75 62 74 72 61 63 74 2c 20 72 65 67 53  P_Subtract, regS
e5c0: 74 61 72 74 2c 20 72 65 67 45 6e 64 2c 20 72 65  tart, regEnd, re
e5d0: 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  gEnd);.  }..  if
e5e0: 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 20  ( pMWin->pStart 
e5f0: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
e600: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
e610: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
e620: 6e 2d 3e 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  n->pEnd!=0 );.  
e630: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
e640: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43  >eStart==TK_PREC
e650: 45 44 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c  EDING );.    sql
e660: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e670: 2c 20 4f 50 5f 4c 65 2c 20 72 65 67 53 74 61 72  , OP_Le, regStar
e680: 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
e690: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 2c 20  rrentAddr(v)+3, 
e6a0: 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 56 64 62  regEnd);.    Vdb
e6b0: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
e6c0: 6c 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ll(v);.    sqlit
e6d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e6e0: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65  OP_Copy, regSize
e6f0: 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20  , regStart);.   
e700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e710: 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
e720: 65 67 53 69 7a 65 2c 20 72 65 67 45 6e 64 29 3b  egSize, regEnd);
e730: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
e740: 61 6c 69 7a 65 20 74 68 65 20 61 63 63 75 6d 75  alize the accumu
e750: 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66  lator register f
e760: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
e770: 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20  unction to NULL 
e780: 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20 77 69  */.  regArg = wi
e790: 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70 50  ndowInitAccum(pP
e7a0: 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20  arse, pMWin);.. 
e7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e7c0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
e7d0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
e7e0: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a   lblFlushDone);.
e7f0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
e800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
e810: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
e820: 69 6e 64 2c 20 63 73 72 53 74 61 72 74 2c 20 6c  ind, csrStart, l
e830: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
e840: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
e850: 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c  rTaken(v);.  sql
e860: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
e870: 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  (v, 1);.  sqlite
e880: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e890: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 45 6e 64  P_Rewind, csrEnd
e8a0: 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b  , lblFlushDone);
e8b0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
e8c0: 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
e8d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e8e0: 65 50 35 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a  eP5(v, 1);..  /*
e8f0: 20 49 6e 76 6f 6b 65 20 41 67 67 53 74 65 70 20   Invoke AggStep 
e900: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
e910: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
e920: 6e 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77 20  n using the row 
e930: 74 68 61 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64  that.  ** csrEnd
e940: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
e950: 73 20 74 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72  s to. Or, if csr
e960: 45 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20 61  End is already a
e970: 74 20 45 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e  t EOF,.  ** do n
e980: 6f 74 68 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64  othing.  */.  ad
e990: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
e9a0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e9b0: 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
e9c0: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
e9d0: 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66  NG ){.    addrIf
e9e0: 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64  Pos1 = sqlite3Vd
e9f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
ea00: 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20  fPos, regEnd, 0 
ea10: 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
ea20: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
ea30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ea40: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
ea50: 73 72 45 6e 64 2c 20 73 71 6c 69 74 65 33 56 64  srEnd, sqlite3Vd
ea60: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ea70: 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  +2);.  VdbeCover
ea80: 61 67 65 28 76 29 3b 0a 20 20 61 64 64 72 20 3d  age(v);.  addr =
ea90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eaa0: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
eab0: 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
eac0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
ead0: 73 72 45 6e 64 2c 20 30 2c 20 72 65 67 41 72 67  srEnd, 0, regArg
eae0: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 69 66  , regSize);.  if
eaf0: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
eb00: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
eb10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eb20: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
eb30: 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
eb40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
eb50: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
eb60: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
eb70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
eb80: 41 64 64 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65  Addr(v);.  }else
eb90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
eba0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
ebb0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  r);.    if( pMWi
ebc0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
ebd0: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73  EDING ){.      s
ebe0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ebf0: 72 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31  re(v, addrIfPos1
ec00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
ec10: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
ec20: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
ec30: 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 31 20  .    addrIfPos1 
ec40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ec50: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
ec60: 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b   regEnd, 0 , 1);
ec70: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
ec80: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
ec90: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
eca0: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
ecb0: 20 20 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20     addrIfPos2 = 
ecc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ecd0: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
ece0: 65 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b  egStart, 0 , 1);
ecf0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
ed00: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 64  e(v);.  }.  wind
ed10: 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73  owAggFinal(pPars
ed20: 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20  e, pMWin, 0);.  
ed30: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
ed40: 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ow(pParse, pMWin
ed50: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
ed60: 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65  Gosub);.  sqlite
ed70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ed80: 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69  P_Next, pMWin->i
ed90: 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56  EphCsr, sqlite3V
eda0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
edb0: 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+2);.  VdbeCove
edc0: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
edd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ede0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 46  OP_Goto, 0, lblF
edf0: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 69 66 28  lushDone);.  if(
ee00: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
ee10: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
ee20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
ee30: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
ee40: 66 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a 20 20 69  fPos2);.  }..  i
ee50: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
ee60: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20  ==TK_CURRENT .  
ee70: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
ee80: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
ee90: 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  .   || pMWin->eS
eea0: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
eeb0: 4e 47 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  NG .  ){.    int
eec0: 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 20   lblSkipInverse 
eed0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
eee0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 3b  eLabel(pParse);;
eef0: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
ef00: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
ef10: 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71  DING ){.      sq
ef20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ef30: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
ef40: 53 74 61 72 74 2c 20 6c 62 6c 53 6b 69 70 49 6e  Start, lblSkipIn
ef50: 76 65 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  verse, 1);.     
ef60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ef70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ef80: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
ef90: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
efa0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
efb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
efc0: 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c  t, csrStart, sql
efd0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
efe0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
eff0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f000: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f010: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f020: 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 53 6b 69 70  Goto, 0, lblSkip
f030: 49 6e 76 65 72 73 65 29 3b 0a 20 20 20 20 7d 65  Inverse);.    }e
f040: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
f050: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f060: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74 61 72  OP_Next, csrStar
f070: 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
f080: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 29 3b  rrentAddr(v)+1);
f090: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
f0a0: 61 67 65 41 6c 77 61 79 73 54 61 6b 65 6e 28 76  ageAlwaysTaken(v
f0b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e  );.    }.    win
f0c0: 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
f0d0: 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 53 74 61  e, pMWin, csrSta
f0e0: 72 74 2c 20 31 2c 20 72 65 67 41 72 67 2c 20 72  rt, 1, regArg, r
f0f0: 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c  egSize);.    sql
f100: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f110: 61 62 65 6c 28 76 2c 20 6c 62 6c 53 6b 69 70 49  abel(v, lblSkipI
f120: 6e 76 65 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69  nverse);.  }.  i
f130: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
f140: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
f150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
f160: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
f170: 66 50 6f 73 31 29 3b 0a 20 20 7d 0a 20 20 73 71  fPos1);.  }.  sq
f180: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f190: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
f1a0: 64 64 72 54 6f 70 29 3b 0a 0a 20 20 2f 2a 20 66  ddrTop);..  /* f
f1b0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
f1c0: 6f 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c 69 74 65  one: */.  sqlite
f1d0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f1e0: 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  l(v, lblFlushDon
f1f0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
f200: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
f210: 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e  setSorter, pMWin
f220: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71  ->iEphCsr);.  sq
f230: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f240: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
f250: 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 56  gFlushPart);.  V
f260: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f270: 65 6e 64 20 66 6c 75 73 68 5f 70 61 72 74 69 74  end flush_partit
f280: 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 22 29  ion subroutine")
f290: 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
f2a0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 6f 76   here to skip ov
f2b0: 65 72 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  er flush_partiti
f2c0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  on */.  sqlite3V
f2d0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f2e0: 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 73 74 61  ddrGoto);.}..sta
f2f0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
f300: 6f 64 65 53 74 65 70 28 0a 20 20 50 61 72 73 65  odeStep(.  Parse
f310: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c   *pParse, .  Sel
f320: 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49  ect *p,.  WhereI
f330: 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69  nfo *pWInfo,.  i
f340: 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20  nt regGosub, .  
f350: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b  int addrGosub.){
f360: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
f370: 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64   = p->pWin;.  Vd
f380: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
f390: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f3a0: 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61    int regFlushPa
f3b0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rt;             
f3c0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
f3d0: 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70  r "Gosub flush_p
f3e0: 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 0a 20 20  artition" */..  
f3f0: 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e  int regArg;.  in
f400: 74 20 63 73 72 43 75 72 72 65 6e 74 20 3d 20 70  t csrCurrent = p
f410: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20  MWin->iEphCsr;. 
f420: 20 69 6e 74 20 63 73 72 57 72 69 74 65 20 3d 20   int csrWrite = 
f430: 63 73 72 43 75 72 72 65 6e 74 2b 31 3b 0a 20 20  csrCurrent+1;.  
f440: 69 6e 74 20 63 73 72 53 74 61 72 74 20 3d 20 63  int csrStart = c
f450: 73 72 43 75 72 72 65 6e 74 2b 32 3b 0a 20 20 69  srCurrent+2;.  i
f460: 6e 74 20 63 73 72 45 6e 64 20 3d 20 63 73 72 43  nt csrEnd = csrC
f470: 75 72 72 65 6e 74 2b 33 3b 0a 0a 20 20 69 6e 74  urrent+3;..  int
f480: 20 72 65 67 53 74 61 72 74 3b 20 20 20 20 20 20   regStart;      
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4a0: 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e   Value of <expr>
f4b0: 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20   PRECEDING */.  
f4c0: 69 6e 74 20 72 65 67 45 6e 64 3b 20 20 20 20 20  int regEnd;     
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
f4f0: 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f  pr> FOLLOWING */
f500: 0a 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72 20  ..  int iSubCsr 
f510: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
f520: 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e  iCursor;.  int n
f530: 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
f540: 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  [0].pTab->nCol;.
f550: 20 20 69 6e 74 20 6b 3b 0a 0a 20 20 69 6e 74 20    int k;..  int 
f560: 61 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e 74 20  addrGoto;.  int 
f570: 61 64 64 72 49 66 3b 0a 20 20 69 6e 74 20 61 64  addrIf;.  int ad
f580: 64 72 49 66 45 6e 64 3b 0a 20 20 69 6e 74 20 61  drIfEnd;.  int a
f590: 64 64 72 49 66 53 74 61 72 74 3b 0a 20 20 69 6e  ddrIfStart;.  in
f5a0: 74 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68  t addrGosubFlush
f5b0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 74 65  ;.  int addrInte
f5c0: 67 65 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 47  ger;.  int addrG
f5d0: 6f 74 6f 32 3b 0a 0a 20 20 69 6e 74 20 72 65 67  oto2;..  int reg
f5e0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
f5f0: 31 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  1;.  int regReco
f600: 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20  rd = reg+nSub;. 
f610: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20   int regRowid = 
f620: 72 65 67 52 65 63 6f 72 64 2b 31 3b 0a 0a 20 20  regRecord+1;..  
f630: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
f640: 31 20 2b 20 6e 53 75 62 20 2b 20 31 3b 0a 0a 20  1 + nSub + 1;.. 
f650: 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20   regFlushPart = 
f660: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f670: 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70    regStart = ++p
f680: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
f690: 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65  egEnd = ++pParse
f6a0: 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 61 73 73 65 72  ->nMem;..  asser
f6b0: 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  t( pMWin->eStart
f6c0: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a  ==TK_PRECEDING .
f6d0: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
f6e0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
f6f0: 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ENT .       || p
f700: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f710: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20  _FOLLOWING .    
f720: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
f730: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
f740: 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  D .  );.  assert
f750: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
f760: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20  K_FOLLOWING .   
f770: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
f780: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  nd==TK_CURRENT .
f790: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
f7a0: 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
f7b0: 44 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  DED .       || p
f7c0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
f7d0: 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 0a  RECEDING .  );..
f7e0: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f    /* Load the co
f7f0: 6c 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72 20  lumn values for 
f800: 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64  the row returned
f810: 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65   by the sub-sele
f820: 63 74 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  ct.  ** into an 
f830: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
f840: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  rs starting at r
f850: 65 67 2e 20 41 73 73 65 6d 62 6c 65 20 74 68 65  eg. Assemble the
f860: 6d 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 72 65  m into.  ** a re
f870: 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72  cord in register
f880: 20 72 65 67 52 65 63 6f 72 64 2e 20 54 4f 44 4f   regRecord. TODO
f890: 3a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  : An optimizatio
f8a0: 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20 66 6f 72  n here? */.  for
f8b0: 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b  (k=0; k<nSub; k+
f8c0: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
f8d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f8e0: 43 6f 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c  Column, iSubCsr,
f8f0: 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a   k, reg+k);.  }.
f900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f910: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
f920: 63 6f 72 64 2c 20 72 65 67 2c 20 6e 53 75 62 2c  cord, reg, nSub,
f930: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a 20 20   regRecord);..  
f940: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  /* Check if the 
f950: 63 75 72 72 65 6e 74 20 69 74 65 72 61 74 69 6f  current iteratio
f960: 6e 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  n is the first r
f970: 6f 77 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74  ow of a new part
f980: 69 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ition */.  if( p
f990: 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
f9a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
f9b0: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
f9c0: 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70  pPart = pMWin->p
f9d0: 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20 69  Partition;.    i
f9e0: 6e 74 20 6e 50 61 72 74 20 3d 20 70 50 61 72 74  nt nPart = pPart
f9f0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 6e 74  ->nExpr;.    int
fa00: 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65   regNewPart = re
fa10: 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  g + pMWin->nBuff
fa20: 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e  erCol;.    KeyIn
fa30: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
fa40: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
fa50: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
fa60: 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a  , pPart, 0, 0);.
fa70: 0a 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71  .    addrIf = sq
fa80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fa90: 76 2c 20 4f 50 5f 49 66 2c 20 70 4d 57 69 6e 2d  v, OP_If, pMWin-
faa0: 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 20 20  >regFirst);.    
fab0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
fac0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
fad0: 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61  ompare, regNewPa
fae0: 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  rt, pMWin->regPa
faf0: 72 74 2c 20 6e 50 61 72 74 29 3b 0a 20 20 20 20  rt, nPart);.    
fb00: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
fb10: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
fb20: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
fb30: 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
fb40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fb50: 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61  _Jump, addr+2, a
fb60: 64 64 72 2b 33 2c 20 61 64 64 72 2b 32 29 3b 0a  ddr+3, addr+2);.
fb70: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
fb80: 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 61 64 64  EqNe(v);.    add
fb90: 72 47 6f 73 75 62 46 6c 75 73 68 20 3d 20 73 71  rGosubFlush = sq
fba0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
fbb0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
fbc0: 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20  FlushPart);.    
fbd0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
fbe0: 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72 74  "call flush_part
fbf0: 69 74 69 6f 6e 22 29 29 3b 0a 20 20 20 20 73 71  ition"));.    sq
fc00: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fc10: 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20  e(v, addrIf);.  
fc20: 7d 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  }..  /* Insert t
fc30: 68 65 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20  he new row into 
fc40: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
fc50: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
fc60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fc70: 5f 4e 65 77 52 6f 77 69 64 2c 20 63 73 72 57 72  _NewRowid, csrWr
fc80: 69 74 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  ite, regRowid);.
fc90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fca0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
fcb0: 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65 67 52  , csrWrite, regR
fcc0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29  ecord, regRowid)
fcd0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  ;..  /* This blo
fce0: 63 6b 20 69 73 20 72 75 6e 20 66 6f 72 20 74 68  ck is run for th
fcf0: 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 65  e first row of e
fd00: 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f  ach partition */
fd10: 0a 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c 69  .  addrIf = sqli
fd20: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
fd30: 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 4d 57 69 6e   OP_IfNot, pMWin
fd40: 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 69  ->regFirst);.  i
fd50: 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  f( pMWin->pParti
fd60: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  tion ){.    sqli
fd70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fd80: 20 4f 50 5f 43 6f 70 79 2c 20 0a 20 20 20 20 20   OP_Copy, .     
fd90: 20 20 20 72 65 67 2b 70 4d 57 69 6e 2d 3e 6e 42     reg+pMWin->nB
fda0: 75 66 66 65 72 43 6f 6c 2c 20 70 4d 57 69 6e 2d  ufferCol, pMWin-
fdb0: 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d  >regPart, pMWin-
fdc0: 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78  >pPartition->nEx
fdd0: 70 72 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  pr-1.    );.  }.
fde0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fdf0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
fe00: 2c 20 63 73 72 53 74 61 72 74 2c 20 31 29 3b 20  , csrStart, 1); 
fe10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
fe20: 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 73  ngeP5(v, 1);.  s
fe30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
fe40: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
fe50: 73 72 43 75 72 72 65 6e 74 2c 20 31 29 3b 20 73  srCurrent, 1); s
fe60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
fe70: 50 35 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c 69  P5(v, 1);.  sqli
fe80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fe90: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 45   OP_Rewind, csrE
fea0: 6e 64 2c 20 31 29 3b 0a 20 20 72 65 67 41 72 67  nd, 1);.  regArg
feb0: 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63   = windowInitAcc
fec0: 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  um(pParse, pMWin
fed0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
fee0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
fef0: 74 65 67 65 72 2c 20 30 2c 20 70 4d 57 69 6e 2d  teger, 0, pMWin-
ff00: 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 73 71  >regFirst);.  sq
ff10: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ff20: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74  arse, pMWin->pSt
ff30: 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  art, regStart);.
ff40: 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74    windowCheckInt
ff50: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65  Value(pParse, re
ff60: 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 73 71  gStart, 0);.  sq
ff70: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ff80: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e  arse, pMWin->pEn
ff90: 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 77 69  d, regEnd);.  wi
ffa0: 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75  ndowCheckIntValu
ffb0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64  e(pParse, regEnd
ffc0: 2c 20 31 29 3b 0a 20 20 61 64 64 72 47 6f 74 6f  , 1);.  addrGoto
ffd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ffe0: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
fff0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  ;..  /* This blo
10000 63 6b 20 69 73 20 72 75 6e 20 66 6f 72 20 74 68  ck is run for th
10010 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62  e second and sub
10020 73 65 71 75 65 6e 74 20 72 6f 77 73 20 6f 66 20  sequent rows of 
10030 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 2a  each partition *
10040 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
10050 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
10060 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  f);.  sqlite3Vdb
10070 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10080 78 74 2c 20 63 73 72 45 6e 64 2c 20 73 71 6c 69  xt, csrEnd, sqli
10090 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
100a0 64 72 28 76 29 2b 31 29 3b 0a 20 20 61 64 64 72  dr(v)+1);.  addr
100b0 49 66 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  IfEnd = sqlite3V
100c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
100d0 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30  IfPos, regEnd, 0
100e0 2c 20 31 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67  , 1);.  windowAg
100f0 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
10100 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  MWin, 0);.  sqli
10110 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10120 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 43 75 72   OP_Next, csrCur
10130 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 56 64 62  rent, sqlite3Vdb
10140 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
10150 31 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 74 75  1);.  windowRetu
10160 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65 2c  rnOneRow(pParse,
10170 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75 62   pMWin, regGosub
10180 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20  , addrGosub);.  
10190 61 64 64 72 49 66 53 74 61 72 74 20 3d 20 73 71  addrIfStart = sq
101a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
101b0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
101c0 53 74 61 72 74 2c 20 30 2c 20 31 29 3b 0a 20 20  Start, 0, 1);.  
101d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
101e0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
101f0 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56  rStart, sqlite3V
10200 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
10210 29 2b 31 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67  )+1);.  windowAg
10220 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
10230 57 69 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31  Win, csrStart, 1
10240 2c 20 72 65 67 41 72 67 2c 20 30 29 3b 0a 20 20  , regArg, 0);.  
10250 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10260 65 72 65 28 76 2c 20 61 64 64 72 49 66 53 74 61  ere(v, addrIfSta
10270 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rt);.  sqlite3Vd
10280 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10290 64 72 49 66 45 6e 64 29 3b 0a 0a 20 20 73 71 6c  drIfEnd);..  sql
102a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
102b0 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20  (v, addrGoto);. 
102c0 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
102d0 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
102e0 72 45 6e 64 2c 20 30 2c 20 72 65 67 41 72 67 2c  rEnd, 0, regArg,
102f0 20 30 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f   0);..  /* End o
10300 66 20 74 68 65 20 6d 61 69 6e 20 69 6e 70 75 74  f the main input
10310 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74   loop */.  sqlit
10320 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
10330 6f 29 3b 0a 0a 20 20 2f 2a 20 46 61 6c 6c 20 74  o);..  /* Fall t
10340 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 66 28 20  hrough */.  if( 
10350 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
10360 6e 20 29 7b 0a 20 20 20 20 61 64 64 72 49 6e 74  n ){.    addrInt
10370 65 67 65 72 20 3d 20 73 71 6c 69 74 65 33 56 64  eger = sqlite3Vd
10380 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
10390 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 46 6c  nteger, 0, regFl
103a0 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20 73 71  ushPart);.    sq
103b0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
103c0 65 28 76 2c 20 61 64 64 72 47 6f 73 75 62 46 6c  e(v, addrGosubFl
103d0 75 73 68 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ush);.  }..  sql
103e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
103f0 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 43 75  , OP_Next, csrCu
10400 72 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 56 64  rrent, sqlite3Vd
10410 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
10420 2b 32 29 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20  +2);.  addrGoto 
10430 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10440 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
10450 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61  .  windowAggFina
10460 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  l(pParse, pMWin,
10470 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 74   0);.  windowRet
10480 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65  urnOneRow(pParse
10490 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75  , pMWin, regGosu
104a0 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
104b0 20 61 64 64 72 49 66 53 74 61 72 74 20 3d 20 73   addrIfStart = s
104c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
104d0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
104e0 67 53 74 61 72 74 2c 20 30 2c 20 31 29 3b 0a 20  gStart, 0, 1);. 
104f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10500 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
10510 73 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33  srStart, sqlite3
10520 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10530 76 29 2b 32 29 3b 0a 20 20 61 64 64 72 47 6f 74  v)+2);.  addrGot
10540 6f 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  o2 = sqlite3Vdbe
10550 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
10560 6f 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 53  o);.  windowAggS
10570 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
10580 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c 20  n, csrStart, 1, 
10590 72 65 67 41 72 67 2c 20 30 29 3b 0a 20 20 73 71  regArg, 0);.  sq
105a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
105b0 65 28 76 2c 20 61 64 64 72 49 66 53 74 61 72 74  e(v, addrIfStart
105c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
105d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
105e0 6f 2c 20 30 2c 20 61 64 64 72 47 6f 74 6f 2d 31  o, 0, addrGoto-1
105f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10600 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10610 47 6f 74 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33  Goto);.  sqlite3
10620 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
10630 61 64 64 72 47 6f 74 6f 32 29 3b 0a 0a 20 20 73  addrGoto2);..  s
10640 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
10650 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
10660 65 72 2c 20 63 73 72 43 75 72 72 65 6e 74 29 3b  er, csrCurrent);
10670 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10680 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
10690 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72 65  er, 1, pMWin->re
106a0 67 46 69 72 73 74 29 3b 0a 20 20 69 66 28 20 70  gFirst);.  if( p
106b0 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
106c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
106d0 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 61  dbeChangeP1(v, a
106e0 64 64 72 49 6e 74 65 67 65 72 2c 20 73 71 6c 69  ddrInteger, sqli
106f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10700 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69  dr(v));.    sqli
10710 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10720 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46   OP_Return, regF
10730 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a 7d  lushPart);.  }.}
10740 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
10750 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77  ction does the w
10760 6f 72 6b 20 6f 66 20 73 71 6c 69 74 65 33 57 69  ork of sqlite3Wi
10770 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66  ndowCodeStep() f
10780 6f 72 20 63 61 73 65 73 20 74 68 61 74 0a 2a 2a  or cases that.**
10790 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20   would normally 
107a0 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69  be handled by wi
107b0 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53  ndowCodeDefaultS
107c0 74 65 70 28 29 20 77 68 65 6e 20 74 68 65 72 65  tep() when there
107d0 20 61 72 65 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d   are.** one or m
107e0 6f 72 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ore built-in win
107f0 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow-functions th
10800 61 74 20 72 65 71 75 69 72 65 20 74 68 65 20 65  at require the e
10810 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f 6e 0a  ntire partition.
10820 2a 2a 20 74 6f 20 62 65 20 63 61 63 68 65 64 20  ** to be cached 
10830 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  in a temp table 
10840 62 65 66 6f 72 65 20 61 6e 79 20 72 6f 77 73 20  before any rows 
10850 63 61 6e 20 62 65 20 72 65 74 75 72 6e 65 64 2e  can be returned.
10860 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a 2a   Additionally..*
10870 2a 20 22 52 41 4e 47 45 20 42 45 54 57 45 45 4e  * "RANGE BETWEEN
10880 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44   CURRENT ROW AND
10890 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
108a0 57 49 4e 47 22 20 69 73 20 61 6c 77 61 79 73 20  WING" is always 
108b0 68 61 6e 64 6c 65 64 20 62 79 0a 2a 2a 20 74 68  handled by.** th
108c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
108d0 2a 2a 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 63  ** Pseudo-code c
108e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
108f0 74 68 65 20 56 4d 20 63 6f 64 65 20 67 65 6e 65  the VM code gene
10900 72 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  rated by this fu
10910 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65 61  nction.** for ea
10920 63 68 20 74 79 70 65 20 6f 66 20 77 69 6e 64 6f  ch type of windo
10930 77 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a  w follows..**.**
10940 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
10950 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
10960 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  NG AND CURRENT R
10970 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68  OW.**.**   flush
10980 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20  _partition:.**  
10990 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20     Once {.**    
109a0 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68     OpenDup (iEph
109b0 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a  Csr -> csrLead).
109c0 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
109d0 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a  Integer ctr 0.**
109e0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
109f0 20 28 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20   (csrLead){.**  
10a00 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 65 65       if( new pee
10a10 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  r ){.**         
10a20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
10a30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  ).**         for
10a40 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b  (i=0; i<ctr; i++
10a50 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
10a60 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
10a70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65 78  **           Nex
10a80 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20  t iEphCsr.**    
10a90 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
10aa0 20 20 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a    Integer ctr 0.
10ab0 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
10ac0 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72      AggStep (csr
10ad0 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 20 20 49  Lead).**       I
10ae0 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d  ncr ctr.**     }
10af0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46 69  .**.**     AggFi
10b00 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a  nal (xFinalize).
10b10 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  **     for(i=0; 
10b20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
10b30 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
10b40 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e  Gosub.**       N
10b50 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20  ext iEphCsr.**  
10b60 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52     }.**.**     R
10b70 65 73 65 74 53 6f 72 74 65 72 20 28 63 73 72 29  esetSorter (csr)
10b80 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a  .**     Return.*
10b90 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  *.** ROWS BETWEE
10ba0 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
10bb0 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
10bc0 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73  T ROW.**.**   As
10bd0 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
10be0 68 61 74 20 74 68 65 20 22 69 66 28 20 6e 65 77  hat the "if( new
10bf0 20 70 65 65 72 20 29 22 20 62 72 61 6e 63 68 20   peer )" branch 
10c00 69 73 20 61 6c 77 61 79 73 20 74 61 6b 65 6e 2e  is always taken.
10c10 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
10c20 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
10c30 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
10c40 20 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f   .**.**   As abo
10c50 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ve, except that 
10c60 65 61 63 68 20 6f 66 20 74 68 65 20 66 6f 72 28  each of the for(
10c70 29 20 6c 6f 6f 70 73 20 62 65 63 6f 6d 65 73 3a  ) loops becomes:
10c80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  .**.**         f
10c90 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69  or(i=0; i<ctr; i
10ca0 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ++){.**         
10cb0 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
10cc0 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  b.**           A
10cd0 67 67 49 6e 76 65 72 73 65 20 28 69 45 70 68 43  ggInverse (iEphC
10ce0 73 72 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  sr).**          
10cf0 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a   Next iEphCsr.**
10d00 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a           }.**.**
10d10 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
10d20 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
10d30 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  NG AND UNBOUNDED
10d40 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
10d50 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69     flush_partiti
10d60 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20  on:.**     Once 
10d70 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44  {.**       OpenD
10d80 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63  up (iEphCsr -> c
10d90 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d  srLead).**     }
10da0 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20  .**     foreach 
10db0 72 6f 77 20 28 63 73 72 4c 65 61 64 29 20 7b 0a  row (csrLead) {.
10dc0 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70  **       AggStep
10dd0 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20   (csrLead).**   
10de0 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61    }.**     forea
10df0 63 68 20 72 6f 77 20 28 69 45 70 68 43 73 72 29  ch row (iEphCsr)
10e00 20 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75   {.**       Gosu
10e10 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
10e20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a 20 52 41 4e 47     }.** .** RANG
10e30 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  E BETWEEN CURREN
10e40 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e  T ROW AND UNBOUN
10e50 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  DED FOLLOWING.**
10e60 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74  .**   flush_part
10e70 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e  ition:.**     On
10e80 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70  ce {.**       Op
10e90 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d  enDup (iEphCsr -
10ea0 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20  > csrLead).**   
10eb0 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61    }.**     forea
10ec0 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29  ch row (csrLead)
10ed0 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74  {.**       AggSt
10ee0 65 70 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20  ep (csrLead).** 
10ef0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77      }.**     Rew
10f00 69 6e 64 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a  ind (csrLead).**
10f10 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72       Integer ctr
10f20 20 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63   0.**     foreac
10f30 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b  h row (csrLead){
10f40 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65  .**       if( ne
10f50 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20  w peer ){.**    
10f60 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
10f70 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20  Value).**       
10f80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72    for(i=0; i<ctr
10f90 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20  ; i++){.**      
10fa0 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
10fb0 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20  osub.**         
10fc0 20 20 41 67 67 49 6e 76 65 72 73 65 20 28 69 45    AggInverse (iE
10fd0 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20 20 20  phCsr).**       
10fe0 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72      Next iEphCsr
10ff0 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
11000 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
11010 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 20 20   ctr 0.**       
11020 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63 72 20  }.**       Incr 
11030 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a  ctr.**     }.**.
11040 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20  **     AggFinal 
11050 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20  (xFinalize).**  
11060 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74     for(i=0; i<ct
11070 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20  r; i++){.**     
11080 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
11090 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20  b.**       Next 
110a0 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 7d  iEphCsr.**     }
110b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74  .**.**     Reset
110c0 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20  Sorter (csr).** 
110d0 20 20 20 20 52 65 74 75 72 6e 0a 2a 2f 0a 73 74      Return.*/.st
110e0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
110f0 43 6f 64 65 43 61 63 68 65 53 74 65 70 28 0a 20  CodeCacheStep(. 
11100 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11110 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20  .  Select *p,.  
11120 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
11130 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  o,.  int regGosu
11140 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  b, .  int addrGo
11150 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20  sub.){.  Window 
11160 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
11170 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
11180 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
11190 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20  rse);.  int k;. 
111a0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70   int addr;.  Exp
111b0 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
111c0 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
111d0 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
111e0 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e  rderBy = pMWin->
111f0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
11200 6e 50 65 65 72 20 3d 20 70 4f 72 64 65 72 42 79  nPeer = pOrderBy
11210 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   ? pOrderBy->nEx
11220 70 72 20 3a 20 30 3b 0a 20 20 69 6e 74 20 72 65  pr : 0;.  int re
11230 67 4e 65 77 50 65 65 72 3b 0a 0a 20 20 69 6e 74  gNewPeer;..  int
11240 20 61 64 64 72 47 6f 74 6f 3b 20 20 20 20 20 20   addrGoto;      
11250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11260 41 64 64 72 65 73 73 20 6f 66 20 47 6f 74 6f 20  Address of Goto 
11270 75 73 65 64 20 74 6f 20 6a 75 6d 70 20 66 6c 75  used to jump flu
11280 73 68 5f 70 61 72 2e 2e 20 2a 2f 0a 20 20 69 6e  sh_par.. */.  in
11290 74 20 61 64 64 72 4e 65 78 74 3b 20 20 20 20 20  t addrNext;     
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112b0 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
112c0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
112d0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72   loop */.  int r
112e0 65 67 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69  egFlushPart;.  i
112f0 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b  nt lblFlushPart;
11300 0a 20 20 69 6e 74 20 63 73 72 4c 65 61 64 3b 0a  .  int csrLead;.
11310 20 20 69 6e 74 20 72 65 67 43 74 72 3b 0a 20 20    int regCtr;.  
11320 69 6e 74 20 72 65 67 41 72 67 3b 20 20 20 20 20  int regArg;     
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11340 2f 2a 20 52 65 67 69 73 74 65 72 20 61 72 72 61  /* Register arra
11350 79 20 74 6f 20 6d 61 72 74 69 61 6c 20 66 75 6e  y to martial fun
11360 63 74 69 6f 6e 20 61 72 67 73 20 2a 2f 0a 20 20  ction args */.  
11370 69 6e 74 20 72 65 67 53 69 7a 65 3b 0a 20 20 69  int regSize;.  i
11380 6e 74 20 6c 62 6c 45 6d 70 74 79 3b 0a 20 20 69  nt lblEmpty;.  i
11390 6e 74 20 62 52 65 76 65 72 73 65 20 3d 20 70 4d  nt bReverse = pM
113a0 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  Win->pOrderBy &&
113b0 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
113c0 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
113d0 20 20 20 20 20 20 26 26 20 70 4d 57 69 6e 2d 3e        && pMWin->
113e0 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
113f0 45 44 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  ED;..  assert( (
11400 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
11410 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70  K_UNBOUNDED && p
11420 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
11430 55 52 52 45 4e 54 29 20 0a 20 20 20 20 20 20 20  URRENT) .       
11440 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  || (pMWin->eStar
11450 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t==TK_UNBOUNDED 
11460 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
11470 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20  TK_UNBOUNDED) . 
11480 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d        || (pMWin-
11490 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
114a0 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  ENT && pMWin->eE
114b0 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20  nd==TK_CURRENT) 
114c0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
114d0 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
114e0 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e  RRENT && pMWin->
114f0 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
11500 45 44 29 20 0a 20 20 29 3b 0a 0a 20 20 6c 62 6c  ED) .  );..  lbl
11510 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33 56  Empty = sqlite3V
11520 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
11530 72 73 65 29 3b 0a 20 20 72 65 67 4e 65 77 50 65  rse);.  regNewPe
11540 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  er = pParse->nMe
11550 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
11560 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a 20  Mem += nPeer;.. 
11570 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67   /* Allocate reg
11580 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20  ister and label 
11590 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70  for the "flush_p
115a0 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f  artition" sub-ro
115b0 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46  utine. */.  regF
115c0 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61  lushPart = ++pPa
115d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c  rse->nMem;.  lbl
115e0 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69  FlushPart = sqli
115f0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11600 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 63 73 72  (pParse);..  csr
11610 4c 65 61 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Lead = pParse->n
11620 54 61 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20  Tab++;.  regCtr 
11630 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
11640 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69  ;..  windowParti
11650 74 69 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65  tionCache(pParse
11660 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
11670 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c  FlushPart, lblFl
11680 75 73 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a  ushPart, &regSiz
11690 65 29 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d  e);.  addrGoto =
116a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
116b0 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
116c0 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22  .  /* Start of "
116d0 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22  flush_partition"
116e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
116f0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
11700 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a   lblFlushPart);.
11710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11720 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20  Op2(v, OP_Once, 
11730 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  0, sqlite3VdbeCu
11740 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b  rrentAddr(v)+2);
11750 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
11760 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
11770 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
11780 65 6e 44 75 70 2c 20 63 73 72 4c 65 61 64 2c 20  enDup, csrLead, 
11790 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
117a0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
117b0 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
117c0 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 65  r register for e
117d0 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
117e0 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20  ion to NULL */. 
117f0 20 72 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77   regArg = window
11800 49 6e 69 74 41 63 63 75 6d 28 70 50 61 72 73 65  InitAccum(pParse
11810 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c  , pMWin);..  sql
11820 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11830 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
11840 20 72 65 67 43 74 72 29 3b 0a 20 20 73 71 6c 69   regCtr);.  sqli
11850 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11860 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c   OP_Rewind, csrL
11870 65 61 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a  ead, lblEmpty);.
11880 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11890 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
118a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
118b0 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ind, pMWin->iEph
118c0 43 73 72 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a  Csr, lblEmpty);.
118d0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
118e0 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 0a 20 20  verTaken(v);..  
118f0 69 66 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a  if( bReverse ){.
11900 20 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d 20      int addr2 = 
11910 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
11920 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 77  ntAddr(v);.    w
11930 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
11940 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c  rse, pMWin, csrL
11950 65 61 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20  ead, 0, regArg, 
11960 72 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71  regSize);.    sq
11970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11980 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c  v, OP_Next, csrL
11990 65 61 64 2c 20 61 64 64 72 32 29 3b 0a 20 20 20  ead, addr2);.   
119a0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
119b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
119c0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
119d0 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20 6c  wind, csrLead, l
119e0 62 6c 45 6d 70 74 79 29 3b 0a 20 20 20 20 56 64  blEmpty);.    Vd
119f0 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
11a00 61 6b 65 6e 28 76 29 3b 0a 20 20 7d 0a 20 20 61  aken(v);.  }.  a
11a10 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
11a20 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11a30 28 76 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64  (v);..  if( pOrd
11a40 65 72 42 79 20 26 26 20 28 70 4d 57 69 6e 2d 3e  erBy && (pMWin->
11a50 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
11a60 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
11a70 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 29  t==TK_CURRENT) )
11a80 7b 0a 20 20 20 20 69 6e 74 20 62 43 75 72 72 65  {.    int bCurre
11a90 6e 74 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 53 74  nt = (pMWin->eSt
11aa0 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  art==TK_CURRENT)
11ab0 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75  ;.    int addrJu
11ac0 6d 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  mp = 0;         
11ad0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
11ae0 66 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20  f OP_Jump below 
11af0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  */.    if( pMWin
11b00 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
11b10 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  E ){.      int i
11b20 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75  Off = pMWin->nBu
11b30 66 66 65 72 43 6f 6c 20 2b 20 28 70 50 61 72 74  fferCol + (pPart
11b40 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20   ? pPart->nExpr 
11b50 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  : 0);.      int 
11b60 72 65 67 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d  regPeer = pMWin-
11b70 3e 72 65 67 50 61 72 74 20 2b 20 28 70 50 61 72  >regPart + (pPar
11b80 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72  t ? pPart->nExpr
11b90 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 4b 65 79   : 0);.      Key
11ba0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
11bb0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
11bc0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
11bd0 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c  se, pOrderBy, 0,
11be0 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b   0);.      for(k
11bf0 3d 30 3b 20 6b 3c 6e 50 65 65 72 3b 20 6b 2b 2b  =0; k<nPeer; k++
11c00 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11c10 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
11c20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 4c 65  OP_Column, csrLe
11c30 61 64 2c 20 69 4f 66 66 2b 6b 2c 20 72 65 67 4e  ad, iOff+k, regN
11c40 65 77 50 65 65 72 2b 6b 29 3b 0a 20 20 20 20 20  ewPeer+k);.     
11c50 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20   }.      addr = 
11c60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11c70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
11c80 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67   regNewPeer, reg
11c90 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20  Peer, nPeer);.  
11ca0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11cb0 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
11cc0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
11cd0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61  EYINFO);.      a
11ce0 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65  ddrJump = sqlite
11cf0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11d00 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20  P_Jump, addr+2, 
11d10 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  0, addr+2);.    
11d20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
11d30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11d40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11d50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 65 65  _Copy, regNewPee
11d60 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65  r, regPeer, nPee
11d70 72 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r-1);.    }..   
11d80 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77   windowReturnRow
11d90 73 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  s(pParse, pMWin,
11da0 20 72 65 67 43 74 72 2c 20 72 65 67 47 6f 73 75   regCtr, regGosu
11db0 62 2c 20 61 64 64 72 47 6f 73 75 62 2c 20 0a 20  b, addrGosub, . 
11dc0 20 20 20 20 20 20 20 28 62 43 75 72 72 65 6e 74         (bCurrent
11dd0 20 3f 20 72 65 67 41 72 67 20 3a 20 30 29 2c 20   ? regArg : 0), 
11de0 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65 67 53  (bCurrent ? regS
11df0 69 7a 65 20 3a 20 30 29 0a 20 20 20 20 29 3b 0a  ize : 0).    );.
11e00 20 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70      if( addrJump
11e10 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
11e20 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75  mpHere(v, addrJu
11e30 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  mp);.  }..  if( 
11e40 62 52 65 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20  bReverse==0 ){. 
11e50 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70     windowAggStep
11e60 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
11e70 63 73 72 4c 65 61 64 2c 20 30 2c 20 72 65 67 41  csrLead, 0, regA
11e80 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20  rg, regSize);.  
11e90 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
11ea0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
11eb0 6d 6d 2c 20 72 65 67 43 74 72 2c 20 31 29 3b 0a  mm, regCtr, 1);.
11ec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11ed0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
11ee0 63 73 72 4c 65 61 64 2c 20 61 64 64 72 4e 65 78  csrLead, addrNex
11ef0 74 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  t);.  VdbeCovera
11f00 67 65 28 76 29 3b 0a 0a 20 20 77 69 6e 64 6f 77  ge(v);..  window
11f10 52 65 74 75 72 6e 52 6f 77 73 28 70 50 61 72 73  ReturnRows(pPars
11f20 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43 74 72  e, pMWin, regCtr
11f30 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
11f40 47 6f 73 75 62 2c 20 30 2c 20 30 29 3b 0a 0a 20  Gosub, 0, 0);.. 
11f50 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11f60 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 45  lveLabel(v, lblE
11f70 6d 70 74 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  mpty);.  sqlite3
11f80 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
11f90 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d  _ResetSorter, pM
11fa0 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
11fb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11fc0 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
11fd0 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a   regFlushPart);.
11fe0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65  .  /* Jump to he
11ff0 72 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20  re to skip over 
12000 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20  flush_partition 
12010 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
12020 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
12030 47 6f 74 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Goto);.}.../*.**
12040 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
12050 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
12060 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  NG AND CURRENT R
12070 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a  OW.**.**   ....*
12080 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 61  *     if( new pa
12090 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20  rtition ){.**   
120a0 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46      AggFinal (xF
120b0 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20  inalize).**     
120c0 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
120d0 62 0a 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74  b.**       Reset
120e0 53 6f 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65  Sorter eph-table
120f0 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
12100 20 65 6c 73 65 20 69 66 28 20 6e 65 77 20 70 65   else if( new pe
12110 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  er ){.**       A
12120 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29  ggFinal (xValue)
12130 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
12140 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
12150 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 65     ResetSorter e
12160 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ph-table.**     
12170 7d 0a 2a 2a 20 20 20 20 20 41 67 67 53 74 65 70  }.**     AggStep
12180 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20 28  .**     Insert (
12190 72 65 63 6f 72 64 20 69 6e 74 6f 20 65 70 68 2d  record into eph-
121a0 74 61 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c 69  table).**   sqli
121b0 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
121c0 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69     AggFinal (xFi
121d0 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 47 6f 73  nalize).**   Gos
121e0 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 0a  ub addrGosub.**.
121f0 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e  ** RANGE BETWEEN
12200 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
12210 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44  DING AND UNBOUND
12220 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  ED FOLLOWING.**.
12230 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65  **   As above, e
12240 78 63 65 70 74 20 74 61 6b 65 20 6e 6f 20 61 63  xcept take no ac
12250 74 69 6f 6e 20 66 6f 72 20 61 20 22 6e 65 77 20  tion for a "new 
12260 70 65 65 72 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a  peer". Invoke.**
12270 20 20 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69     the sub-routi
12280 6e 65 20 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f 72  ne once only for
12290 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 2e   each partition.
122a0 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
122b0 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
122c0 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
122d0 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76  .**.**   As abov
122e0 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
122f0 68 65 20 22 6e 65 77 20 70 65 65 72 22 20 63 6f  he "new peer" co
12300 6e 64 69 74 69 6f 6e 20 69 73 20 68 61 6e 64 6c  ndition is handl
12310 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 73  ed in the.**   s
12320 61 6d 65 20 77 61 79 20 61 73 20 22 6e 65 77 20  ame way as "new 
12330 70 61 72 74 69 74 69 6f 6e 22 20 28 73 6f 20 74  partition" (so t
12340 68 65 72 65 20 69 73 20 6e 6f 20 22 65 6c 73 65  here is no "else
12350 20 69 66 22 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a   if" block)..**.
12360 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
12370 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
12380 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
12390 52 4f 57 0a 2a 2a 20 0a 2a 2a 20 20 20 41 73 20  ROW.** .**   As 
123a0 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 61 73  above, except as
123b0 73 75 6d 65 20 65 76 65 72 79 20 72 6f 77 20 69  sume every row i
123c0 73 20 61 20 22 6e 65 77 20 70 65 65 72 22 2e 0a  s a "new peer"..
123d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
123e0 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74  indowCodeDefault
123f0 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
12400 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74  Parse, .  Select
12410 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f   *p,.  WhereInfo
12420 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20   *pWInfo,.  int 
12430 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74  regGosub, .  int
12440 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20   addrGosub.){.  
12450 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
12460 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20  p->pWin;.  Vdbe 
12470 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
12480 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
12490 6e 74 20 6b 3b 0a 20 20 69 6e 74 20 69 53 75 62  nt k;.  int iSub
124a0 43 73 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Csr = p->pSrc->a
124b0 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69  [0].iCursor;.  i
124c0 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72  nt nSub = p->pSr
124d0 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43  c->a[0].pTab->nC
124e0 6f 6c 3b 0a 20 20 69 6e 74 20 72 65 67 20 3d 20  ol;.  int reg = 
124f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
12500 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20    int regRecord 
12510 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e  = reg+nSub;.  in
12520 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67  t regRowid = reg
12530 52 65 63 6f 72 64 2b 31 3b 0a 20 20 69 6e 74 20  Record+1;.  int 
12540 61 64 64 72 3b 0a 20 20 45 78 70 72 4c 69 73 74  addr;.  ExprList
12550 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d   *pPart = pMWin-
12560 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45  >pPartition;.  E
12570 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
12580 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  y = pMWin->pOrde
12590 72 42 79 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rBy;..  assert( 
125a0 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b  pMWin->eType==TK
125b0 5f 52 41 4e 47 45 20 0a 20 20 20 20 20 20 7c 7c  _RANGE .      ||
125c0 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
125d0 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26  =TK_UNBOUNDED &&
125e0 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
125f0 5f 43 55 52 52 45 4e 54 29 0a 20 20 29 3b 0a 0a  _CURRENT).  );..
12600 20 20 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e    assert( (pMWin
12610 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
12620 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d  OUNDED && pMWin-
12630 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e  >eEnd==TK_CURREN
12640 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  T).       || (pM
12650 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
12660 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57  UNBOUNDED && pMW
12670 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
12680 4f 55 4e 44 45 44 29 0a 20 20 20 20 20 20 20 7c  OUNDED).       |
12690 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  | (pMWin->eStart
126a0 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20  ==TK_CURRENT && 
126b0 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
126c0 43 55 52 52 45 4e 54 29 0a 20 20 20 20 20 20 20  CURRENT).       
126d0 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  || (pMWin->eStar
126e0 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26  t==TK_CURRENT &&
126f0 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
12700 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 21 70  _UNBOUNDED && !p
12710 4f 72 64 65 72 42 79 29 0a 20 20 29 3b 0a 0a 20  OrderBy).  );.. 
12720 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
12730 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  ==TK_UNBOUNDED )
12740 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  {.    pOrderBy =
12750 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 72 73   0;.  }..  pPars
12760 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20  e->nMem += nSub 
12770 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  + 2;..  /* Load 
12780 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 63  the individual c
12790 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6f 66 20  olumn values of 
127a0 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64  the row returned
127b0 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 73 75 62   by.  ** the sub
127c0 2d 73 65 6c 65 63 74 20 69 6e 74 6f 20 61 6e 20  -select into an 
127d0 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
127e0 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  rs. */.  for(k=0
127f0 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a  ; k<nSub; k++){.
12800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12810 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
12820 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20  mn, iSubCsr, k, 
12830 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f  reg+k);.  }..  /
12840 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
12850 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  is the start of 
12860 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  a new partition 
12870 6f 72 20 70 65 65 72 20 67 72 6f 75 70 2e 20 2a  or peer group. *
12880 2f 0a 20 20 69 66 28 20 70 50 61 72 74 20 7c 7c  /.  if( pPart ||
12890 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
128a0 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 50   int nPart = (pP
128b0 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78  art ? pPart->nEx
128c0 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  pr : 0);.    int
128d0 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20   addrGoto = 0;. 
128e0 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20     int addrJump 
128f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65  = 0;.    int nPe
12900 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f  er = (pOrderBy ?
12910 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
12920 20 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20   : 0);..    if( 
12930 70 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  pPart ){.      i
12940 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20  nt regNewPart = 
12950 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75  reg + pMWin->nBu
12960 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20 4b  fferCol;.      K
12970 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
12980 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
12990 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
129a0 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20  arse, pPart, 0, 
129b0 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  0);.      addr =
129c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
129d0 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
129e0 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d  , regNewPart, pM
129f0 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61  Win->regPart,nPa
12a00 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
12a10 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
12a20 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
12a30 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
12a40 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d        addrJump =
12a50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12a60 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
12a70 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32  ddr+2, 0, addr+2
12a80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
12a90 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a 20 20  erageEqNe(v);.  
12aa0 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e      windowAggFin
12ab0 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  al(pParse, pMWin
12ac0 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
12ad0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
12ae0 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73      addrGoto = s
12af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
12b00 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
12b10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12b20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
12b30 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4e 65  .      int regNe
12b40 77 50 65 65 72 20 3d 20 72 65 67 20 2b 20 70 4d  wPeer = reg + pM
12b50 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20  Win->nBufferCol 
12b60 2b 20 6e 50 61 72 74 3b 0a 20 20 20 20 20 20 69  + nPart;.      i
12b70 6e 74 20 72 65 67 50 65 65 72 20 3d 20 70 4d 57  nt regPeer = pMW
12b80 69 6e 2d 3e 72 65 67 50 61 72 74 20 2b 20 6e 50  in->regPart + nP
12b90 61 72 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  art;..      if( 
12ba0 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74  addrJump ) sqlit
12bb0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
12bc0 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 20  , addrJump);.   
12bd0 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54     if( pMWin->eT
12be0 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b  ype==TK_RANGE ){
12bf0 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
12c00 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c   *pKeyInfo = sql
12c10 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
12c20 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
12c30 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b  pOrderBy, 0, 0);
12c40 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
12c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12c60 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
12c70 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67   regNewPeer, reg
12c80 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20 20  Peer, nPeer);.  
12c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12ca0 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
12cb0 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  id*)pKeyInfo, P4
12cc0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
12cd0 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71     addrJump = sq
12ce0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12cf0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
12d00 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a  +2, 0, addr+2);.
12d10 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
12d20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
12d30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 64  else{.        ad
12d40 64 72 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 20 20  drJump = 0;.    
12d50 20 20 7d 0a 20 20 20 20 20 20 77 69 6e 64 6f 77    }.      window
12d60 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c  AggFinal(pParse,
12d70 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 65   pMWin, pMWin->e
12d80 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
12d90 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  T);.      if( ad
12da0 64 72 47 6f 74 6f 20 29 20 73 71 6c 69 74 65 33  drGoto ) sqlite3
12db0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
12dc0 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20 20 20 7d  addrGoto);.    }
12dd0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
12de0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
12df0 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  wind, pMWin->iEp
12e00 68 43 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65  hCsr,sqlite3Vdbe
12e10 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
12e20 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
12e30 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
12e40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12e50 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f   OP_Gosub, regGo
12e60 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
12e70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
12e90 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
12ea0 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
12eb0 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b  rrentAddr(v)-1);
12ec0 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
12ed0 65 28 76 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  e(v);..    sqlit
12ee0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12ef0 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
12f00 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
12f10 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12f20 41 64 64 4f 70 33 28 0a 20 20 20 20 20 20 20 20  AddOp3(.        
12f30 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 2b  v, OP_Copy, reg+
12f40 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
12f50 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  l, pMWin->regPar
12f60 74 2c 20 6e 50 61 72 74 2b 6e 50 65 65 72 2d 31  t, nPart+nPeer-1
12f70 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28  .    );..    if(
12f80 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c 69   addrJump ) sqli
12f90 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
12fa0 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20  v, addrJump);.  
12fb0 7d 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73  }..  /* Invoke s
12fc0 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  tep function for
12fd0 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
12fe0 73 20 2a 2f 0a 20 20 77 69 6e 64 6f 77 41 67 67  s */.  windowAgg
12ff0 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
13000 69 6e 2c 20 2d 31 2c 20 30 2c 20 72 65 67 2c 20  in, -1, 0, reg, 
13010 30 29 3b 0a 0a 20 20 2f 2a 20 42 75 66 66 65 72  0);..  /* Buffer
13020 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
13030 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61   in the ephemera
13040 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69 66  l table. */.  if
13050 28 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  ( pMWin->nBuffer
13060 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Col>0 ){.    sql
13070 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13080 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
13090 20 72 65 67 2c 20 70 4d 57 69 6e 2d 3e 6e 42 75   reg, pMWin->nBu
130a0 66 66 65 72 43 6f 6c 2c 20 72 65 67 52 65 63 6f  fferCol, regReco
130b0 72 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rd);.  }else{.  
130c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
130d0 4f 70 32 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20  Op2(v, OP_Blob, 
130e0 30 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  0, regRecord);. 
130f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
13100 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
13110 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  )"", 0);.  }.  s
13120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13130 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
13140 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
13150 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71   regRowid);.  sq
13160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13170 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 4d  v, OP_Insert, pM
13180 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65  Win->iEphCsr, re
13190 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69  gRecord, regRowi
131a0 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 74 68  d);..  /* End th
131b0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
131c0 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  loop. */.  sqlit
131d0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
131e0 6f 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 41 67 67  o);..  windowAgg
131f0 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d  Final(pParse, pM
13200 57 69 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  Win, 1);.  sqlit
13210 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13220 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e  OP_Rewind, pMWin
13230 2d 3e 69 45 70 68 43 73 72 2c 73 71 6c 69 74 65  ->iEphCsr,sqlite
13240 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13250 28 76 29 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f  (v)+3);.  VdbeCo
13260 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
13270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13280 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47  , OP_Gosub, regG
13290 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
132a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
132b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
132c0 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
132d0 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
132e0 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b 0a  rentAddr(v)-1);.
132f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
13300 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
13310 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
13320 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  a duplicate of t
13330 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  he Window object
13340 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
13350 65 0a 2a 2a 20 74 68 69 72 64 20 61 72 67 75 6d  e.** third argum
13360 65 6e 74 2e 20 53 65 74 20 74 68 65 20 57 69 6e  ent. Set the Win
13370 64 6f 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c 64  dow.pOwner field
13380 20 6f 66 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   of the new obje
13390 63 74 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e  ct to.** pOwner.
133a0 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69  .*/.Window *sqli
133b0 74 65 33 57 69 6e 64 6f 77 44 75 70 28 73 71 6c  te3WindowDup(sql
133c0 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a  ite3 *db, Expr *
133d0 70 4f 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20 2a  pOwner, Window *
133e0 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4e  p){.  Window *pN
133f0 65 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 41 4c  ew = 0;.  if( AL
13400 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20 70  WAYS(p) ){.    p
13410 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
13420 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
13430 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20  zeof(Window));. 
13440 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
13450 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65       pNew->zName
13460 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
13470 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29  up(db, p->zName)
13480 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46  ;.      pNew->pF
13490 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45  ilter = sqlite3E
134a0 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 46  xprDup(db, p->pF
134b0 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  ilter, 0);.     
134c0 20 70 4e 65 77 2d 3e 70 46 75 6e 63 20 3d 20 70   pNew->pFunc = p
134d0 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 70  ->pFunc;.      p
134e0 4e 65 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  New->pPartition 
134f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
13500 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 61 72  tDup(db, p->pPar
13510 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20  tition, 0);.    
13520 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
13530 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
13540 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f 72  stDup(db, p->pOr
13550 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20 20  derBy, 0);.     
13560 20 70 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20 70   pNew->eType = p
13570 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  ->eType;.      p
13580 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65  New->eEnd = p->e
13590 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  End;.      pNew-
135a0 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74  >eStart = p->eSt
135b0 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  art;.      pNew-
135c0 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65  >pStart = sqlite
135d0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
135e0 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  pStart, 0);.    
135f0 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20 73    pNew->pEnd = s
13600 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
13610 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20  , p->pEnd, 0);. 
13620 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 77 6e 65       pNew->pOwne
13630 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20 20 20 20  r = pOwner;.    
13640 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
13650 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  New;.}../*.** Re
13660 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  turn a copy of t
13670 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
13680 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73  f Window objects
13690 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a 2a   passed as the.*
136a0 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * second argumen
136b0 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71  t..*/.Window *sq
136c0 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74 44  lite3WindowListD
136d0 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  up(sqlite3 *db, 
136e0 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69  Window *p){.  Wi
136f0 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57 69  ndow *pWin;.  Wi
13700 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20 30 3b 0a  ndow *pRet = 0;.
13710 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70 20 3d 20    Window **pp = 
13720 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72 28 70 57  &pRet;..  for(pW
13730 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70 57 69 6e  in=p; pWin; pWin
13740 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
13750 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c 69  {.    *pp = sqli
13760 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62 2c  te3WindowDup(db,
13770 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20 69   0, pWin);.    i
13780 66 28 20 2a 70 70 3d 3d 30 20 29 20 62 72 65 61  f( *pp==0 ) brea
13790 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26 28 28 2a  k;.    pp = &((*
137a0 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e 29 3b 0a  pp)->pNextWin);.
137b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
137c0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  et;.}../*.** sql
137d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
137e0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
137f0 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  n called for the
13800 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13810 74 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73 20  t .** passed as 
13820 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
13830 65 6e 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  ent when this fu
13840 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
13850 64 2e 20 49 74 20 67 65 6e 65 72 61 74 65 73 0a  d. It generates.
13860 2a 2a 20 63 6f 64 65 20 74 6f 20 70 6f 70 75 6c  ** code to popul
13870 61 74 65 20 74 68 65 20 57 69 6e 64 6f 77 2e 72  ate the Window.r
13880 65 67 52 65 73 75 6c 74 20 72 65 67 69 73 74 65  egResult registe
13890 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  r for each windo
138a0 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a  w function and.*
138b0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62  * invoke the sub
138c0 2d 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73 74  -routine at inst
138d0 72 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73 75  ruction addrGosu
138e0 62 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  b once for each 
138f0 72 6f 77 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  row..** This fun
13900 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ction calls sqli
13910 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 62 65  te3WhereEnd() be
13920 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
13930 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13940 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 0a  WindowCodeStep(.
13950 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
13980 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
13990 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
139a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69          /* Rewri
139b0 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61 74  tten SELECT stat
139c0 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72 65  ement */.  Where
139d0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20  Info *pWInfo,   
139e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
139f0 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64 20 62  ntext returned b
13a00 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  y sqlite3WhereBe
13a10 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 72  gin() */.  int r
13a20 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20  egGosub,        
13a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13a40 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 47 6f  gister for OP_Go
13a50 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  sub */.  int add
13a60 72 47 6f 73 75 62 20 20 20 20 20 20 20 20 20 20  rGosub          
13a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47           /* OP_G
13a80 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72 65 74  osub here to ret
13a90 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a  urn each row */.
13aa0 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  ){.  Window *pMW
13ab0 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 0a 20  in = p->pWin;.. 
13ac0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 74 68   /* There are th
13ad0 72 65 65 20 64 69 66 66 65 72 65 6e 74 20 66 75  ree different fu
13ae0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 61 79  nctions that may
13af0 20 62 65 20 75 73 65 64 20 74 6f 20 64 6f 20 74   be used to do t
13b00 68 65 20 77 6f 72 6b 0a 20 20 2a 2a 20 6f 66 20  he work.  ** of 
13b10 74 68 69 73 20 6f 6e 65 2c 20 64 65 70 65 6e 64  this one, depend
13b20 69 6e 67 20 6f 6e 20 74 68 65 20 77 69 6e 64 6f  ing on the windo
13b30 77 20 66 72 61 6d 65 20 61 6e 64 20 74 68 65 20  w frame and the 
13b40 73 70 65 63 69 66 69 63 20 62 75 69 6c 74 2d 69  specific built-i
13b50 6e 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75  n.  ** window fu
13b60 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 28 69 66  nctions used (if
13b70 20 61 6e 79 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   any)..  **.  **
13b80 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78   windowCodeRowEx
13b90 70 72 53 74 65 70 28 29 20 68 61 6e 64 6c 65 73  prStep() handles
13ba0 20 61 6c 6c 20 22 52 4f 57 53 22 20 77 69 6e 64   all "ROWS" wind
13bb0 6f 77 20 66 72 61 6d 65 73 2c 20 65 78 63 65 70  ow frames, excep
13bc0 74 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  t for:.  **.  **
13bd0 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20     ROWS BETWEEN 
13be0 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
13bf0 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
13c00 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ROW.  **.  ** Th
13c10 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 62  e exception is b
13c20 65 63 61 75 73 65 20 77 69 6e 64 6f 77 43 6f 64  ecause windowCod
13c30 65 52 6f 77 45 78 70 72 53 74 65 70 28 29 20 69  eRowExprStep() i
13c40 6d 70 6c 65 6d 65 6e 74 73 20 61 6c 6c 20 77 69  mplements all wi
13c50 6e 64 6f 77 0a 20 20 2a 2a 20 66 72 61 6d 65 20  ndow.  ** frame 
13c60 74 79 70 65 73 20 62 79 20 63 61 63 68 69 6e 67  types by caching
13c70 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 74   the entire part
13c80 69 74 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20  ition in a temp 
13c90 74 61 62 6c 65 2c 20 61 6e 64 0a 20 20 2a 2a 20  table, and.  ** 
13ca0 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e  "ROWS BETWEEN UN
13cb0 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
13cc0 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
13cd0 57 22 20 69 73 20 65 61 73 79 20 65 6e 6f 75 67  W" is easy enoug
13ce0 68 20 74 6f 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d  h to.  ** implem
13cf0 65 6e 74 20 77 69 74 68 6f 75 74 20 73 75 63 68  ent without such
13d00 20 61 20 63 61 63 68 65 2e 0a 20 20 2a 2a 0a 20   a cache..  **. 
13d10 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65 43 61   ** windowCodeCa
13d20 63 68 65 53 74 65 70 28 29 20 69 73 20 75 73 65  cheStep() is use
13d30 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  d for:.  **.  **
13d40 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e     RANGE BETWEEN
13d50 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44   CURRENT ROW AND
13d60 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
13d70 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  WING.  **.  ** I
13d80 74 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 66  t is also used f
13d90 6f 72 20 61 6e 79 74 68 69 6e 67 20 6e 6f 74 20  or anything not 
13da0 68 61 6e 64 6c 65 64 20 62 79 20 77 69 6e 64 6f  handled by windo
13db0 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70  wCodeRowExprStep
13dc0 28 29 20 0a 20 20 2a 2a 20 74 68 61 74 20 69 6e  () .  ** that in
13dd0 76 6f 6b 65 73 20 61 20 62 75 69 6c 74 2d 69 6e  vokes a built-in
13de0 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
13df0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
13e00 68 65 20 65 6e 74 69 72 65 20 0a 20 20 2a 2a 20  he entire .  ** 
13e10 70 61 72 74 69 74 69 6f 6e 20 74 6f 20 62 65 20  partition to be 
13e20 63 61 63 68 65 64 20 69 6e 20 61 20 74 65 6d 70  cached in a temp
13e30 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 61 6e   table before an
13e40 79 20 72 6f 77 73 20 61 72 65 20 72 65 74 75 72  y rows are retur
13e50 6e 65 64 0a 20 20 2a 2a 20 28 65 2e 67 2e 20 6e  ned.  ** (e.g. n
13e60 74 68 5f 76 61 6c 75 65 28 29 20 6f 72 20 70 65  th_value() or pe
13e70 72 63 65 6e 74 5f 72 61 6e 6b 28 29 29 2e 0a 20  rcent_rank()).. 
13e80 20 2a 2a 0a 20 20 2a 2a 20 46 69 6e 61 6c 6c 79   **.  ** Finally
13e90 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65  , assuming there
13ea0 20 69 73 20 6e 6f 20 62 75 69 6c 74 2d 69 6e 20   is no built-in 
13eb0 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
13ec0 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 20 20  that requires.  
13ed0 2a 2a 20 74 68 65 20 70 61 72 74 69 74 69 6f 6e  ** the partition
13ee0 20 74 6f 20 62 65 20 63 61 63 68 65 64 2c 20 77   to be cached, w
13ef0 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74  indowCodeDefault
13f00 53 74 65 70 28 29 20 69 73 20 75 73 65 64 20 66  Step() is used f
13f10 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  or:.  **.  **   
13f20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e  RANGE BETWEEN UN
13f30 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
13f40 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
13f50 57 20 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20  W .  **   RANGE 
13f60 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
13f70 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
13f80 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
13f90 49 4e 47 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45  ING.  **   RANGE
13fa0 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
13fb0 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54   ROW AND CURRENT
13fc0 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52 4f 57   ROW .  **   ROW
13fd0 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
13fe0 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
13ff0 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20  D CURRENT ROW.  
14000 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f  **.  ** windowCo
14010 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 20  deDefaultStep() 
14020 69 73 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20  is the only one 
14030 6f 66 20 74 68 65 20 74 68 72 65 65 20 66 75 6e  of the three fun
14040 63 74 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a 2a  ctions that.  **
14050 20 64 6f 65 73 20 6e 6f 74 20 63 61 63 68 65 20   does not cache 
14060 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 69  each partition i
14070 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62  n a temp table b
14080 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20  efore beginning 
14090 74 6f 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 72  to.  ** return r
140a0 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ows..  */.  if( 
140b0 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b  pMWin->eType==TK
140c0 5f 52 4f 57 53 20 0a 20 20 20 26 26 20 28 70 4d  _ROWS .   && (pM
140d0 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f  Win->eStart!=TK_
140e0 55 4e 42 4f 55 4e 44 45 44 7c 7c 70 4d 57 69 6e  UNBOUNDED||pMWin
140f0 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43 55 52 52 45  ->eEnd!=TK_CURRE
14100 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e 70 4f 72 64  NT||!pMWin->pOrd
14110 65 72 42 79 29 0a 20 20 29 7b 0a 20 20 20 20 57  erBy).  ){.    W
14120 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20  indow *pWin;.   
14130 20 69 6e 74 20 62 43 61 63 68 65 20 3d 20 30 3b   int bCache = 0;
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14150 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 43 61  * True to use Ca
14160 63 68 65 53 74 65 70 28 29 20 2a 2f 0a 20 20 20  cheStep() */.   
14170 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
14180 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
14190 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
141a0 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e     FuncDef *pFun
141b0 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  c = pWin->pFunc;
141c0 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75 6e  .      if( (pFun
141d0 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
141e0 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
141f0 57 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20 20  W_SIZE).        
14200 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  || (pFunc->zName
14210 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 29  ==nth_valueName)
14220 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75  .        || (pFu
14230 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74  nc->zName==first
14240 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20  _valueName).    
14250 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a      || (pFunc->z
14260 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a  Name==leadName).
14270 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e          || (pFun
14280 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  c->zName==lagNam
14290 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
142a0 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b 0a      bCache = 1;.
142b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
142c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
142d0 20 69 66 28 20 62 43 61 63 68 65 20 7c 7c 20 70   if( bCache || p
142e0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  MWin->eStart!=TK
142f0 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 70 4d  _PRECEDING || pM
14300 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 46 4f  Win->eEnd!=TK_FO
14310 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20  LLOWING ){.     
14320 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
14330 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62  nt((pParse->pVdb
14340 65 2c 20 22 42 65 67 69 6e 20 52 6f 77 45 78 70  e, "Begin RowExp
14350 72 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20  rStep()"));.    
14360 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45    windowCodeRowE
14370 78 70 72 53 74 65 70 28 70 50 61 72 73 65 2c 20  xprStep(pParse, 
14380 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f  p, pWInfo, regGo
14390 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
143a0 0a 20 20 20 20 20 20 56 64 62 65 4d 6f 64 75 6c  .      VdbeModul
143b0 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65  eComment((pParse
143c0 2d 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 52 6f  ->pVdbe, "End Ro
143d0 77 45 78 70 72 53 74 65 70 28 29 22 29 29 3b 0a  wExprStep()"));.
143e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
143f0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
14400 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62  nt((pParse->pVdb
14410 65 2c 20 22 42 65 67 69 6e 20 77 69 6e 64 6f 77  e, "Begin window
14420 43 6f 64 65 53 74 65 70 28 29 22 29 29 3b 0a 20  CodeStep()"));. 
14430 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 53       windowCodeS
14440 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  tep(pParse, p, p
14450 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c  WInfo, regGosub,
14460 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20   addrGosub);.   
14470 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
14480 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56  ment((pParse->pV
14490 64 62 65 2c 20 22 45 6e 64 20 77 69 6e 64 6f 77  dbe, "End window
144a0 43 6f 64 65 53 74 65 70 28 29 22 29 29 3b 0a 20  CodeStep()"));. 
144b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
144c0 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
144d0 20 20 20 20 69 6e 74 20 62 43 61 63 68 65 20 3d      int bCache =
144e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
144f0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
14500 20 43 61 63 68 65 53 74 65 70 28 29 20 2a 2f 0a   CacheStep() */.
14510 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
14520 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
14530 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e  NT && pMWin->eEn
14540 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
14550 29 7b 0a 20 20 20 20 20 20 62 43 61 63 68 65 20  ){.      bCache 
14560 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
14570 20 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70        for(pWin=p
14580 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
14590 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
145a0 7b 0a 20 20 20 20 20 20 20 20 46 75 6e 63 44 65  {.        FuncDe
145b0 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
145c0 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20  >pFunc;.        
145d0 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63  if( (pFunc->func
145e0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
145f0 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29  UNC_WINDOW_SIZE)
14600 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46  .         || (pF
14610 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f  unc->zName==nth_
14620 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20  valueName).     
14630 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a      || (pFunc->z
14640 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75  Name==first_valu
14650 65 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  eName).         
14660 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  || (pFunc->zName
14670 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a 20 20 20 20  ==leadName).    
14680 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
14690 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a  zName==lagName).
146a0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
146b0 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b       bCache = 1;
146c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
146d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
146e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
146f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 63 61 6c  * Otherwise, cal
14700 6c 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61  l windowCodeDefa
14710 75 6c 74 53 74 65 70 28 29 2e 20 20 2a 2f 0a 20  ultStep().  */. 
14720 20 20 20 69 66 28 20 62 43 61 63 68 65 20 29 7b     if( bCache ){
14730 0a 20 20 20 20 20 20 56 64 62 65 4d 6f 64 75 6c  .      VdbeModul
14740 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65  eComment((pParse
14750 2d 3e 70 56 64 62 65 2c 20 22 42 65 67 69 6e 20  ->pVdbe, "Begin 
14760 43 61 63 68 65 53 74 65 70 28 29 22 29 29 3b 0a  CacheStep()"));.
14770 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
14780 43 61 63 68 65 53 74 65 70 28 70 50 61 72 73 65  CacheStep(pParse
14790 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
147a0 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
147b0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 4d 6f 64  );.      VdbeMod
147c0 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72  uleComment((pPar
147d0 73 65 2d 3e 70 56 64 62 65 2c 20 22 45 6e 64 20  se->pVdbe, "End 
147e0 43 61 63 68 65 53 74 65 70 28 29 22 29 29 3b 0a  CacheStep()"));.
147f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14800 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
14810 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62  nt((pParse->pVdb
14820 65 2c 20 22 42 65 67 69 6e 20 44 65 66 61 75 6c  e, "Begin Defaul
14830 74 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20  tStep()"));.    
14840 20 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61    windowCodeDefa
14850 75 6c 74 53 74 65 70 28 70 50 61 72 73 65 2c 20  ultStep(pParse, 
14860 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f  p, pWInfo, regGo
14870 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
14880 0a 20 20 20 20 20 20 56 64 62 65 4d 6f 64 75 6c  .      VdbeModul
14890 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65  eComment((pParse
148a0 2d 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 44 65  ->pVdbe, "End De
148b0 66 61 75 6c 74 53 74 65 70 28 29 22 29 29 3b 0a  faultStep()"));.
148c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
148d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
148e0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
148f0 0a                                               .