/ Hex Artifact Content
Login

Artifact 06257715857cb9c6fe51b5a6f9558701821d431b85313d27e1b96d1a81e1f8eb:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75 6d  on rank(). Assum
1b60: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
1b70: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
1b80: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
1b90: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
1ba0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1bb0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
1bc0: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
1bd0: 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46  c void rankStepF
1be0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1bf0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1c00: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1c10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1c20: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1c30: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1c40: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1c50: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1c60: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1c70: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1c80: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1c90: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1ca0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1cc0: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
1cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
1ce0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1cf0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
1d00: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
1d10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
1d20: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
1d30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1d40: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
1d50: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
1d60: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
1d70: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
1d80: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
1d90: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
1da0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1db0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1dc0: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e  int64(pCtx, p->n
1dd0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 6e  Value);.    p->n
1de0: 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Value = 0;.  }.}
1df0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1e00: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1e10: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1e20: 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28  on percent_rank(
1e30: 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a  ). Assumes that.
1e40: 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ** the window fr
1e50: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ame has been set
1e60: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e   to:.**.**   RAN
1e70: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
1e80: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
1e90: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
1ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1eb0: 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70 46  ercent_rankStepF
1ec0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ed0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1ee0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1ef0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1f00: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1f10: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55  allCount *p;.  U
1f20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f30: 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e  nArg); assert( n
1f40: 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 70 20 3d  Arg==1 );..  p =
1f50: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
1f60: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
1f70: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1f80: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1f90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fa0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
1fb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f   ){.      p->nTo
1fc0: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
1fd0: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1fe0: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
1ff0: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
2000: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
2010: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
2020: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
2030: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2040: 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74 5f 72  c void percent_r
2050: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
2060: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2070: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2080: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2090: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
20a0: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
20b0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
20c0: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
20d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
20e0: 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31   if( p->nTotal>1
20f0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
2100: 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d   r = (double)(p-
2110: 3e 6e 56 61 6c 75 65 2d 31 29 20 2f 20 28 64 6f  >nValue-1) / (do
2120: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2130: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2140: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2150: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2160: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2170: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2180: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2190: 20 7d 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65   }.    p->nValue
21a0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
21b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
21c0: 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69  n of built-in wi
21d0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75  ndow function cu
21e0: 6d 65 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d  me_dist(). Assum
21f0: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
2200: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
2210: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
2220: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
2230: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
2240: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2250: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
2260: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
2270: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2290: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
22a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22b0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
22c0: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70  uct CallCount *p
22d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
22e0: 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50 41  ==1 ); UNUSED_PA
22f0: 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 0a  RAMETER(nArg);..
2300: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2310: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2320: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2330: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2340: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2360: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  al==0 ){.      p
2370: 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74  ->nTotal = sqlit
2380: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2390: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  pArg[0]);.    }.
23a0: 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
23b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
23c0: 64 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65  d cume_distValue
23d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
23e0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
23f0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
2400: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
2410: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2420: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2430: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2440: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
2450: 70 20 26 26 20 70 2d 3e 6e 54 6f 74 61 6c 20 29  p && p->nTotal )
2460: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d  {.    double r =
2470: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74   (double)(p->nSt
2480: 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  ep) / (double)(p
2490: 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73  ->nTotal);.    s
24a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
24b0: 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20  uble(pCtx, r);. 
24c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
24d0: 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e  ext object for n
24e0: 74 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75  tile() window fu
24f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63  nction..*/.struc
2500: 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69  t NtileCtx {.  i
2510: 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20  64 nTotal;      
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2530: 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20  * Total rows in 
2540: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  partition */.  i
2550: 36 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20  64 nParam;      
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2570: 2a 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73  * Parameter pass
2580: 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a  ed to ntile(N) *
2590: 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20  /.  i64 iRow;   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
25c0: 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.};../*.** 
25d0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25e0: 66 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20  f ntile(). This 
25f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
2600: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
2610: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65  s.** been coerce
2620: 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  d to:.**.**   RO
2630: 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  WS UNBOUNDED PRE
2640: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2650: 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63  NT ROW.*/.static
2660: 20 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46   void ntileStepF
2670: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2680: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
2690: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
26a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
26b0: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e  rg.){.  struct N
26c0: 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73  tileCtx *p;.  as
26d0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
26e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26f0: 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  R(nArg);.  p = (
2700: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a  struct NtileCtx*
2710: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2720: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2730: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2740: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
2750: 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b   p->nTotal==0 ){
2760: 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d  .      p->nParam
2770: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2780: 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29  _int64(apArg[0])
2790: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61  ;.      p->nTota
27a0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
27b0: 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d  e_int64(apArg[1]
27c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
27d0: 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20  nParam<=0 ){.   
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
27f0: 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20  ult_error(.     
2800: 20 20 20 20 20 20 20 70 43 74 78 2c 20 22 61 72         pCtx, "ar
2810: 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20  gument of ntile 
2820: 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69  must be a positi
2830: 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a  ve integer", -1.
2840: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2850: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2860: 69 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  iRow++;.  }.}.st
2870: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 56  atic void ntileV
2880: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2890: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
28a0: 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43  .  struct NtileC
28b0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
28c0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
28d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2900: 28 20 70 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d  ( p && p->nParam
2910: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  >0 ){.    int nS
2920: 69 7a 65 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c  ize = (p->nTotal
2930: 20 2f 20 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20   / p->nParam);. 
2940: 20 20 20 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20     if( nSize==0 
2950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2960: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
2970: 74 78 2c 20 70 2d 3e 69 52 6f 77 29 3b 0a 20 20  tx, p->iRow);.  
2980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2990: 36 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e  64 nLarge = p->n
29a0: 54 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61  Total - p->nPara
29b0: 6d 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  m*nSize;.      i
29c0: 36 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72  64 iSmall = nLar
29d0: 67 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20  ge*(nSize+1);.  
29e0: 20 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70      i64 iRow = p
29f0: 2d 3e 69 52 6f 77 2d 31 3b 0a 0a 20 20 20 20 20  ->iRow-1;..     
2a00: 20 61 73 73 65 72 74 28 20 28 6e 4c 61 72 67 65   assert( (nLarge
2a10: 2a 28 6e 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d  *(nSize+1) + (p-
2a20: 3e 6e 50 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a  >nParam-nLarge)*
2a30: 6e 53 69 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61  nSize)==p->nTota
2a40: 6c 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  l );..      if( 
2a50: 69 52 6f 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20  iRow<iSmall ){. 
2a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2a70: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2a80: 2c 20 31 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a  , 1 + iRow/(nSiz
2a90: 65 2b 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e+1));.      }el
2aa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ab0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2ac0: 28 70 43 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67  (pCtx, 1 + nLarg
2ad0: 65 20 2b 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c  e + (iRow-iSmall
2ae0: 29 2f 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  )/nSize);.      
2af0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2b00: 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a  *.** Context obj
2b10: 65 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c  ect for last_val
2b20: 75 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63  ue() window func
2b30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tion..*/.struct 
2b40: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20  LastValueCtx {. 
2b50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b60: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  pVal;.  int nVal
2b70: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.};../*.** Impl
2b80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61  ementation of la
2b90: 73 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73  st_value()..*/.s
2ba0: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f  tatic void last_
2bb0: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20  valueStepFunc(. 
2bc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2bd0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2be0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2bf0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2c00: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
2c10: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
2c20: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
2c30: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2c40: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
2c50: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2c60: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
2c70: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2c80: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
2c90: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
2ca0: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e  ->pVal);.    p->
2cb0: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVal = sqlite3_v
2cc0: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2cd0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ]);.    if( p->p
2ce0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2cf0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2d00: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d20: 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20     p->nVal++;.  
2d30: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2d40: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2d50: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
2d60: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2d70: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2d80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d90: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2da0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2db0: 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  *p;.  UNUSED_PAR
2dc0: 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20  AMETER(nArg);.  
2dd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2de0: 28 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  (apArg);.  p = (
2df0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2e00: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
2e10: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2e20: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
2e30: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
2e40: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c  ) ){.    p->nVal
2e50: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
2e60: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
2e80: 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  ee(p->pVal);.   
2e90: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a     p->pVal = 0;.
2ea0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
2eb0: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2ec0: 75 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  ueValueFunc(sqli
2ed0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2ee0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
2ef0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
2f00: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
2f10: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
2f20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2f30: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2f40: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2f50: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
2f60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f70: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
2f80: 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  Val);.  }.}.stat
2f90: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2fa0: 75 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73  ueFinalizeFunc(s
2fb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2fc0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
2fd0: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b  LastValueCtx *p;
2fe0: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c  .  p = (struct L
2ff0: 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c  astValueCtx*)sql
3000: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3010: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
3020: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
3030: 70 20 26 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a  p && p->pVal ){.
3040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3050: 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 70  lt_value(pCtx, p
3060: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ->pVal);.    sql
3070: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
3080: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
3090: 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d  >pVal = 0;.  }.}
30a0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e  ../*.** Static n
30b0: 61 6d 65 73 20 66 6f 72 20 74 68 65 20 62 75 69  ames for the bui
30c0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
30d0: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
30e0: 65 73 65 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61  ese static.** na
30f0: 6d 65 73 20 61 72 65 20 75 73 65 64 2c 20 72 61  mes are used, ra
3100: 74 68 65 72 20 74 68 61 6e 20 73 74 72 69 6e 67  ther than string
3110: 20 6c 69 74 65 72 61 6c 73 2c 20 73 6f 20 74 68   literals, so th
3120: 61 74 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63  at FuncDef objec
3130: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 61 73 73  ts.** can be ass
3140: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
3150: 61 72 74 69 63 75 6c 61 72 20 77 69 6e 64 6f 77  articular window
3160: 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 64 69 72   function by dir
3170: 65 63 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ect.** compariso
3180: 6e 20 6f 66 20 74 68 65 20 7a 4e 61 6d 65 20 70  n of the zName p
3190: 6f 69 6e 74 65 72 2e 20 20 45 78 61 6d 70 6c 65  ointer.  Example
31a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66  :.**.**       if
31b0: 28 20 70 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d  ( pFuncDef->zNam
31c0: 65 3d 3d 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65  e==row_valueName
31d0: 20 29 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61   ){ ... }.*/.sta
31e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
31f0: 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20  ow_numberName[] 
3200: 3d 20 20 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22  =   "row_number"
3210: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ;.static const c
3220: 68 61 72 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61  har dense_rankNa
3230: 6d 65 5b 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f  me[] =   "dense_
3240: 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f  rank";.static co
3250: 6e 73 74 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d  nst char rankNam
3260: 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 72  e[] =         "r
3270: 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ank";.static con
3280: 73 74 20 63 68 61 72 20 70 65 72 63 65 6e 74 5f  st char percent_
3290: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65  rankName[] = "pe
32a0: 72 63 65 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61  rcent_rank";.sta
32b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 63  tic const char c
32c0: 75 6d 65 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d  ume_distName[] =
32d0: 20 20 20 20 22 63 75 6d 65 5f 64 69 73 74 22 3b      "cume_dist";
32e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
32f0: 61 72 20 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d  ar ntileName[] =
3300: 20 20 20 20 20 20 20 20 22 6e 74 69 6c 65 22 3b          "ntile";
3310: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3320: 61 72 20 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d  ar last_valueNam
3330: 65 5b 5d 20 3d 20 20 20 22 6c 61 73 74 5f 76 61  e[] =   "last_va
3340: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3350: 73 74 20 63 68 61 72 20 6e 74 68 5f 76 61 6c 75  st char nth_valu
3360: 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74  eName[] =    "nt
3370: 68 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  h_value";.static
3380: 20 63 6f 6e 73 74 20 63 68 61 72 20 66 69 72 73   const char firs
3390: 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  t_valueName[] = 
33a0: 20 22 66 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a   "first_value";.
33b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
33c0: 72 20 6c 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20  r leadName[] =  
33d0: 20 20 20 20 20 20 20 22 6c 65 61 64 22 3b 0a 73         "lead";.s
33e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
33f0: 20 6c 61 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20   lagName[] =    
3400: 20 20 20 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a        "lag";../*
3410: 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d  .** No-op implem
3420: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 78 53 74  entations of xSt
3430: 65 70 28 29 20 61 6e 64 20 78 46 69 6e 61 6c 69  ep() and xFinali
3440: 7a 65 28 29 2e 20 20 55 73 65 64 20 61 73 20 70  ze().  Used as p
3450: 6c 61 63 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20  lace-holders.** 
3460: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
3470: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3480: 61 74 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  at never call th
3490: 6f 73 65 20 69 6e 74 65 72 66 61 63 65 73 2e 0a  ose interfaces..
34a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61  **.** The noopVa
34b0: 6c 75 65 46 75 6e 63 28 29 20 69 73 20 63 61 6c  lueFunc() is cal
34c0: 6c 65 64 20 62 75 74 20 69 73 20 65 78 70 65 63  led but is expec
34d0: 74 65 64 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e  ted to do nothin
34e0: 67 2e 20 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53  g.  The.** noopS
34f0: 74 65 70 46 75 6e 63 28 29 20 69 73 20 6e 65 76  tepFunc() is nev
3500: 65 72 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  er called, and s
3510: 6f 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 77  o it is marked w
3520: 69 74 68 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a  ith NO_TEST to.*
3530: 2a 20 6c 65 74 20 74 68 65 20 74 65 73 74 20 63  * let the test c
3540: 6f 76 65 72 61 67 65 20 72 6f 75 74 69 6e 65 20  overage routine 
3550: 6b 6e 6f 77 20 6e 6f 74 20 74 6f 20 65 78 70 65  know not to expe
3560: 63 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ct this function
3570: 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65   to be.** invoke
3580: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3590: 64 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 20  d noopStepFunc( 
35a0: 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
35b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
35c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f   *p,        /*NO
35d0: 5f 54 45 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c  _TEST*/.  int n,
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
3600: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3610: 20 2a 2a 61 20 20 20 20 20 20 20 20 20 20 2f 2a   **a          /*
3620: 4e 4f 5f 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20  NO_TEST*/.){    
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
3650: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
3660: 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
3670: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e  /*NO_TEST*/.  UN
3680: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
3690: 29 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  );       /*NO_TE
36a0: 53 54 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  ST*/.  UNUSED_PA
36b0: 52 41 4d 45 54 45 52 28 61 29 3b 20 20 20 20 20  RAMETER(a);     
36c0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
36d0: 61 73 73 65 72 74 28 30 29 3b 20 20 20 20 20 20  assert(0);      
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
36f0: 54 45 53 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20  TEST*/.}        
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
3720: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70  static void noop
3730: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
3740: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55  3_context *p){ U
3750: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3760: 70 29 3b 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a  p); /*no-op*/ }.
3770: 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74  ./* Window funct
3780: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c  ions that use al
3790: 6c 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61  l window interfa
37a0: 63 65 73 3a 20 78 53 74 65 70 2c 20 78 46 69 6e  ces: xStep, xFin
37b0: 61 6c 2c 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61  al,.** xValue, a
37c0: 6e 64 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23  nd xInverse */.#
37d0: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e  define WINDOWFUN
37e0: 43 41 4c 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  CALL(name,nArg,e
37f0: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41            \.  nA
3820: 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38  rg, (SQLITE_UTF8
3830: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e  |SQLITE_FUNC_WIN
3840: 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30  DOW|extra), 0, 0
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3860: 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20         \.  name 
3870: 23 23 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d  ## StepFunc, nam
3880: 65 20 23 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e  e ## FinalizeFun
3890: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
38a0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
38b0: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
38c0: 49 6e 76 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  InvFunc, name ##
38d0: 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20   Name, {0}      
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20   \.}../* Window 
3910: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
3920: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  re implemented u
3930: 73 69 6e 67 20 62 79 74 65 63 6f 64 65 20 61 6e  sing bytecode an
3940: 64 20 74 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e  d thus have.** n
3950: 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 73 20 66 6f  o-op routines fo
3960: 72 20 74 68 65 69 72 20 6d 65 74 68 6f 64 73 20  r their methods 
3970: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  */.#define WINDO
3980: 57 46 55 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e  WFUNCNOOP(name,n
3990: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
39c0: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
39d0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
39e0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
39f0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
3a00: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3a10: 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f  oopStepFunc, noo
3a20: 70 56 61 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70  pValueFunc, noop
3a30: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
3a60: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
3a70: 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20  # Name, {0}     
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e       \.}../* Win
3ab0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ac0: 61 74 20 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f  at use all windo
3ad0: 77 20 69 6e 74 65 72 66 61 63 65 73 3a 20 78 53  w interfaces: xS
3ae0: 74 65 70 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65  tep, the.** same
3af0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 78 46 69   routine for xFi
3b00: 6e 61 6c 69 7a 65 20 61 6e 64 20 78 56 61 6c 75  nalize and xValu
3b10: 65 20 61 6e 64 20 77 68 69 63 68 20 6e 65 76 65  e and which neve
3b20: 72 20 63 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72  r call.** xInver
3b30: 73 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se. */.#define W
3b40: 49 4e 44 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c  INDOWFUNCX(name,
3b50: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
3b90: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
3ba0: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3bb0: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3bd0: 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46  .  name ## StepF
3be0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
3bf0: 75 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  ueFunc, name ## 
3c00: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3c20: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 61  noopStepFunc, na
3c30: 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20  me ## Name, {0} 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f           \.}.../
3c70: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
3c80: 6f 73 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ose built-in win
3c90: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ca0: 61 74 20 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20  at are not also 
3cb0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76  aggregates..*/.v
3cc0: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
3cd0: 77 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  wFunctions(void)
3ce0: 7b 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63 44  {.  static FuncD
3cf0: 65 66 20 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b  ef aWindowFuncs[
3d00: 5d 20 3d 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57  ] = {.    WINDOW
3d10: 46 55 4e 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72  FUNCX(row_number
3d20: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d30: 44 4f 57 46 55 4e 43 58 28 64 65 6e 73 65 5f 72  DOWFUNCX(dense_r
3d40: 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20  ank, 0, 0),.    
3d50: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b  WINDOWFUNCX(rank
3d60: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d70: 44 4f 57 46 55 4e 43 58 28 70 65 72 63 65 6e 74  DOWFUNCX(percent
3d80: 5f 72 61 6e 6b 2c 20 30 2c 20 53 51 4c 49 54 45  _rank, 0, SQLITE
3d90: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
3da0: 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  E),.    WINDOWFU
3db0: 4e 43 58 28 63 75 6d 65 5f 64 69 73 74 2c 20 30  NCX(cume_dist, 0
3dc0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  , SQLITE_FUNC_WI
3dd0: 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20  NDOW_SIZE),.    
3de0: 57 49 4e 44 4f 57 46 55 4e 43 58 28 6e 74 69 6c  WINDOWFUNCX(ntil
3df0: 65 2c 20 31 2c 20 53 51 4c 49 54 45 5f 46 55 4e  e, 1, SQLITE_FUN
3e00: 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a  C_WINDOW_SIZE),.
3e10: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c      WINDOWFUNCAL
3e20: 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31 2c  L(last_value, 1,
3e30: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
3e40: 55 4e 43 4e 4f 4f 50 28 6e 74 68 5f 76 61 6c 75  UNCNOOP(nth_valu
3e50: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
3e60: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 66 69 72  NDOWFUNCNOOP(fir
3e70: 73 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c  st_value, 1, 0),
3e80: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3e90: 4f 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c  OOP(lead, 1, 0),
3ea0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3eb0: 4f 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c  OOP(lead, 2, 0),
3ec0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ed0: 4f 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c  OOP(lead, 3, 0),
3ee0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ef0: 4f 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a  OOP(lag, 1, 0),.
3f00: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
3f10: 4f 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20  OP(lag, 2, 0),. 
3f20: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
3f30: 50 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20  P(lag, 3, 0),.  
3f40: 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65  };.  sqlite3Inse
3f50: 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61  rtBuiltinFuncs(a
3f60: 57 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72  WindowFuncs, Arr
3f70: 61 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75  aySize(aWindowFu
3f80: 6e 63 73 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ncs));.}..static
3f90: 20 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46   Window *windowF
3fa0: 69 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  ind(Parse *pPars
3fb0: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74  e, Window *pList
3fc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3fd0: 61 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ame){.  Window *
3fe0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  p;.  for(p=pList
3ff0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57  ; p; p=p->pNextW
4000: 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  in){.    if( sql
4010: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a  ite3StrICmp(p->z
4020: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
4030: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
4040: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
4050: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4060: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
4070: 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61  window: %s", zNa
4080: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4090: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n p;.}../*.** Th
40a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
40b0: 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  alled immediatel
40c0: 79 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e  y after resolvin
40d0: 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  g the function n
40e0: 61 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e  ame.** for a win
40f0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  dow function wit
4100: 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hin a SELECT sta
4110: 74 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74  tement. Argument
4120: 20 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c   pList is a.** l
4130: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49  inked list of WI
4140: 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73  NDOW definitions
4150: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
4160: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4170: 74 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  t..** Argument p
4180: 46 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63  Func is the func
4190: 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
41a0: 6a 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e  just resolved an
41b0: 64 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65  d pWin.** is the
41c0: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72   Window object r
41d0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
41e0: 61 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20  associated OVER 
41f0: 63 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20  clause. This.** 
4200: 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
4210: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4220: 20 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73   pWin as follows
4230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
4240: 68 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72  he OVER clause r
4250: 65 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65  efered to a name
4260: 64 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20  d window (as in 
4270: 22 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e  "max(x) OVER win
4280: 22 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63  "),.**     searc
4290: 68 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72  h list pList for
42a0: 20 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44   a matching WIND
42b0: 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61  OW definition, a
42c0: 6e 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a  nd update pWin.*
42d0: 2a 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c  *     accordingl
42e0: 79 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49  y. If no such WI
42f0: 4e 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20  NDOW clause can 
4300: 62 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20  be found, leave 
4310: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20  an error.**     
4320: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  in pParse..**.**
4330: 20 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63     * If the func
4340: 74 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d  tion is a built-
4350: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
4360: 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73  on that requires
4370: 20 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64   the.**     wind
4380: 6f 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64  ow to be coerced
4390: 20 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20   (see "BUILT-IN 
43a0: 57 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53  WINDOW FUNCTIONS
43b0: 22 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20  " at the top.** 
43c0: 20 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65      of this file
43d0: 29 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74  ), pWin is updat
43e0: 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ed here..*/.void
43f0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70   sqlite3WindowUp
4400: 64 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  date(.  Parse *p
4410: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
4420: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
4430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
4440: 74 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f  t of named windo
4450: 77 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ws for this SELE
4460: 43 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a  CT */.  Window *
4470: 70 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  pWin,           
4480: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f          /* Windo
4490: 77 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74  w frame to updat
44a0: 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a  e */.  FuncDef *
44b0: 70 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20  pFunc           
44c0: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
44d0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
44e0: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tion */.){.  if(
44f0: 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20   pWin->zName && 
4500: 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 30 20 29  pWin->eType==0 )
4510: 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 20  {.    Window *p 
4520: 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70 50 61  = windowFind(pPa
4530: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e  rse, pList, pWin
4540: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
4550: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
4560: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
4570: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
4580: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
4590: 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  e->db, p->pParti
45a0: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57  tion, 0);.    pW
45b0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
45c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
45d0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  p(pParse->db, p-
45e0: 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  >pOrderBy, 0);. 
45f0: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4600: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4610: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
4620: 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  pStart, 0);.    
4630: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
4640: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
4650: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c  se->db, p->pEnd,
4660: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65   0);.    pWin->e
4670: 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
4680: 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e  t;.    pWin->eEn
4690: 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
46a0: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70   pWin->eType = p
46b0: 2d 3e 65 54 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ->eType;.  }else
46c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  {.    sqlite3Win
46d0: 64 6f 77 43 68 61 69 6e 28 70 50 61 72 73 65 2c  dowChain(pParse,
46e0: 20 70 57 69 6e 2c 20 70 4c 69 73 74 29 3b 0a 20   pWin, pList);. 
46f0: 20 7d 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e   }.  if( pFunc->
4700: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
4710: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29  TE_FUNC_WINDOW )
4720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
4730: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4740: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
4750: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  ilter ){.      s
4760: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4770: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
4780: 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65    "FILTER clause
4790: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
47a0: 64 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  d with aggregate
47b0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
47c0: 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  s".      );.    
47d0: 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 46  }else.    if( pF
47e0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77 5f  unc->zName==row_
47f0: 6e 75 6d 62 65 72 4e 61 6d 65 20 7c 7c 20 70 46  numberName || pF
4800: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 69 6c  unc->zName==ntil
4810: 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  eName ){.      s
4820: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4830: 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72  (db, pWin->pStar
4840: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4850: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4860: 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  pWin->pEnd);.   
4870: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4880: 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30  = pWin->pEnd = 0
4890: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54  ;.      pWin->eT
48a0: 79 70 65 20 3d 20 54 4b 5f 52 4f 57 53 3b 0a 20  ype = TK_ROWS;. 
48b0: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
48c0: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
48d0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
48e0: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
48f0: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
4900: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
4910: 3d 3d 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65  ==dense_rankName
4920: 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65   || pFunc->zName
4930: 3d 3d 72 61 6e 6b 4e 61 6d 65 0a 20 20 20 20 20  ==rankName.     
4940: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
4950: 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d  =percent_rankNam
4960: 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d  e || pFunc->zNam
4970: 65 3d 3d 63 75 6d 65 5f 64 69 73 74 4e 61 6d 65  e==cume_distName
4980: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
4990: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
49a0: 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72 74  db, pWin->pStart
49b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
49c0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
49d0: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
49e0: 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d    pWin->pStart =
49f0: 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b   pWin->pEnd = 0;
4a00: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54 79  .      pWin->eTy
4a10: 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45 3b 0a 20  pe = TK_RANGE;. 
4a20: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
4a30: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
4a40: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
4a50: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
4a60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 69  .    }.  }.  pWi
4a70: 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  n->pFunc = pFunc
4a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
4a90: 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  xt object passed
4aa0: 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74 65 33   through sqlite3
4ab0: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29 20 74  WalkExprList() t
4ac0: 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e 64 6f  o.** selectWindo
4ad0: 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28 29  wRewriteExprCb()
4ae0: 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77   by selectWindow
4af0: 52 65 77 72 69 74 65 45 4c 69 73 74 28 29 2e 0a  RewriteEList()..
4b00: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
4b10: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
4b20: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b 0a 73  WindowRewrite;.s
4b30: 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72  truct WindowRewr
4b40: 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ite {.  Window *
4b50: 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73 74 20  pWin;.  SrcList 
4b60: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
4b70: 74 20 2a 70 53 75 62 3b 0a 20 20 53 65 6c 65 63  t *pSub;.  Selec
4b80: 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b 20 20  t *pSubSelect;  
4b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4ba0: 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65 63 74  rrent sub-select
4bb0: 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b 0a 0a  , if any */.};..
4bc0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66  /*.** Callback f
4bd0: 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20  unction used by 
4be0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
4bf0: 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66 20 6e  iteEList(). If n
4c00: 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74 68 69  ecessary,.** thi
4c10: 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
4c20: 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ds to the output
4c30: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
4c40: 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a 2a 2a   and updates .**
4c50: 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a 70 70   expression (*pp
4c60: 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65 2e 0a  Expr) in place..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
4c80: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
4c90: 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
4ca0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
4cb0: 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74 20  Expr){.  struct 
4cc0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a 70  WindowRewrite *p
4cd0: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52   = pWalker->u.pR
4ce0: 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65 20  ewrite;.  Parse 
4cf0: 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
4d00: 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a  r->pParse;..  /*
4d10: 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
4d20: 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
4d30: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  d from within a 
4d40: 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63  scalar sub-selec
4d50: 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73 65 64  t.  ** that used
4d60: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
4d70: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
4d80: 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79 20 70  rocessed, only p
4d90: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b 5f 43  rocess.  ** TK_C
4da0: 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
4db0: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
4dc0: 69 74 20 28 74 68 65 20 6f 75 74 65 72 20 53 45  it (the outer SE
4dd0: 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a 20 6e  LECT). Do.  ** n
4de0: 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67 72 65  ot process aggre
4df0: 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f 77 20  gates or window 
4e00: 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  functions at all
4e10: 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f 6e 67  , as they belong
4e20: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 63 61  .  ** to the sca
4e30: 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  lar sub-select. 
4e40: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 75   */.  if( p->pSu
4e50: 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 69  bSelect ){.    i
4e60: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
4e70: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
4e80: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
4e90: 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  inue;.    }else{
4ea0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72 63 20  .      int nSrc 
4eb0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  = p->pSrc->nSrc;
4ec0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
4ed0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
4ee0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
4ef0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
4f00: 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d 3e 61  able==p->pSrc->a
4f10: 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
4f20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4f30: 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63 20 29     if( i==nSrc )
4f40: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
4f50: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  inue;.    }.  }.
4f60: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
4f70: 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63 61 73  ->op ){..    cas
4f80: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
4f90: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
4fa0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
4fb0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
4fc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4fd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4fe0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
4ff0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 57  ;.        for(pW
5000: 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e  in=p->pWin; pWin
5010: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
5020: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20  xtWin){.        
5030: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79 2e 70    if( pExpr->y.p
5040: 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20 20  Win==pWin ){.   
5050: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
5060: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70   pWin->pOwner==p
5070: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
5080: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
5090: 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rune;.          
50a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
50b0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
50c0: 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a  l through.  */..
50d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
50e0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
50f0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
5100: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
5110: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5120: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
5130: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  xpr, 0);.      p
5140: 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  ->pSub = sqlite3
5150: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
5160: 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62 2c 20  Parse, p->pSub, 
5170: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
5180: 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20 20 20   p->pSub ){.    
5190: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
51a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
51b0: 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d 3d 30  r, EP_Static)==0
51c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
51d0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
51e0: 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20  r, EP_Static);. 
51f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5200: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
5210: 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  >db, pExpr);.   
5220: 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72       ExprClearPr
5230: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5240: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
5250: 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72 2c 20    memset(pExpr, 
5260: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
5270: 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ;..        pExpr
5280: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
5290: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
52a0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53  >iColumn = p->pS
52b0: 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20  ub->nExpr-1;.   
52c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
52d0: 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69 45  le = p->pWin->iE
52e0: 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d 0a 0a  phCsr;.      }..
52f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5300: 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
5310: 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
5320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5330: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
5340: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
5350: 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52  nt selectWindowR
5360: 65 77 72 69 74 65 53 65 6c 65 63 74 43 62 28 57  ewriteSelectCb(W
5370: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
5380: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
5390: 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f  {.  struct Windo
53a0: 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20 70 57  wRewrite *p = pW
53b0: 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72 69 74  alker->u.pRewrit
53c0: 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 61  e;.  Select *pSa
53d0: 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65 6c 65  ve = p->pSubSele
53e0: 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76 65 3d  ct;.  if( pSave=
53f0: 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  =pSelect ){.    
5400: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
5410: 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nue;.  }else{.  
5420: 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20    p->pSubSelect 
5430: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 73  = pSelect;.    s
5440: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
5450: 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63  (pWalker, pSelec
5460: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75 62 53  t);.    p->pSubS
5470: 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b 0a 20  elect = pSave;. 
5480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
5490: 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Prune;.}.../*.**
54a0: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
54b0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
54c0: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c   in expression-l
54d0: 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f 72 20  ist pEList. For 
54e0: 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  each:.**.**   * 
54f0: 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20 20  TK_COLUMN,.**   
5500: 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
5510: 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  tion, or.**   * 
5520: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
5530: 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20 6f 62  with a Window ob
5540: 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e 6f 74  ject that is not
5550: 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65   a member of the
5560: 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f 77 20   .**     Window 
5570: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
5580: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
5590: 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a 2a 2a  nt (pWin)..**.**
55a0: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65   Append the node
55b0: 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70 72 65   to output expre
55c0: 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70 70 53  ssion-list (*ppS
55d0: 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61 63 65  ub). And replace
55e0: 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20 54 4b   it.** with a TK
55f0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 61  _COLUMN that rea
5600: 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68 20 65  ds the (N-1)th e
5610: 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c 65 20  lement of table 
5620: 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68 43 73  .** pWin->iEphCs
5630: 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  r, where N is th
5640: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
5650: 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75 62 29  ents in (*ppSub)
5660: 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65 6e 64   after.** append
5670: 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e  ing the new one.
5680: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5690: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
56a0: 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72 73  iteEList(.  Pars
56b0: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69  e *pParse, .  Wi
56c0: 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 53 72  ndow *pWin,.  Sr
56d0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20 20 45  cList *pSrc,.  E
56e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5700: 2a 20 52 65 77 72 69 74 65 20 65 78 70 72 65 73  * Rewrite expres
5710: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c 69  sions in this li
5720: 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  st */.  ExprList
5730: 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20 20   **ppSub        
5740: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
5750: 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65 78  T: Sub-select ex
5760: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f  pression-list */
5770: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  .){.  Walker sWa
5780: 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65  lker;.  WindowRe
5790: 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b 0a  write sRewrite;.
57a0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
57b0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61  er, 0, sizeof(Wa
57c0: 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  lker));.  memset
57d0: 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73  (&sRewrite, 0, s
57e0: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72  izeof(WindowRewr
57f0: 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69  ite));..  sRewri
5800: 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62  te.pSub = *ppSub
5810: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69  ;.  sRewrite.pWi
5820: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52 65 77  n = pWin;.  sRew
5830: 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53 72 63  rite.pSrc = pSrc
5840: 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  ;..  sWalker.pPa
5850: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
5860: 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c  sWalker.xExprCal
5870: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69  lback = selectWi
5880: 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43  ndowRewriteExprC
5890: 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53 65  b;.  sWalker.xSe
58a0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
58b0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
58c0: 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73 57  teSelectCb;.  sW
58d0: 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74 65  alker.u.pRewrite
58e0: 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a 20   = &sRewrite;.. 
58f0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61   (void)sqlite3Wa
5900: 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61 6c  lkExprList(&sWal
5910: 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a 20  ker, pEList);.. 
5920: 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72 69   *ppSub = sRewri
5930: 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  te.pSub;.}../*.*
5940: 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70 79 20  * Append a copy 
5950: 6f 66 20 65 61 63 68 20 65 78 70 72 65 73 73 69  of each expressi
5960: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
5970: 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20 74 6f  -list pAppend to
5980: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
5990: 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74 75 72  ist pList. Retur
59a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
59b0: 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  he result list..
59c0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 4c 69  */.static ExprLi
59d0: 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70 70 65  st *exprListAppe
59e0: 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  ndList(.  Parse 
59f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5a00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
5a10: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
5a20: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
5a30: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
5a40: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
5a50: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
5a60: 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70 70 65   ExprList *pAppe
5a70: 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  nd       /* List
5a80: 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61 70   of values to ap
5a90: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
5aa0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
5ab0: 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20 69  pAppend ){.    i
5ac0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 49  nt i;.    int nI
5ad0: 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  nit = pList ? pL
5ae0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
5af0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5b00: 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b 20 69  Append->nExpr; i
5b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
5b20: 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45  *pDup = sqlite3E
5b30: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5b40: 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69 5d  b, pAppend->a[i]
5b50: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
5b60: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5b70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5b80: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
5b90: 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Dup);.      if( 
5ba0: 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e 61  pList ) pList->a
5bb0: 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f 72  [nInit+i].sortOr
5bc0: 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e 61  der = pAppend->a
5bd0: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
5be0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5bf0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
5c00: 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
5c10: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5c20: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
5c30: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
5c40: 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20 53   invoke.** any S
5c50: 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  QL window functi
5c60: 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ons, this functi
5c70: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
5c80: 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a 2a  therwise, it .**
5c90: 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53 45   rewrites the SE
5ca0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 73  LECT statement s
5cb0: 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66 75  o that window fu
5cc0: 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75 6e  nction xStep fun
5cd0: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69 6e  ctions.** are in
5ce0: 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f 72  voked in the cor
5cf0: 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64 65  rect order as de
5d00: 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22 53  scribed under "S
5d10: 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47 22  ELECT REWRITING"
5d20: 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20 6f  .** at the top o
5d30: 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a  f this file..*/.
5d40: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  int sqlite3Windo
5d50: 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20 2a  wRewrite(Parse *
5d60: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
5d70: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
5d80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5d90: 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e 70 50  p->pWin && p->pP
5da0: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 56  rior==0 ){.    V
5db0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
5dc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
5dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
5de0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5df0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
5e00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5e10: 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
5e20: 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
5e30: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
5e40: 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72  .    Expr *pWher
5e50: 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
5e60: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72     ExprList *pGr
5e70: 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
5e80: 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pBy;.    Expr *p
5e90: 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
5ea0: 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ing;.    ExprLis
5eb0: 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a 20  t *pSort = 0;.. 
5ec0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75     ExprList *pSu
5ed0: 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  blist = 0;      
5ee0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c   /* Expression l
5ef0: 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65 72  ist for sub-quer
5f00: 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20  y */.    Window 
5f10: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
5f20: 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72  ;      /* Master
5f30: 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 2a   window object *
5f40: 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57  /.    Window *pW
5f50: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
5f60: 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f 62      /* Window ob
5f70: 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  ject iterator */
5f80: 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ..    p->pSrc = 
5f90: 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  0;.    p->pWhere
5fa0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72   = 0;.    p->pGr
5fb0: 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  oupBy = 0;.    p
5fc0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 0a  ->pHaving = 0;..
5fd0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
5fe0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
5ff0: 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d 73 65  e for the sub-se
6000: 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 74 68  lect. This is th
6010: 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a  e concatenation.
6020: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 77 69      ** of the wi
6030: 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e 20 61  ndow PARTITION a
6040: 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  nd ORDER BY clau
6050: 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20 74 68  ses. Then, if th
6060: 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20 20 20  is makes it.    
6070: 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20 72 65  ** redundant, re
6080: 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20 42  move the ORDER B
6090: 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  Y from the paren
60a0: 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a 20 20  t SELECT.  */.  
60b0: 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69 74 65    pSort = sqlite
60c0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
60d0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
60e0: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53 6f 72  on, 0);.    pSor
60f0: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
6100: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
6110: 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72  Sort, pMWin->pOr
6120: 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
6130: 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f 72 64  pSort && p->pOrd
6140: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
6150: 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
6160: 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 2c 20  tCompare(pSort, 
6170: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  p->pOrderBy, -1)
6180: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
6190: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
61a0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
61b0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70  erBy);.        p
61c0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
61d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
61e0: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 63     /* Assign a c
61f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
6200: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
6210: 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75 66  able used to buf
6220: 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a  fer rows..    **
6230: 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   The OpenEphemer
6240: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  al instruction i
6250: 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20 61  s coded later, a
6260: 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e  fter it is known
6270: 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   how.    ** many
6280: 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61 62   columns the tab
6290: 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a  le will have.  *
62a0: 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70  /.    pMWin->iEp
62b0: 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  hCsr = pParse->n
62c0: 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73  Tab++;.    pPars
62d0: 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 0a 20  e->nTab += 3;.. 
62e0: 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52     selectWindowR
62f0: 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72  ewriteEList(pPar
6300: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c  se, pMWin, pSrc,
6310: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 53 75   p->pEList, &pSu
6320: 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65 6c 65  blist);.    sele
6330: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
6340: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57  List(pParse, pMW
6350: 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 4f 72  in, pSrc, p->pOr
6360: 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74  derBy, &pSublist
6370: 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42  );.    pMWin->nB
6380: 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62  ufferCol = (pSub
6390: 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d  list ? pSublist-
63a0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20  >nExpr : 0);..  
63b0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
63c0: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e 64  PARTITION BY and
63d0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
63e0: 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74 6f 20  sions to the to 
63f0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
6400: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
6410: 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72 65  n list. They are
6420: 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 67   required to fig
6430: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 0a 20  ure out where . 
6440: 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69 65 73     ** boundaries
6450: 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20   for partitions 
6460: 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65 72  and sets of peer
6470: 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f 0a 20   rows lie.  */. 
6480: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78     pSublist = ex
6490: 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74  prListAppendList
64a0: 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73  (pParse, pSublis
64b0: 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  t, pMWin->pParti
64c0: 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75 62 6c  tion);.    pSubl
64d0: 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ist = exprListAp
64e0: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
64f0: 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e   pSublist, pMWin
6500: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  ->pOrderBy);..  
6510: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
6520: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
6530: 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20   to each window 
6540: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a  function to the.
6550: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
6560: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
6570: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
6580: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66   two registers f
6590: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77  or each.    ** w
65a0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d  indow function -
65b0: 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63   one for the acc
65c0: 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65  umulator, anothe
65d0: 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20  r for interim.  
65e0: 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a    ** results.  *
65f0: 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70  /.    for(pWin=p
6600: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
6610: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
6620: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41  {.      pWin->iA
6630: 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73  rgCol = (pSublis
6640: 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45  t ? pSublist->nE
6650: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
6660: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
6670: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
6680: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
6690: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
66a0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
66b0: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
66c0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
66d0: 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  *pFilter = sqlit
66e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
66f0: 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b  in->pFilter, 0);
6700: 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c 69 73  .        pSublis
6710: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
6720: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
6730: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69 6c  , pSublist, pFil
6740: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
6750: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63      pWin->regAcc
6760: 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  um = ++pParse->n
6770: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Mem;.      pWin-
6780: 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70  >regResult = ++p
6790: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
67a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
67b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
67c0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
67d0: 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  um);.    }..    
67e0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
67f0: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 50 41  o ORDER BY or PA
6800: 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61 75 73  RTITION BY claus
6810: 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e 64 6f  e, and the windo
6820: 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  w.    ** functio
6830: 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f 20 61  n accepts zero a
6840: 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68  rguments, and th
6850: 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72  ere are no other
6860: 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20   columns.    ** 
6870: 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e 20 22  selected (e.g. "
6880: 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65  SELECT row_numbe
6890: 72 28 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d  r() OVER () FROM
68a0: 20 74 31 22 29 2c 20 69 74 20 69 73 20 70 6f 73   t1"), it is pos
68b0: 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61  sible.    ** tha
68c0: 74 20 70 53 75 62 6c 69 73 74 20 69 73 20 73 74  t pSublist is st
68d0: 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e 20 41  ill NULL here. A
68e0: 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  dd a constant ex
68f0: 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20 74 6f  pression here to
6900: 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20 65 76   .    ** keep ev
6910: 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c 20 69  erything legal i
6920: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a 20 20  n this case. .  
6930: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
6940: 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  blist==0 ){.    
6950: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c    pSublist = sql
6960: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6970: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
6980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6990: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
69a0: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
69b0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
69c0: 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
69d0: 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20 73 71  }..    pSub = sq
69e0: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
69f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
6a00: 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63 2c 20  pSublist, pSrc, 
6a10: 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
6a20: 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f 72 74  , pHaving, pSort
6a30: 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
6a40: 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
6a50: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
6a60: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
6a70: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  );.    if( p->pS
6a80: 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  rc ){.      p->p
6a90: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
6aa0: 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20 20  t = pSub;.      
6ab0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
6ac0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
6ad0: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  se, p->pSrc);.  
6ae0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6af0: 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50  xpandSubquery(pP
6b00: 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e  arse, &p->pSrc->
6b10: 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  a[0]) ){.       
6b20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6b30: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
6b40: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73  .        pSub->s
6b50: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
6b60: 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 20 20  panded;.        
6b70: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
6b80: 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
6b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
6ba0: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
6bb0: 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSub, 0);.      
6bc0: 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6be0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
6bf0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
6c00: 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 29  pSublist->nExpr)
6c10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6c20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6c30: 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e  OpenDup, pMWin->
6c40: 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57 69 6e  iEphCsr+1, pMWin
6c50: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
6c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c70: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
6c80: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
6c90: 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  r+2, pMWin->iEph
6ca0: 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Csr);.      sqli
6cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6cc0: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57   OP_OpenDup, pMW
6cd0: 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c 20 70  in->iEphCsr+3, p
6ce0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
6cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
6d10: 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  lete(db, pSub);.
6d20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
6d30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6d40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6d50: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  EM;.  }..  retur
6d60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
6d70: 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f  ree the Window o
6d80: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
6d90: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6da0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
6db0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
6dc0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
6dd0: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndow *p){.  if( 
6de0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6df0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6e00: 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  ->pFilter);.    
6e10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6e20: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
6e30: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
6e40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6e50: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
6e60: 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
6e70: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6e80: 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71  p->pEnd);.    sq
6e90: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6ea0: 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a  db, p->pStart);.
6eb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6ec0: 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  e(db, p->zName);
6ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6ee0: 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73 65 29  ee(db, p->zBase)
6ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
6f00: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
6f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
6f20: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
6f30: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20   Window objects 
6f40: 73 74 61 72 74 69 6e 67 20 61 74 20 74 68 65 20  starting at the 
6f50: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
6f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6f70: 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65  WindowListDelete
6f80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
6f90: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c  ndow *p){.  whil
6fa0: 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64  e( p ){.    Wind
6fb0: 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ow *pNext = p->p
6fc0: 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c  NextWin;.    sql
6fd0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
6fe0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  (db, p);.    p =
6ff0: 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pNext;.  }.}../
7000: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
7010: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
7020: 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f 72 20  an PRECEDING or 
7030: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74  FOLLOWING offset
7040: 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  .  The.** value 
7050: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d  should be a non-
7060: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
7070: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
7080: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73  is not a.** cons
7090: 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69 74 20  tant, change it 
70a0: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61  to NULL.  The fa
70b0: 63 74 20 74 68 61 74 20 69 74 20 69 73 20 74 68  ct that it is th
70c0: 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  en a non-negativ
70d0: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77 69 6c  e.** integer wil
70e0: 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61 74 65  l be caught late
70f0: 72 2e 20 20 42 75 74 20 69 74 20 69 73 20 69 6d  r.  But it is im
7100: 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c  portant not to l
7110: 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65  eave.** variable
7120: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 65   values in the e
7130: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
7140: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
7150: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66  sqlite3WindowOff
7160: 73 65 74 45 78 70 72 28 50 61 72 73 65 20 2a 70  setExpr(Parse *p
7170: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7180: 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71  pr){.  if( 0==sq
7190: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
71a0: 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
71b0: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
71c0: 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33  OBJECT ) sqlite3
71d0: 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28  RenameExprUnmap(
71e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
71f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7200: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7210: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 70 45  , pExpr);.    pE
7220: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7230: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
7240: 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  b, TK_NULL, 0, 0
7250: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7260: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
7270: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
7280: 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64 6f 77  urn a new Window
7290: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   object describi
72a0: 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65 66 69  ng a Window Defi
72b0: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f  nition..*/.Windo
72c0: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
72d0: 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65 20 2a  Alloc(.  Parse *
72e0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
72f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
7300: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
7310: 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 79       /* Frame ty
7320: 70 65 2e 20 54 4b 5f 52 41 4e 47 45 20 6f 72 20  pe. TK_RANGE or 
7330: 54 4b 5f 52 4f 57 53 20 2a 2f 0a 20 20 69 6e 74  TK_ROWS */.  int
7340: 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20 2f   eStart,       /
7350: 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43 55  * Start type: CU
7360: 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e 47  RRENT, PRECEDING
7370: 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42  , FOLLOWING, UNB
7380: 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70 72  OUNDED */.  Expr
7390: 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
73a0: 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73 69   Start window si
73b0: 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44 49  ze if TK_PRECEDI
73c0: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
73d0: 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 20  */.  int eEnd,  
73e0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 79         /* End ty
73f0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c  pe: CURRENT, FOL
7400: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
7410: 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47 20  NDED, PRECEDING 
7420: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64 20  */.  Expr *pEnd 
7430: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77 69         /* End wi
7440: 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f  ndow size if TK_
7450: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45  FOLLOWING or PRE
7460: 43 45 44 49 4e 47 20 2a 2f 0a 29 7b 0a 20 20 57  CEDING */.){.  W
7470: 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 30 3b  indow *pWin = 0;
7480: 0a 20 20 69 6e 74 20 62 49 6d 70 6c 69 63 69 74  .  int bImplicit
7490: 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Frame = 0;..  /*
74a0: 20 50 61 72 73 65 72 20 61 73 73 75 72 65 73 20   Parser assures 
74b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
74c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
74d0: 65 3d 3d 30 20 7c 7c 20 65 54 79 70 65 3d 3d 54  e==0 || eType==T
74e0: 4b 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70 65  K_RANGE || eType
74f0: 3d 3d 54 4b 5f 52 4f 57 53 20 29 3b 0a 20 20 61  ==TK_ROWS );.  a
7500: 73 73 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54  ssert( eStart==T
7510: 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74  K_CURRENT || eSt
7520: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
7530: 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  G.           || 
7540: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
7550: 4e 44 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d  NDED || eStart==
7560: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a  TK_FOLLOWING );.
7570: 20 20 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d    assert( eEnd==
7580: 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45  TK_CURRENT || eE
7590: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
75a0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
75b0: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
75c0: 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  D || eEnd==TK_PR
75d0: 45 43 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73  ECEDING );.  ass
75e0: 65 72 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b  ert( (eStart==TK
75f0: 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53  _PRECEDING || eS
7600: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
7610: 4e 47 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29  NG)==(pStart!=0)
7620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65   );.  assert( (e
7630: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
7640: 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  G || eEnd==TK_PR
7650: 45 43 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21  ECEDING)==(pEnd!
7660: 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 65 54  =0) );..  if( eT
7670: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 49  ype==0 ){.    bI
7680: 6d 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 31  mplicitFrame = 1
7690: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 54 4b  ;.    eType = TK
76a0: 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f  _RANGE;.  }..  /
76b0: 2a 20 49 66 20 61 20 66 72 61 6d 65 20 69 73 20  * If a frame is 
76c0: 64 65 63 6c 61 72 65 64 20 22 52 41 4e 47 45 22  declared "RANGE"
76d0: 20 28 6e 6f 74 20 22 52 4f 57 53 22 29 2c 20 74   (not "ROWS"), t
76e0: 68 65 6e 20 69 74 20 6d 61 79 20 6e 6f 74 20 75  hen it may not u
76f0: 73 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 22  se.  ** either "
7700: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
7710: 22 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c  " or "<expr> FOL
7720: 4c 4f 57 49 4e 47 22 2e 0a 20 20 2a 2f 0a 20 20  LOWING"..  */.  
7730: 69 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41  if( eType==TK_RA
7740: 4e 47 45 20 26 26 20 28 70 53 74 61 72 74 21 3d  NGE && (pStart!=
7750: 30 20 7c 7c 20 70 45 6e 64 21 3d 30 29 20 29 7b  0 || pEnd!=0) ){
7760: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7770: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 52 41  rMsg(pParse, "RA
7780: 4e 47 45 20 6d 75 73 74 20 75 73 65 20 6f 6e 6c  NGE must use onl
7790: 79 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20 43  y UNBOUNDED or C
77a0: 55 52 52 45 4e 54 20 52 4f 57 22 29 3b 0a 20 20  URRENT ROW");.  
77b0: 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c    goto windowAll
77c0: 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ocErr;.  }..  /*
77d0: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
77e0: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  he.  ** starting
77f0: 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d   boundary type m
7800: 61 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72  ay not occur ear
7810: 6c 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c  lier in the foll
7820: 6f 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a  owing list than.
7830: 20 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20    ** the ending 
7840: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20  boundary type:. 
7850: 20 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55   **.  **   UNBOU
7860: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20  NDED PRECEDING. 
7870: 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45   **   <expr> PRE
7880: 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55  CEDING.  **   CU
7890: 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20  RRENT ROW.  **  
78a0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
78b0: 47 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44  G.  **   UNBOUND
78c0: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  ED FOLLOWING.  *
78d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65  *.  ** The parse
78e0: 72 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22  r ensures that "
78f0: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
7900: 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75  ING" cannot be u
7910: 73 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67  sed as an ending
7920: 0a 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20  .  ** boundary, 
7930: 61 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e  and than "UNBOUN
7940: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63  DED FOLLOWING" c
7950: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73  annot be used as
7960: 20 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a   a starting.  **
7970: 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e   frame boundary.
7980: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74  .  */.  if( (eSt
7990: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
79a0: 26 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  && eEnd==TK_PREC
79b0: 45 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53  EDING).   || (eS
79c0: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
79d0: 4e 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f  NG && (eEnd==TK_
79e0: 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e  PRECEDING || eEn
79f0: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a  d==TK_CURRENT)).
7a00: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
7a10: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7a20: 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72   "unsupported fr
7a30: 61 6d 65 20 64 65 6c 69 6d 69 74 65 72 20 66 6f  ame delimiter fo
7a40: 72 20 52 4f 57 53 22 29 3b 0a 20 20 20 20 67 6f  r ROWS");.    go
7a50: 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72  to windowAllocEr
7a60: 72 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e 20 3d  r;.  }..  pWin =
7a70: 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65   (Window*)sqlite
7a80: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
7a90: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
7aa0: 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28  (Window));.  if(
7ab0: 20 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20   pWin==0 ) goto 
7ac0: 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a  windowAllocErr;.
7ad0: 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20    pWin->eType = 
7ae0: 65 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65  eType;.  pWin->e
7af0: 53 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b 0a  Start = eStart;.
7b00: 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65    pWin->eEnd = e
7b10: 45 6e 64 3b 0a 20 20 70 57 69 6e 2d 3e 62 49 6d  End;.  pWin->bIm
7b20: 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 62 49  plicitFrame = bI
7b30: 6d 70 6c 69 63 69 74 46 72 61 6d 65 3b 0a 20 20  mplicitFrame;.  
7b40: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
7b50: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
7b60: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 6e  Expr(pParse, pEn
7b70: 64 29 3b 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61  d);.  pWin->pSta
7b80: 72 74 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  rt = sqlite3Wind
7b90: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61  owOffsetExpr(pPa
7ba0: 72 73 65 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  rse, pStart);.  
7bb0: 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69  return pWin;..wi
7bc0: 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20  ndowAllocErr:.  
7bd0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7be0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  e(pParse->db, pE
7bf0: 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  nd);.  sqlite3Ex
7c00: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
7c10: 3e 64 62 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  >db, pStart);.  
7c20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7c30: 2a 2a 20 41 74 74 61 63 68 20 50 41 52 54 49 54  ** Attach PARTIT
7c40: 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59  ION and ORDER BY
7c50: 20 63 6c 61 75 73 65 73 20 70 50 61 72 74 69 74   clauses pPartit
7c60: 69 6f 6e 20 61 6e 64 20 70 4f 72 64 65 72 42 79  ion and pOrderBy
7c70: 20 74 6f 20 77 69 6e 64 6f 77 0a 2a 2a 20 70 57   to window.** pW
7c80: 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 70 61 72  in. Also, if par
7c90: 61 6d 65 74 65 72 20 70 42 61 73 65 20 69 73 20  ameter pBase is 
7ca0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 70 57  not NULL, set pW
7cb0: 69 6e 2d 3e 7a 42 61 73 65 20 74 6f 20 74 68 65  in->zBase to the
7cc0: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  .** equivalent n
7cd0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
7ce0: 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ring..*/.Window 
7cf0: 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 73  *sqlite3WindowAs
7d00: 73 65 6d 62 6c 65 28 0a 20 20 50 61 72 73 65 20  semble(.  Parse 
7d10: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
7d20: 6f 77 20 2a 70 57 69 6e 2c 20 0a 20 20 45 78 70  ow *pWin, .  Exp
7d30: 72 4c 69 73 74 20 2a 70 50 61 72 74 69 74 69 6f  rList *pPartitio
7d40: 6e 2c 20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  n, .  ExprList *
7d50: 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 54 6f 6b  pOrderBy, .  Tok
7d60: 65 6e 20 2a 70 42 61 73 65 0a 29 7b 0a 20 20 69  en *pBase.){.  i
7d70: 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 70  f( pWin ){.    p
7d80: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
7d90: 3d 20 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  = pPartition;.  
7da0: 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79    pWin->pOrderBy
7db0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
7dc0: 20 69 66 28 20 70 42 61 73 65 20 29 7b 0a 20 20   if( pBase ){.  
7dd0: 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20      pWin->zBase 
7de0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
7df0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
7e00: 42 61 73 65 2d 3e 7a 2c 20 70 42 61 73 65 2d 3e  Base->z, pBase->
7e10: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
7e20: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
7e30: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
7e40: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 74  rse->db, pPartit
7e50: 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ion);.    sqlite
7e60: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7e70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
7e80: 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  erBy);.  }.  ret
7e90: 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn pWin;.}../*.
7ea0: 2a 2a 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20  ** Window *pWin 
7eb0: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
7ec0: 65 61 74 65 64 20 66 72 6f 6d 20 61 20 57 49 4e  eated from a WIN
7ed0: 44 4f 57 20 63 6c 61 75 73 65 2e 20 54 6f 6b 6e  DOW clause. Tokn
7ee0: 65 20 70 42 61 73 65 0a 2a 2a 20 69 73 20 74 68  e pBase.** is th
7ef0: 65 20 62 61 73 65 20 77 69 6e 64 6f 77 2e 20 45  e base window. E
7f00: 61 72 6c 69 65 72 20 77 69 6e 64 6f 77 73 20 66  arlier windows f
7f10: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 57 49 4e  rom the same WIN
7f20: 44 4f 57 20 63 6c 61 75 73 65 20 61 72 65 0a 2a  DOW clause are.*
7f30: 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
7f40: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
7f50: 74 69 6e 67 20 61 74 20 70 57 69 6e 2d 3e 70 4e  ting at pWin->pN
7f60: 65 78 74 57 69 6e 2e 20 54 68 69 73 20 66 75 6e  extWin. This fun
7f70: 63 74 69 6f 6e 0a 2a 2a 20 65 69 74 68 65 72 20  ction.** either 
7f80: 75 70 64 61 74 65 73 20 2a 70 57 69 6e 20 61 63  updates *pWin ac
7f90: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 62  cording to the b
7fa0: 61 73 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  ase specificatio
7fb0: 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c 65  n, or else.** le
7fc0: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  aves an error in
7fd0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
7fe0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68   sqlite3WindowCh
7ff0: 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ain(Parse *pPars
8000: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c  e, Window *pWin,
8010: 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 29 7b   Window *pList){
8020: 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 42 61  .  if( pWin->zBa
8030: 73 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  se ){.    sqlite
8040: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8050: 64 62 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  db;.    Window *
8060: 70 45 78 69 73 74 20 3d 20 77 69 6e 64 6f 77 46  pExist = windowF
8070: 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ind(pParse, pLis
8080: 74 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b  t, pWin->zBase);
8090: 0a 20 20 20 20 69 66 28 20 70 45 78 69 73 74 20  .    if( pExist 
80a0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
80b0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
80c0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f       /* Check fo
80d0: 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  r errors */.    
80e0: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 50 61 72    if( pWin->pPar
80f0: 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  tition ){.      
8100: 20 20 7a 45 72 72 20 3d 20 22 50 41 52 54 49 54    zErr = "PARTIT
8110: 49 4f 4e 20 63 6c 61 75 73 65 22 3b 0a 20 20 20  ION clause";.   
8120: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
8130: 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ist->pOrderBy &&
8140: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20   pWin->pOrderBy 
8150: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
8160: 3d 20 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  = "ORDER BY clau
8170: 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  se";.      }else
8180: 20 69 66 28 20 70 45 78 69 73 74 2d 3e 62 49 6d   if( pExist->bIm
8190: 70 6c 69 63 69 74 46 72 61 6d 65 3d 3d 30 20 29  plicitFrame==0 )
81a0: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
81b0: 20 22 66 72 61 6d 65 20 73 70 65 63 69 66 69 63   "frame specific
81c0: 61 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20 7d 0a  ation";.      }.
81d0: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29        if( zErr )
81e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
81f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8200: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
8210: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
8220: 25 73 20 6f 66 20 77 69 6e 64 6f 77 3a 20 25 73  %s of window: %s
8230: 22 2c 20 7a 45 72 72 2c 20 70 57 69 6e 2d 3e 7a  ", zErr, pWin->z
8240: 42 61 73 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Base.        );.
8250: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8260: 20 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74       pWin->pPart
8270: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
8280: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8290: 45 78 69 73 74 2d 3e 70 50 61 72 74 69 74 69 6f  Exist->pPartitio
82a0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  n, 0);.        i
82b0: 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65  f( pExist->pOrde
82c0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
82d0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
82e0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
82f0: 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f          pWin->pO
8300: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
8310: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
8320: 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79  pExist->pOrderBy
8330: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
8340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
8350: 62 46 72 65 65 28 64 62 2c 20 70 57 69 6e 2d 3e  bFree(db, pWin->
8360: 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  zBase);.        
8370: 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 30 3b  pWin->zBase = 0;
8380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8390: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61   }.}../*.** Atta
83a0: 63 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  ch window object
83b0: 20 70 57 69 6e 20 74 6f 20 65 78 70 72 65 73 73   pWin to express
83c0: 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ion p..*/.void s
83d0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61  qlite3WindowAtta
83e0: 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ch(Parse *pParse
83f0: 2c 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f  , Expr *p, Windo
8400: 77 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20  w *pWin){.  if( 
8410: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
8420: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
8430: 49 4f 4e 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ION );.    /* Th
8440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
8450: 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ly called for th
8460: 65 20 70 61 72 73 65 72 2e 20 20 49 66 20 70 57  e parser.  If pW
8470: 69 6e 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a  in was not.    *
8480: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 64 75 65 20  * allocated due 
8490: 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74 68 65 6e 20  to an OOM, then 
84a0: 74 68 65 20 70 61 72 73 65 72 20 77 6f 75 6c 64  the parser would
84b0: 20 66 61 69 6c 20 62 65 66 6f 72 65 20 65 76 65   fail before eve
84c0: 72 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 69 6e  r.    ** invokin
84d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  g this routine *
84e0: 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  /.    if( ALWAYS
84f0: 28 70 57 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  (pWin) ){.      
8500: 70 2d 3e 79 2e 70 57 69 6e 20 3d 20 70 57 69 6e  p->y.pWin = pWin
8510: 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 50  ;.      ExprSetP
8520: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
8530: 6e 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 70 57  nFunc);.      pW
8540: 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 3b 0a  in->pOwner = p;.
8550: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
8560: 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
8570: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8580: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8590: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  se,.           "
85a0: 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f 74 20  DISTINCT is not 
85b0: 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 77 69  supported for wi
85c0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22 29  ndow functions")
85d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
85e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
85f0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
8600: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 69  (pParse->db, pWi
8610: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
8620: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
8630: 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65   two window obje
8640: 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  cts are identica
8650: 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  l, or non-zero o
8660: 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65  therwise..** Ide
8670: 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62  ntical window ob
8680: 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70 72 6f  jects can be pro
8690: 63 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e 67  cessed in a sing
86a0: 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20  le scan..*/.int 
86b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d  sqlite3WindowCom
86c0: 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
86d0: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20  se, Window *p1, 
86e0: 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69  Window *p2){.  i
86f0: 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d 70 32  f( p1->eType!=p2
8700: 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75 72 6e  ->eType ) return
8710: 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 53   1;.  if( p1->eS
8720: 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61 72 74  tart!=p2->eStart
8730: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
8740: 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70 32 2d  f( p1->eEnd!=p2-
8750: 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e 20 31  >eEnd ) return 1
8760: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
8770: 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
8780: 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c 20 70  e, p1->pStart, p
8790: 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29 20 29  2->pStart, -1) )
87a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
87b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
87c0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e  are(pParse, p1->
87d0: 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64 2c 20  pEnd, p2->pEnd, 
87e0: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
87f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
8800: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
8810: 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70 32 2d  >pPartition, p2-
8820: 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d 31 29  >pPartition, -1)
8830: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
8840: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
8850: 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 4f  stCompare(p1->pO
8860: 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f 72 64  rderBy, p2->pOrd
8870: 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65 74 75  erBy, -1) ) retu
8880: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
8890: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
88a0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 63 6f   is called by co
88b0: 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 20 62  de in select.c b
88c0: 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73 20 73  efore it calls s
88d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
88e0: 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e 20 69  ().** to begin i
88f0: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
8900: 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 72   the sub-query r
8910: 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20 75 73  esults. It is us
8920: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 2a  ed to allocate.*
8930: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
8940: 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 63   registers and c
8950: 75 72 73 6f 72 73 20 75 73 65 64 20 62 79 20 73  ursors used by s
8960: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
8970: 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Step()..*/.void 
8980: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
8990: 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70 50 61  eInit(Parse *pPa
89a0: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57  rse, Window *pMW
89b0: 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  in){.  Window *p
89c0: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
89d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
89e0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6e  pParse);.  int n
89f0: 50 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d 3e 70  Part = (pMWin->p
8a00: 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d 57 69  Partition ? pMWi
8a10: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e  n->pPartition->n
8a20: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e 50 61  Expr : 0);.  nPa
8a30: 72 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f  rt += (pMWin->pO
8a40: 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e  rderBy ? pMWin->
8a50: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
8a60: 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 50 61 72  : 0);.  if( nPar
8a70: 74 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  t ){.    pMWin->
8a80: 72 65 67 50 61 72 74 20 3d 20 70 50 61 72 73 65  regPart = pParse
8a90: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
8aa0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
8ab0: 61 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  art;.    sqlite3
8ac0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8ad0: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d  _Null, 0, pMWin-
8ae0: 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d  >regPart, pMWin-
8af0: 3e 72 65 67 50 61 72 74 2b 6e 50 61 72 74 2d 31  >regPart+nPart-1
8b00: 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d 57 69 6e 2d  );.  }..  pMWin-
8b10: 3e 72 65 67 46 69 72 73 74 20 3d 20 2b 2b 70 50  >regFirst = ++pP
8b20: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
8b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8b40: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
8b50: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73  , pMWin->regFirs
8b60: 74 29 3b 0a 20 20 70 4d 57 69 6e 2d 3e 72 65 67  t);.  pMWin->reg
8b70: 53 69 7a 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Size = ++pParse-
8b80: 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
8b90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8ba0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57  _Integer, 0, pMW
8bb0: 69 6e 2d 3e 72 65 67 53 69 7a 65 29 3b 0a 0a 20  in->regSize);.. 
8bc0: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
8bd0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
8be0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
8bf0: 20 46 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57   FuncDef *p = pW
8c00: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69  in->pFunc;.    i
8c10: 66 28 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73  f( (p->funcFlags
8c20: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
8c30: 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e  INMAX) && pWin->
8c40: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
8c50: 4e 44 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  NDED ){.      /*
8c60: 20 54 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73   The inline vers
8c70: 69 6f 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e  ions of min() an
8c80: 64 20 6d 61 78 28 29 20 72 65 71 75 69 72 65 20  d max() require 
8c90: 61 20 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72  a single ephemer
8ca0: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  al.      ** tabl
8cb0: 65 20 61 6e 64 20 33 20 72 65 67 69 73 74 65 72  e and 3 register
8cc0: 73 2e 20 54 68 65 20 72 65 67 69 73 74 65 72 73  s. The registers
8cd0: 20 61 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c   are used as fol
8ce0: 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
8cf0: 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70       **   regApp
8d00: 2b 30 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79  +0: slot to copy
8d10: 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67   min()/max() arg
8d20: 75 6d 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b  ument to for Mak
8d30: 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a  eRecord.      **
8d40: 20 20 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74     regApp+1: int
8d50: 65 67 65 72 20 76 61 6c 75 65 20 75 73 65 64 20  eger value used 
8d60: 74 6f 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61  to ensure keys a
8d70: 72 65 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20  re unique.      
8d80: 2a 2a 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f  **   regApp+2: o
8d90: 75 74 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63  utput of MakeRec
8da0: 6f 72 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ord.      */.   
8db0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
8dc0: 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  st = pWin->pOwne
8dd0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
8de0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
8df0: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
8e00: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
8e10: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
8e20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69  0, 0);.      pWi
8e30: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
8e40: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
8e50: 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d    pWin->regApp =
8e60: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
8e70: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
8e80: 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20  Mem += 3;.      
8e90: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20  if( pKeyInfo && 
8ea0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61  pWin->pFunc->zNa
8eb0: 6d 65 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20  me[1]=='i' ){.  
8ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
8ed0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
8ee0: 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  er[0]==0 );.    
8ef0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
8f00: 6f 72 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b  ortOrder[0] = 1;
8f10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8f30: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
8f40: 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41  eral, pWin->csrA
8f50: 70 70 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71  pp, 2);.      sq
8f60: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
8f70: 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50  4(v, pKeyInfo, P
8f80: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
8f90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8fa0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
8fb0: 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  r, 0, pWin->regA
8fc0: 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pp+1);.    }.   
8fd0: 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61   else if( p->zNa
8fe0: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
8ff0: 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66  e || p->zName==f
9000: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29  irst_valueName )
9010: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  {.      /* Alloc
9020: 61 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72  ate two register
9030: 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70  s at pWin->regAp
9040: 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65  p. These will be
9050: 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a   used to.      *
9060: 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74 61 72  * store the star
9070: 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20  t and end index 
9080: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  of the current f
9090: 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rame.  */.      
90a0: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69  assert( pMWin->i
90b0: 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20  EphCsr );.      
90c0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
90d0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
90e0: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
90f0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
9100: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
9110: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
9120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9130: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
9140: 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  up, pWin->csrApp
9150: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
9160: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
9170: 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d  e if( p->zName==
9180: 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a  leadName || p->z
9190: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b  Name==lagName ){
91a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
91b0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b  MWin->iEphCsr );
91c0: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
91d0: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
91e0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab++;.      sqli
91f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9200: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69   OP_OpenDup, pWi
9210: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e  n->csrApp, pMWin
9220: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
9230: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
9240: 20 22 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70   "PRECEDING <exp
9250: 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 30 29 20 6f  r>" (eCond==0) o
9260: 72 20 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78  r "FOLLOWING <ex
9270: 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 31 29 20  pr>" (eCond==1) 
9280: 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
9290: 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
92a0: 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61  gument to nth_va
92b0: 6c 75 65 28 29 20 28 65 43 6f 6e 64 3d 3d 32 29  lue() (eCond==2)
92c0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a   has just been.*
92d0: 2a 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  * evaluated and 
92e0: 74 68 65 20 72 65 73 75 6c 74 20 6c 65 66 74 20  the result left 
92f0: 69 6e 20 72 65 67 69 73 74 65 72 20 72 65 67 2e  in register reg.
9300: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   This function g
9310: 65 6e 65 72 61 74 65 73 20 56 4d 0a 2a 2a 20 63  enerates VM.** c
9320: 6f 64 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61  ode to check tha
9330: 74 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  t the value is a
9340: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
9350: 74 65 67 65 72 20 61 6e 64 20 74 68 72 6f 77 73  teger and throws
9360: 20 61 6e 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e   an.** exception
9370: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a   if it is not..*
9380: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9390: 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75  ndowCheckIntValu
93a0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
93b0: 20 69 6e 74 20 72 65 67 2c 20 69 6e 74 20 65 43   int reg, int eC
93c0: 6f 6e 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ond){.  static c
93d0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 72 72  onst char *azErr
93e0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 66 72 61 6d  [] = {.    "fram
93f0: 65 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65  e starting offse
9400: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
9410: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
9420: 22 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e  ",.    "frame en
9430: 64 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74  ding offset must
9440: 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   be a non-negati
9450: 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20  ve integer",.   
9460: 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e   "second argumen
9470: 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 20 6d  t to nth_value m
9480: 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76  ust be a positiv
9490: 65 20 69 6e 74 65 67 65 72 22 0a 20 20 7d 3b 0a  e integer".  };.
94a0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 4f 70    static int aOp
94b0: 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c 20 4f 50  [] = { OP_Ge, OP
94c0: 5f 47 65 2c 20 4f 50 5f 47 74 20 7d 3b 0a 20 20  _Ge, OP_Gt };.  
94d0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
94e0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
94f0: 3b 0a 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20  ;.  int regZero 
9500: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
9510: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61  Reg(pParse);.  a
9520: 73 73 65 72 74 28 20 65 43 6f 6e 64 3d 3d 30 20  ssert( eCond==0 
9530: 7c 7c 20 65 43 6f 6e 64 3d 3d 31 20 7c 7c 20 65  || eCond==1 || e
9540: 43 6f 6e 64 3d 3d 32 20 29 3b 0a 20 20 73 71 6c  Cond==2 );.  sql
9550: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9560: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
9570: 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20 73 71 6c   regZero);.  sql
9580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9590: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
95a0: 72 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65  reg, sqlite3Vdbe
95b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
95c0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
95d0: 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29  eIf(v, eCond==0)
95e0: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
95f0: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b  If(v, eCond==1);
9600: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  .  VdbeCoverageI
9610: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a  f(v, eCond==2);.
9620: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9630: 4f 70 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e 64  Op3(v, aOp[eCond
9640: 5d 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69  ], regZero, sqli
9650: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
9660: 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20  dr(v)+2, reg);. 
9670: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
9680: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
9690: 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==0);.  VdbeCov
96a0: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66  erageNeverNullIf
96b0: 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20  (v, eCond==1);. 
96c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
96d0: 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e  erNullIf(v, eCon
96e0: 64 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  d==2);.  sqlite3
96f0: 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29  MayAbort(pParse)
9700: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
9710: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp2(v, OP_Halt
9720: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
9730: 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c  OE_Abort);.  sql
9740: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
9750: 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72  (v, (void*)azErr
9760: 5b 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41 54  [eCond], P4_STAT
9770: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  IC);.  sqlite3Re
9780: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
9790: 72 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d  rse, regZero);.}
97a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
97b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
97c0: 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
97d0: 20 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63   the window-func
97e0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a  tion associated.
97f0: 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65  ** with the obje
9800: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
9810: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
9820: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
9830: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9840: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69  indowArgCount(Wi
9850: 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45  ndow *pWin){.  E
9860: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
9870: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
9880: 2e 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  .pList;.  return
9890: 20 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d   (pList ? pList-
98a0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a  >nExpr : 0);.}..
98b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
98c0: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
98d0: 20 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20   either xStep() 
98e0: 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20  (if bInverse is 
98f0: 30 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72  0) or .** xInver
9900: 73 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20  se (if bInverse 
9910: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72  is non-zero) for
9920: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
9930: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a  ction in the .**
9940: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
9950: 72 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20  rting at pMWin. 
9960: 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e  Or, for built-in
9970: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
9980: 73 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74  s.** that do not
9990: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
99a0: 64 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20  d function API, 
99b0: 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71  generate the req
99c0: 75 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20  uired.** inline 
99d0: 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  VM code..**.** I
99e0: 66 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69  f argument csr i
99f0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
9a00: 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68  r equal to 0, th
9a10: 65 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20  en argument reg 
9a20: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
9a30: 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61  register in an a
9a40: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
9a50: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
9a60: 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
9a70: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61  gh to hold the a
9a80: 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
9a90: 73 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74  s for each funct
9aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
9ab0: 65 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e  e.** the argumen
9ac0: 74 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ts are extracted
9ad0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
9ae0: 74 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74  t row of csr int
9af0: 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f  o the.** array o
9b00: 66 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f  f registers befo
9b10: 72 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41  re invoking OP_A
9b20: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67  ggStep or OP_Agg
9b30: 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72  Inverse.**.** Or
9b40: 2c 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73  , if csr is less
9b50: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
9b60: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65   the array of re
9b70: 67 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69  gisters at reg i
9b80: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70  s.** already pop
9b90: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20  ulated with all 
9ba0: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
9bb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
9bc0: 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
9bd0: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
9be0: 20 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20   regPartSize is 
9bf0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
9c00: 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  t is a register 
9c10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
9c20: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
9c30: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
9c40: 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  partition..*/.st
9c50: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
9c60: 41 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65  AggStep(.  Parse
9c70: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e   *pParse, .  Win
9c80: 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20  dow *pMWin,     
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ca0: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77  Linked list of w
9cb0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
9cc0: 2a 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20  */.  int csr,   
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67       /* Read arg
9cf0: 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73  uments from this
9d00: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
9d10: 20 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20   bInverse,      
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d30: 54 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  True to invoke x
9d40: 49 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20  Inverse instead 
9d50: 6f 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e  of xStep */.  in
9d60: 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20  t reg,          
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9d80: 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   Array of regist
9d90: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ers */.  int reg
9da0: 50 61 72 74 53 69 7a 65 20 20 20 20 20 20 20 20  PartSize        
9db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
9dc0: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
9dd0: 73 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69 6f  size of partitio
9de0: 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
9df0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9e00: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69  be(pParse);.  Wi
9e10: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f  ndow *pWin;.  fo
9e20: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
9e30: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
9e40: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 6e  NextWin){.    in
9e50: 74 20 66 6c 61 67 73 20 3d 20 70 57 69 6e 2d 3e  t flags = pWin->
9e60: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
9e70: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 72 67  ;.    int regArg
9e80: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d  ;.    int nArg =
9e90: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
9ea0: 70 57 69 6e 29 3b 0a 0a 20 20 20 20 69 66 28 20  pWin);..    if( 
9eb0: 63 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  csr>=0 ){.      
9ec0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
9ed0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
9ee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
9ef0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9f00: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
9f10: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69   pWin->iArgCol+i
9f20: 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20  , reg+i);.      
9f30: 7d 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d  }.      regArg =
9f40: 20 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20   reg;.      if( 
9f50: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
9f60: 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 20  UNC_WINDOW_SIZE 
9f70: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
9f80: 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
9f90: 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67      regArg = reg
9fa0: 50 61 72 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  PartSize;.      
9fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9fc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9fd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
9fe0: 2c 20 72 65 67 50 61 72 74 53 69 7a 65 2c 20 72  , regPartSize, r
9ff0: 65 67 2b 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  eg+nArg);.      
a000: 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 72 67    }.        nArg
a010: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
a020: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
a030: 65 72 74 28 20 21 28 66 6c 61 67 73 20 26 20 53  ert( !(flags & S
a040: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
a050: 57 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 20  W_SIZE) );.     
a060: 20 72 65 67 41 72 67 20 3d 20 72 65 67 20 2b 20   regArg = reg + 
a070: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20  pWin->iArgCol;. 
a080: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
a090: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
a0a0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
a0b0: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20  UNC_MINMAX) .   
a0c0: 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61     && pWin->eSta
a0d0: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
a0e0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
a0f0: 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20  nt addrIsNull = 
a100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a110: 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
a120: 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56  regArg);.      V
a130: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
a140: 20 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72        if( bInver
a150: 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  se==0 ){.       
a160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a170: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
a180: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
a190: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
a1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a1b0: 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41  , OP_SCopy, regA
a1c0: 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  rg, pWin->regApp
a1d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a1e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a1f0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
a200: 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20  Win->regApp, 2, 
a210: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b  pWin->regApp+2);
a220: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a230: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a240: 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e  _IdxInsert, pWin
a250: 2d 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e  ->csrApp, pWin->
a260: 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20  regApp+2);.     
a270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a290: 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47  4Int(v, OP_SeekG
a2a0: 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  E, pWin->csrApp,
a2b0: 20 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a   0, regArg, 1);.
a2c0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
a2d0: 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
a2e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a2f0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
a300: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d  OP_Delete, pWin-
a310: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
a320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
a330: 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33  pHere(v, sqlite3
a340: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a350: 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v)-2);.      }. 
a360: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a370: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
a380: 49 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c  IsNull);.    }el
a390: 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67  se if( pWin->reg
a3a0: 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  App ){.      ass
a3b0: 65 72 74 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63  ert( pWin->pFunc
a3c0: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
a3d0: 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20  ueName.         
a3e0: 20 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63    || pWin->pFunc
a3f0: 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76  ->zName==first_v
a400: 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 29  alueName.      )
a410: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a420: 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c 20 62  bInverse==0 || b
a430: 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a 20 20  Inverse==1 );.  
a440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a450: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
a460: 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  mm, pWin->regApp
a470: 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20 31 29 3b  +1-bInverse, 1);
a480: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
a490: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d  Win->pFunc->zNam
a4a0: 65 3d 3d 6c 65 61 64 4e 61 6d 65 0a 20 20 20 20  e==leadName.    
a4b0: 20 20 20 20 20 20 20 7c 7c 20 70 57 69 6e 2d 3e         || pWin->
a4c0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61  pFunc->zName==la
a4d0: 67 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20  gName.    ){.   
a4e0: 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
a4f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a500: 69 6e 74 20 61 64 64 72 49 66 20 3d 20 30 3b 0a  int addrIf = 0;.
a510: 20 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e        if( pWin->
a520: 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20  pFilter ){.     
a530: 20 20 20 69 6e 74 20 72 65 67 54 6d 70 3b 0a 20     int regTmp;. 
a540: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
a550: 41 72 67 3d 3d 30 20 7c 7c 20 6e 41 72 67 3d 3d  Arg==0 || nArg==
a560: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
a570: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  pList->nExpr );.
a580: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a590: 6e 41 72 67 20 7c 7c 20 70 57 69 6e 2d 3e 70 4f  nArg || pWin->pO
a5a0: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  wner->x.pList==0
a5b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
a5c0: 63 73 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  csr>0 ){.       
a5d0: 20 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69     regTmp = sqli
a5e0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a5f0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
a600: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a610: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
a620: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
a630: 43 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29  Col+nArg,regTmp)
a640: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a650: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 54 6d  .          regTm
a660: 70 20 3d 20 72 65 67 41 72 67 20 2b 20 6e 41 72  p = regArg + nAr
a670: 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  g;.        }.   
a680: 20 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71       addrIf = sq
a690: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a6a0: 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
a6b0: 54 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  Tmp, 0, 1);.    
a6c0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a6d0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (v);.        if(
a6e0: 20 63 73 72 3e 30 20 29 7b 0a 20 20 20 20 20 20   csr>0 ){.      
a6f0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
a700: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
a710: 2c 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20  , regTmp);.     
a720: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a730: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75     if( pWin->pFu
a740: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
a750: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
a760: 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  COLL ){.        
a770: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
a780: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a790: 6e 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 20 20  nArg>0 );.      
a7a0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
a7b0: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
a7c0: 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77  Parse, pWin->pOw
a7d0: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  ner->x.pList->a[
a7e0: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
a7f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a800: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
a810: 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73  eq, 0,0,0, (cons
a820: 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50  t char*)pColl, P
a830: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
a840: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a850: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 62  3VdbeAddOp3(v, b
a860: 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67 49  Inverse? OP_AggI
a870: 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67 53  nverse : OP_AggS
a880: 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tep, .          
a890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 49                bI
a8a0: 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c 20  nverse, regArg, 
a8b0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
a8c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a8d0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
a8e0: 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
a8f0: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
a900: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a910: 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
a920: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 49 66        if( addrIf
a930: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
a940: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
a950: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a960: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
a970: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
a980: 20 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29   either xValue()
a990: 20 28 62 46 69 6e 61 6c 3d 3d 30 29 20 6f 72 20   (bFinal==0) or 
a9a0: 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28  xFinalize().** (
a9b0: 62 46 69 6e 61 6c 3d 3d 31 29 20 66 6f 72 20 65  bFinal==1) for e
a9c0: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
a9d0: 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  ion in the linke
a9e0: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
a9f0: 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c  at.** pMWin. Or,
aa00: 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69   for built-in wi
aa10: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74  ndow-functions t
aa20: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
aa30: 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41  he standard.** A
aa40: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
aa50: 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20 63   equivalent VM c
aa60: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
aa70: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69 6e  oid windowAggFin
aa80: 61 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  al(Parse *pParse
aa90: 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c  , Window *pMWin,
aaa0: 20 69 6e 74 20 62 46 69 6e 61 6c 29 7b 0a 20 20   int bFinal){.  
aab0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
aac0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
aad0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
aae0: 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  ;..  for(pWin=pM
aaf0: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
ab00: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
ab10: 0a 20 20 20 20 69 66 28 20 28 70 57 69 6e 2d 3e  .    if( (pWin->
ab20: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
ab30: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
ab40: 49 4e 4d 41 58 29 20 0a 20 20 20 20 20 26 26 20  INMAX) .     && 
ab50: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
ab60: 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20  _UNBOUNDED .    
ab70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ab80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ab90: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
aba0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
abb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
abc0: 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op1(v, OP_Last, 
abd0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
abe0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
abf0: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
ac00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ac10: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e   OP_Column, pWin
ac20: 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 70 57 69  ->csrApp, 0, pWi
ac30: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
ac40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ac50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69  JumpHere(v, sqli
ac60: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
ac70: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20  dr(v)-2);.      
ac80: 69 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20 20  if( bFinal ){.  
ac90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
aca0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
acb0: 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d  setSorter, pWin-
acc0: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
acd0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
ace0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
acf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad00: 20 69 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20   if( bFinal ){. 
ad10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ad20: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
ad30: 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72  ggFinal, pWin->r
ad40: 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41  egAccum, windowA
ad50: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a  rgCount(pWin));.
ad60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ad70: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
ad80: 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  Win->pFunc, P4_F
ad90: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20  UNCDEF);.       
ada0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
adb0: 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
adc0: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70  Win->regAccum, p
add0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
ade0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
adf0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ae00: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
ae10: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20  regAccum);.     
ae20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ae30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae40: 33 28 76 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65  3(v, OP_AggValue
ae50: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
ae60: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
ae70: 28 70 57 69 6e 29 2c 0a 20 20 20 20 20 20 20 20  (pWin),.        
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65       pWin->regRe
aea0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73  sult);.        s
aeb0: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
aec0: 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e  P4(v, pWin->pFun
aed0: 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
aee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
aef0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
af00: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
af10: 65 73 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  es VM code to in
af20: 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75  voke the sub-rou
af30: 74 69 6e 65 20 61 74 20 61 64 64 72 65 73 73 0a  tine at address.
af40: 2a 2a 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  ** lblFlushPart 
af50: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
af60: 72 74 69 74 69 6f 6e 20 77 69 74 68 20 74 68 65  rtition with the
af70: 20 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f   entire partitio
af80: 6e 20 63 61 63 68 65 64 20 69 6e 0a 2a 2a 20 74  n cached in.** t
af90: 68 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73  he Window.iEphCs
afa0: 72 20 74 65 6d 70 20 74 61 62 6c 65 2e 0a 2a 2f  r temp table..*/
afb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
afc0: 64 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68  dowPartitionCach
afd0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
afe0: 73 65 2c 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c  se,.  Select *p,
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 77        /* The rew
b010: 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74  ritten SELECT st
b020: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65  atement */.  Whe
b030: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
b040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b050: 57 68 65 72 65 49 6e 66 6f 20 74 6f 20 63 61 6c  WhereInfo to cal
b060: 6c 20 57 68 65 72 65 45 6e 64 28 29 20 6f 6e 20  l WhereEnd() on 
b070: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73  */.  int regFlus
b080: 68 50 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  hPart,          
b090: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
b0a0: 20 74 6f 20 75 73 65 20 77 69 74 68 20 47 6f 73   to use with Gos
b0b0: 75 62 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  ub lblFlushPart 
b0c0: 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73  */.  int lblFlus
b0d0: 68 50 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  hPart,          
b0e0: 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
b0f0: 6e 65 20 74 6f 20 47 6f 73 75 62 20 74 6f 20 2a  ne to Gosub to *
b100: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 53 69 7a  /.  int *pRegSiz
b110: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
b120: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69      /* OUT: Regi
b130: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
b140: 70 61 72 74 69 74 69 6f 6e 20 73 69 7a 65 20 2a  partition size *
b150: 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  /.){.  Window *p
b160: 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
b170: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
b180: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
b190: 65 29 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73  e);.  int iSubCs
b1a0: 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  r = p->pSrc->a[0
b1b0: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ].iCursor;.  int
b1c0: 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   nSub = p->pSrc-
b1d0: 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
b1e0: 3b 0a 20 20 69 6e 74 20 6b 3b 0a 0a 20 20 69 6e  ;.  int k;..  in
b1f0: 74 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  t reg = pParse->
b200: 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72 65  nMem+1;.  int re
b210: 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e 53  gRecord = reg+nS
b220: 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ub;.  int regRow
b230: 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b 31  id = regRecord+1
b240: 3b 0a 0a 20 20 2a 70 52 65 67 53 69 7a 65 20 3d  ;..  *pRegSize =
b250: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 70 50 61   regRowid;.  pPa
b260: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75  rse->nMem += nSu
b270: 62 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  b + 2;..  /* Loa
b280: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  d the column val
b290: 75 65 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20  ues for the row 
b2a0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
b2b0: 73 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20  sub-select.  ** 
b2c0: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
b2d0: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
b2e0: 69 6e 67 20 61 74 20 72 65 67 2e 20 2a 2f 0a 20  ing at reg. */. 
b2f0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62   for(k=0; k<nSub
b300: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; k++){.    sqli
b310: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b320: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62   OP_Column, iSub
b330: 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a  Csr, k, reg+k);.
b340: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
b350: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
b360: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20 6e  keRecord, reg, n
b370: 53 75 62 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Sub, regRecord);
b380: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
b390: 74 68 69 73 20 69 73 20 74 68 65 20 73 74 61 72  this is the star
b3a0: 74 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69  t of a new parti
b3b0: 74 69 6f 6e 2e 20 49 66 20 73 6f 2c 20 63 61 6c  tion. If so, cal
b3c0: 6c 20 74 68 65 0a 20 20 2a 2a 20 66 6c 75 73 68  l the.  ** flush
b3d0: 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62 2d 72  _partition sub-r
b3e0: 6f 75 74 69 6e 65 2e 20 20 2a 2f 0a 20 20 69 66  outine.  */.  if
b3f0: 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ( pMWin->pPartit
b400: 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  ion ){.    int a
b410: 64 64 72 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ddr;.    ExprLis
b420: 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
b430: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
b440: 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 70 50    int nPart = pP
b450: 61 72 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  art->nExpr;.    
b460: 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d  int regNewPart =
b470: 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42   reg + pMWin->nB
b480: 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65  ufferCol;.    Ke
b490: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
b4a0: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
b4b0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
b4c0: 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30  rse, pPart, 0, 0
b4d0: 29 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d 20 73  );..    addr = s
b4e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b4f0: 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
b500: 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
b510: 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72 74  n->regPart,nPart
b520: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b530: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
b540: 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
b550: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
b560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b570: 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
b580: 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61 64  dr+2, addr+4, ad
b590: 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43  dr+2);.    VdbeC
b5a0: 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a  overageEqNe(v);.
b5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b5c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
b5d0: 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d  , regNewPart, pM
b5e0: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50  Win->regPart, nP
b5f0: 61 72 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  art-1);.    sqli
b600: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b610: 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c   OP_Gosub, regFl
b620: 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73  ushPart, lblFlus
b630: 68 50 61 72 74 29 3b 0a 20 20 20 20 56 64 62 65  hPart);.    Vdbe
b640: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c  Comment((v, "cal
b650: 6c 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  l flush_partitio
b660: 6e 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n"));.  }..  /* 
b670: 42 75 66 66 65 72 20 74 68 65 20 63 75 72 72 65  Buffer the curre
b680: 6e 74 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70  nt row in the ep
b690: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a  hemeral table. *
b6a0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
b6b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
b6c0: 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  owid, pMWin->iEp
b6d0: 68 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b  hCsr, regRowid);
b6e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
b6f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
b700: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
b710: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65  r, regRecord, re
b720: 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45  gRowid);..  /* E
b730: 6e 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  nd of the input 
b740: 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  loop */.  sqlite
b750: 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
b760: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  );..  /* Invoke 
b770: 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e  "flush_partition
b780: 22 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  " to deal with t
b790: 68 65 20 66 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c  he final (or onl
b7a0: 79 29 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  y) partition */.
b7b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b7c0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
b7d0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
b7e0: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
b7f0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b800: 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72 74  "call flush_part
b810: 69 74 69 6f 6e 22 29 29 3b 0a 7d 0a 0a 2f 2a 0a  ition"));.}../*.
b820: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75  ** Invoke the su
b830: 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 72 65 67  b-routine at reg
b840: 47 6f 73 75 62 20 28 67 65 6e 65 72 61 74 65 64  Gosub (generated
b850: 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65   by code in sele
b860: 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74 75  ct.c) to.** retu
b870: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
b880: 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45 70  ow of Window.iEp
b890: 68 43 73 72 2e 20 49 66 20 61 6c 6c 20 77 69 6e  hCsr. If all win
b8a0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  dow functions ar
b8b0: 65 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 77  e.** aggregate w
b8c0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
b8d0: 74 68 61 74 20 75 73 65 20 74 68 65 20 73 74 61  that use the sta
b8e0: 6e 64 61 72 64 20 41 50 49 2c 20 61 20 73 69 6e  ndard API, a sin
b8f0: 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62 20  gle.** OP_Gosub 
b900: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61  instruction is a
b910: 6c 6c 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ll that this rou
b920: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 2e 20  tine generates. 
b930: 45 78 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a 2a  Extra VM code.**
b940: 20 66 6f 72 20 70 65 72 2d 72 6f 77 20 70 72 6f   for per-row pro
b950: 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20  cessing is only 
b960: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
b970: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c  e following buil
b980: 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20 66  t-in window.** f
b990: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
b9a0: 20 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a 2a    nth_value().**
b9b0: 20 20 20 66 69 72 73 74 5f 76 61 6c 75 65 28 29     first_value()
b9c0: 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20 20  .**   lag().**  
b9d0: 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74 69   lead().*/.stati
b9e0: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74  c void windowRet
b9f0: 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50 61 72  urnOneRow(.  Par
ba00: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 69  se *pParse,.  Wi
ba10: 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20 20 69  ndow *pMWin,.  i
ba20: 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20 20 69  nt regGosub,.  i
ba30: 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a  nt addrGosub.){.
ba40: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
ba50: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
ba60: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
ba70: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
ba80: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
ba90: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
baa0: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
bab0: 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
bac0: 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  nc;.    if( pFun
bad0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
bae0: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 7c 7c 20  lueName.     || 
baf0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
bb00: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  rst_valueName.  
bb10: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63    ){.      int c
bb20: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
bb30: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
bb40: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
bb50: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
bb60: 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65  .      int tmpRe
bb70: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
bb80: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
bb90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bba0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
bbb0: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
bbc0: 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20 20 69  esult);..      i
bbd0: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
bbe0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29  =nth_valueName )
bbf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
bc00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
bc10: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d  P_Column, pMWin-
bc20: 3e 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e  >iEphCsr, pWin->
bc30: 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67  iArgCol+1,tmpReg
bc40: 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
bc50: 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70  wCheckIntValue(p
bc60: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32  Parse, tmpReg, 2
bc70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
bc80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bc90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
bca0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52  Integer, 1, tmpR
bcb0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
bcc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bcd0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
bce0: 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65  tmpReg, pWin->re
bcf0: 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20  gApp, tmpReg);. 
bd00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c  AddOp3(v, OP_Gt,
bd20: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
bd30: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
bd40: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
bd50: 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20  eNeverNull(v);. 
bd60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd70: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
bd80: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 30 2c 20  kRowid, csr, 0, 
bd90: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 56  tmpReg);.      V
bda0: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
bdb0: 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20  Taken(v);.      
bdc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bdd0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
bde0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
bdf0: 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  ol, pWin->regRes
be00: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
be10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
be20: 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20  bel(v, lbl);.   
be30: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
be40: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
be50: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a   tmpReg);.    }.
be60: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75      else if( pFu
be70: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
be80: 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  ame || pFunc->zN
be90: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a  ame==lagName ){.
bea0: 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d        int nArg =
beb0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
bec0: 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
bed0: 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70       int csr = p
bee0: 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20  Win->csrApp;.   
bef0: 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c     int lbl = sql
bf00: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
bf10: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
bf20: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
bf30: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
bf40: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
bf50: 6e 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d  nt iEph = pMWin-
bf60: 3e 69 45 70 68 43 73 72 3b 0a 0a 20 20 20 20 20  >iEphCsr;..     
bf70: 20 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20   if( nArg<3 ){. 
bf80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bf90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
bfa0: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
bfb0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
bfc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
bfd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
bfe0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
bff0: 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  Eph, pWin->iArgC
c000: 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67 52  ol+2, pWin->regR
c010: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
c020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c030: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
c040: 77 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65  wid, iEph, tmpRe
c050: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  g);.      if( nA
c060: 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
c070: 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63  int val = (pFunc
c080: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
c090: 65 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20  e ? 1 : -1);.   
c0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c0b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
c0c0: 49 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c  Imm, tmpReg, val
c0d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
c0e0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
c0f0: 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
c100: 6c 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41 64  leadName ? OP_Ad
c110: 64 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29  d : OP_Subtract)
c120: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d  ;.        int tm
c130: 70 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47  pReg2 = sqlite3G
c140: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
c150: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c160: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c170: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
c180: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31   pWin->iArgCol+1
c190: 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20  , tmpReg2);.    
c1a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c1b0: 64 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70  ddOp3(v, op, tmp
c1c0: 52 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d  Reg2, tmpReg, tm
c1d0: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73  pReg);.        s
c1e0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
c1f0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70  pReg(pParse, tmp
c200: 52 65 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Reg2);.      }..
c210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c220: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
c230: 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62  ekRowid, csr, lb
c240: 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  l, tmpReg);.    
c250: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
c260: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c270: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c280: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
c290: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69  in->iArgCol, pWi
c2a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
c2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c2c0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
c2d0: 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lbl);.      sqli
c2e0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
c2f0: 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  g(pParse, tmpReg
c300: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
c310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c320: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
c330: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
c340: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  b);.}../*.** Inv
c350: 6f 6b 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e  oke the code gen
c360: 65 72 61 74 65 64 20 62 79 20 77 69 6e 64 6f 77  erated by window
c370: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 29 20 61  ReturnOneRow() a
c380: 6e 64 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20  nd, optionally, 
c390: 74 68 65 0a 2a 2a 20 78 49 6e 76 65 72 73 65 28  the.** xInverse(
c3a0: 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  ) function for e
c3b0: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
c3c0: 69 6f 6e 2c 20 66 6f 72 20 6f 6e 65 20 6f 72 20  ion, for one or 
c3d0: 6d 6f 72 65 20 72 6f 77 73 0a 2a 2a 20 66 72 6f  more rows.** fro
c3e0: 6d 20 74 68 65 20 57 69 6e 64 6f 77 2e 69 45 70  m the Window.iEp
c3f0: 68 43 73 72 20 74 65 6d 70 20 74 61 62 6c 65 2e  hCsr temp table.
c400: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
c410: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 0a  nerates VM code.
c420: 2a 2a 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a  ** similar to:.*
c430: 2a 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 72 65  *.**   while( re
c440: 67 43 74 72 3e 30 20 29 7b 0a 2a 2a 20 20 20 20  gCtr>0 ){.**    
c450: 20 72 65 67 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20   regCtr--;.**   
c460: 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e    windowReturnOn
c470: 65 52 6f 77 28 29 0a 2a 2a 20 20 20 20 20 69 66  eRow().**     if
c480: 28 20 62 49 6e 76 65 72 73 65 20 29 7b 0a 2a 2a  ( bInverse ){.**
c490: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
c4a0: 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  e.**     }.**   
c4b0: 20 20 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e 69    Next (Window.i
c4c0: 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a  EphCsr).**   }.*
c4d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
c4e0: 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a  ndowReturnRows(.
c4f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c500: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
c510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c520: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77 69     /* List of wi
c530: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ndow functions *
c540: 2f 0a 20 20 69 6e 74 20 72 65 67 43 74 72 2c 20  /.  int regCtr, 
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c560: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
c570: 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62 65  containing numbe
c580: 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69  r of rows */.  i
c590: 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20  nt regGosub,    
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c5b0: 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 47  * Register for G
c5c0: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 20 2a  osub addrGosub *
c5d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75  /.  int addrGosu
c5e0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
c5f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
c600: 66 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 66 6f  f sub-routine fo
c610: 72 20 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20 2a  r ReturnOneRow *
c620: 2f 0a 20 20 69 6e 74 20 72 65 67 49 6e 76 41 72  /.  int regInvAr
c630: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
c640: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
c650: 72 65 67 69 73 74 65 72 73 20 66 6f 72 20 78 49  registers for xI
c660: 6e 76 65 72 73 65 20 61 72 67 73 20 2a 2f 0a 20  nverse args */. 
c670: 20 69 6e 74 20 72 65 67 49 6e 76 53 69 7a 65 20   int regInvSize 
c680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c690: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e   /* Register con
c6a0: 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20  taining size of 
c6b0: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  partition */.){.
c6c0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64    int addr;.  Vd
c6d0: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
c6e0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
c6f0: 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
c700: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
c710: 30 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  0);.  addr = sql
c720: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c730: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43  , OP_IfPos, regC
c740: 74 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  tr, sqlite3VdbeC
c750: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 20  urrentAddr(v)+2 
c760: 2c 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  ,1);.  VdbeCover
c770: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
c780: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c790: 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20  P_Goto, 0, 0);. 
c7a0: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
c7b0: 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69  Row(pParse, pMWi
c7c0: 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  n, regGosub, add
c7d0: 72 47 6f 73 75 62 29 3b 0a 20 20 69 66 28 20 72  rGosub);.  if( r
c7e0: 65 67 49 6e 76 41 72 67 20 29 7b 0a 20 20 20 20  egInvArg ){.    
c7f0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
c800: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57  arse, pMWin, pMW
c810: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c 20  in->iEphCsr, 1, 
c820: 72 65 67 49 6e 76 41 72 67 2c 20 72 65 67 49 6e  regInvArg, regIn
c830: 76 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71  vSize);.  }.  sq
c840: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c850: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69  v, OP_Next, pMWi
c860: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 61 64 64 72  n->iEphCsr, addr
c870: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
c880: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
c890: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
c8a0: 64 64 72 2b 31 29 3b 20 20 20 2f 2a 20 54 68 65  ddr+1);   /* The
c8b0: 20 4f 50 5f 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f   OP_Goto */.}../
c8c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
c8d0: 64 65 20 74 6f 20 73 65 74 20 74 68 65 20 61 63  de to set the ac
c8e0: 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
c8f0: 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  er for each wind
c900: 6f 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ow function.** i
c910: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
c920: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
c930: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
c940: 74 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72  to NULL. And per
c950: 66 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69  form.** any equi
c960: 76 61 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a  valent initializ
c970: 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
c980: 79 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77  y any built-in w
c990: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a  indow functions.
c9a0: 2a 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ** in the list..
c9b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
c9c0: 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61  ndowInitAccum(Pa
c9d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e  rse *pParse, Win
c9e0: 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56  dow *pMWin){.  V
c9f0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
ca00: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
ca10: 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20  .  int regArg;. 
ca20: 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20   int nArg = 0;. 
ca30: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
ca40: 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
ca50: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
ca60: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
ca70: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
ca80: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
ca90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
caa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
cab0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
cac0: 75 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20  um);.    nArg = 
cad0: 4d 41 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77  MAX(nArg, window
cae0: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b  ArgCount(pWin));
caf0: 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
cb00: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
cb10: 4e 61 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75  Name.     || pFu
cb20: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74  nc->zName==first
cb30: 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 29  _valueName.    )
cb40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
cb50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cb60: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
cb70: 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20  ->regApp);.     
cb80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb90: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
cba0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
cbb0: 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  p+1);.    }..   
cbc0: 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e   if( (pFunc->fun
cbd0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
cbe0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20  FUNC_MINMAX) && 
cbf0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 29 7b 0a  pWin->csrApp ){.
cc00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
cc10: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
cc20: 4e 42 4f 55 4e 44 45 44 20 29 3b 0a 20 20 20 20  NBOUNDED );.    
cc30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cc40: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
cc50: 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72  orter, pWin->csr
cc60: 41 70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  App);.      sqli
cc70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cc80: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
cc90: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b  pWin->regApp+1);
cca0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 67  .    }.  }.  reg
ccb0: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
ccc0: 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e  em+1;.  pParse->
ccd0: 6e 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20 20  nMem += nArg;.  
cce0: 72 65 74 75 72 6e 20 72 65 67 41 72 67 3b 0a 7d  return regArg;.}
ccf0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
cd00: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
cd10: 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74 65 33 57  work of sqlite3W
cd20: 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20  indowCodeStep() 
cd30: 66 6f 72 20 61 6c 6c 20 22 52 4f 57 53 22 0a 2a  for all "ROWS".*
cd40: 2a 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 74  * window frame t
cd50: 79 70 65 73 20 65 78 63 65 70 74 20 66 6f 72 20  ypes except for 
cd60: 22 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44  "BETWEEN UNBOUND
cd70: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
cd80: 20 43 55 52 52 45 4e 54 0a 2a 2a 20 52 4f 57 22   CURRENT.** ROW"
cd90: 2e 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f  . Pseudo-code fo
cda0: 72 20 65 61 63 68 20 66 6f 6c 6c 6f 77 73 2e 0a  r each follows..
cdb0: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
cdc0: 45 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45  EN <expr1> PRECE
cdd0: 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e  DING AND <expr2>
cde0: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
cdf0: 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
ce00: 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74    if( new partit
ce10: 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
ce20: 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61    Gosub flush_pa
ce30: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  rtition.**      
ce40: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65   }.**       Inse
ce50: 72 74 20 28 72 65 63 6f 72 64 20 69 6e 20 65 70  rt (record in ep
ce60: 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20 20 20  h-table).**     
ce70: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
ce80: 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 66  ).**     Gosub f
ce90: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a  lush_partition.*
cea0: 2a 20 20 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70  *  .**   flush_p
ceb0: 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20  artition:.**    
cec0: 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20   Once {.**      
ced0: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
cee0: 72 20 2d 3e 20 63 73 72 53 74 61 72 74 29 0a 2a  r -> csrStart).*
cef0: 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20  *       OpenDup 
cf00: 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 45  (iEphCsr -> csrE
cf10: 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  nd).**     }.** 
cf20: 20 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c      regStart = <
cf30: 65 78 70 72 31 3e 20 20 20 20 20 20 20 20 20 20  expr1>          
cf40: 20 20 20 20 20 20 2f 2f 20 50 52 45 43 45 44 49        // PRECEDI
cf50: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  NG expression.**
cf60: 20 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65       regEnd = <e
cf70: 78 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 20  xpr2>           
cf80: 20 20 20 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57         // FOLLOW
cf90: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ING expression.*
cfa0: 2a 20 20 20 20 20 69 66 28 20 72 65 67 53 74 61  *     if( regSta
cfb0: 72 74 3c 30 20 7c 7c 20 72 65 67 45 6e 64 3c 30  rt<0 || regEnd<0
cfc0: 20 29 7b 20 65 72 72 6f 72 21 20 7d 0a 2a 2a 20   ){ error! }.** 
cfd0: 20 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c      Rewind (csr,
cfe0: 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29  csrStart,csrEnd)
cff0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
d000: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
d010: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
d020: 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20     Next(csrEnd) 
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d040: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 73 6b 69     // if EOF ski
d050: 70 20 41 67 67 73 74 65 70 0a 2a 2a 20 20 20 20  p Aggstep.**    
d060: 20 20 20 41 67 67 73 74 65 70 20 28 63 73 72 45     Aggstep (csrE
d070: 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  nd).**       if(
d080: 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
d090: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
d0a0: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
d0b0: 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
d0c0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
d0d0: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
d0f0: 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75   if EOF goto flu
d100: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
d110: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28  e.**         if(
d120: 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
d130: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   ){.**          
d140: 20 41 67 67 49 6e 76 65 72 73 65 20 28 63 73 72   AggInverse (csr
d150: 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20  Start).**       
d160: 20 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72      Next(csrStar
d170: 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  t).**         }.
d180: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
d190: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
d1a0: 64 6f 6e 65 3a 0a 2a 2a 20 20 20 20 20 52 65 73  done:.**     Res
d1b0: 65 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a  etSorter (csr).*
d1c0: 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a  *     Return.**.
d1d0: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
d1e0: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
d1f0: 20 20 20 20 41 4e 44 20 43 55 52 52 45 4e 54 20      AND CURRENT 
d200: 52 4f 57 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  ROW.** ROWS BETW
d210: 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
d220: 20 20 20 20 20 20 20 20 41 4e 44 20 3c 65 78 70          AND <exp
d230: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20  r> FOLLOWING.** 
d240: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42  ROWS BETWEEN UNB
d250: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
d260: 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c   AND <expr> FOLL
d270: 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68  OWING.**.**   Th
d280: 65 73 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20  ese are similar 
d290: 74 6f 20 74 68 65 20 61 62 6f 76 65 2e 20 46 6f  to the above. Fo
d2a0: 72 20 22 43 55 52 52 45 4e 54 20 52 4f 57 22 2c  r "CURRENT ROW",
d2b0: 20 69 6e 74 69 61 6c 69 7a 65 20 74 68 65 0a 2a   intialize the.*
d2c0: 2a 20 20 20 72 65 67 69 73 74 65 72 20 74 6f 20  *   register to 
d2d0: 30 2e 20 46 6f 72 20 22 55 4e 42 4f 55 4e 44 45  0. For "UNBOUNDE
d2e0: 44 20 50 52 45 43 45 44 49 4e 47 22 20 74 6f 20  D PRECEDING" to 
d2f0: 69 6e 66 69 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20  infinity..**.** 
d300: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78  ROWS BETWEEN <ex
d310: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20  pr> PRECEDING   
d320: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
d330: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53  OLLOWING.** ROWS
d340: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
d350: 20 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44   ROW         AND
d360: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
d370: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  WING.**.**     R
d380: 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74  ewind (csr,csrSt
d390: 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 20 2f  art,csrEnd)    /
d3a0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
d3b0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
d3c0: 6e 65 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28  ne.**     while(
d3d0: 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 4e   1 ){.**       N
d3e0: 65 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20  ext(csrEnd)     
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
d400: 45 78 69 74 20 77 68 69 6c 65 28 31 29 20 61 74  Exit while(1) at
d410: 20 45 4f 46 0a 2a 2a 20 20 20 20 20 20 20 41 67   EOF.**       Ag
d420: 67 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a  gstep (csrEnd).*
d430: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77  *     }.**     w
d440: 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
d450: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
d460: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47  alue).**       G
d470: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
d480: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
d490: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
d4a0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
d4b0: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
d4c0: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
d4d0: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
d4e0: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
d4f0: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20       AggInverse 
d500: 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
d510: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 53 74        Next(csrSt
d520: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  art).**       }.
d530: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20  **     }.**.**  
d540: 20 46 6f 72 20 74 68 65 20 22 43 55 52 52 45 4e   For the "CURREN
d550: 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e  T ROW AND UNBOUN
d560: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63  DED FOLLOWING" c
d570: 61 73 65 2c 20 74 68 65 20 66 69 6e 61 6c 20 69  ase, the final i
d580: 66 28 29 20 0a 2a 2a 20 20 20 63 6f 6e 64 69 74  f() .**   condit
d590: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 74 72  ion is always tr
d5a0: 75 65 20 28 61 73 20 69 66 20 72 65 67 53 74 61  ue (as if regSta
d5b0: 72 74 20 77 65 72 65 20 69 6e 69 74 69 61 6c 69  rt were initiali
d5c0: 7a 65 64 20 74 6f 20 30 29 2e 0a 2a 2a 0a 2a 2a  zed to 0)..**.**
d5d0: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
d5e0: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
d5f0: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
d600: 4e 47 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 69 73  NG.** .**   This
d610: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 52 41 4e   is the only RAN
d620: 47 45 20 63 61 73 65 20 68 61 6e 64 6c 65 64 20  GE case handled 
d630: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
d640: 20 49 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   It modifies the
d650: 0a 2a 2a 20 20 20 73 65 63 6f 6e 64 20 77 68 69  .**   second whi
d660: 6c 65 28 20 31 20 29 20 6c 6f 6f 70 20 69 6e 20  le( 1 ) loop in 
d670: 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55  "ROWS BETWEEN CU
d680: 52 52 45 4e 54 20 2e 2e 2e 20 55 4e 42 4f 55 4e  RRENT ... UNBOUN
d690: 44 45 44 2e 2e 2e 22 20 74 6f 0a 2a 2a 20 20 20  DED..." to.**   
d6a0: 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77 68  be:.**.**     wh
d6b0: 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
d6c0: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
d6d0: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 77 68  lue).**       wh
d6e0: 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
d6f0: 20 20 20 20 20 72 65 67 50 65 65 72 2b 2b 0a 2a       regPeer++.*
d700: 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
d710: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
d720: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
d750: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
d760: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  n_done.**       
d770: 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29    if( new peer )
d780: 20 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20   break;.**      
d790: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c   }.**       whil
d7a0: 65 28 20 28 72 65 67 50 65 65 72 2d 2d 29 3e 30  e( (regPeer--)>0
d7b0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
d7c0: 67 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74  ggInverse (csrSt
d7d0: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  art).**         
d7e0: 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a  Next(csrStart).*
d7f0: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
d800: 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45   }.**.** ROWS BE
d810: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 46 4f 4c  TWEEN <expr> FOL
d820: 4c 4f 57 49 4e 47 20 20 20 20 41 4e 44 20 3c 65  LOWING    AND <e
d830: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  xpr> FOLLOWING.*
d840: 2a 0a 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20  *.**   regEnd = 
d850: 72 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72  regEnd - regStar
d860: 74 0a 2a 2a 20 20 20 52 65 77 69 6e 64 20 28 63  t.**   Rewind (c
d870: 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45  sr,csrStart,csrE
d880: 6e 64 29 20 20 20 2f 2f 20 69 66 20 45 4f 46 20  nd)   // if EOF 
d890: 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69  goto flush_parti
d8a0: 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20  tion_done.**    
d8b0: 20 41 67 67 73 74 65 70 20 28 63 73 72 45 6e 64   Aggstep (csrEnd
d8c0: 29 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73  ).**     Next(cs
d8d0: 72 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20  rEnd)           
d8e0: 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20        // if EOF 
d8f0: 66 61 6c 6c 2d 74 68 72 6f 75 67 68 0a 2a 2a 20  fall-through.** 
d900: 20 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d      if( (regEnd-
d910: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
d920: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
d930: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
d940: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
d950: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20  alue).**        
d960: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
d970: 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74  .**         Next
d980: 28 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20  (csr)           
d990: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
d9a0: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
d9b0: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  n_done.**       
d9c0: 7d 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 49 6e  }.**       AggIn
d9d0: 76 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29  verse (csrStart)
d9e0: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28  .**       Next (
d9f0: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
da00: 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45   }.**.** ROWS BE
da10: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
da20: 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 3c 65  CEDING    AND <e
da30: 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a  xpr> PRECEDING.*
da40: 2a 0a 2a 2a 20 20 20 52 65 70 6c 61 63 65 20 74  *.**   Replace t
da50: 68 65 20 62 69 74 20 61 66 74 65 72 20 22 52 65  he bit after "Re
da60: 77 69 6e 64 22 20 69 6e 20 74 68 65 20 61 62 6f  wind" in the abo
da70: 76 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20  ve with:.**.**  
da80: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
da90: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
daa0: 20 41 67 67 53 74 65 70 20 28 63 73 72 45 6e 64   AggStep (csrEnd
dab0: 29 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20  ).**       Next 
dac0: 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20  (csrEnd).**     
dad0: 7d 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61  }.**     AggFina
dae0: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
daf0: 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
db00: 62 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73  b.**     Next(cs
db10: 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
db20: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
db30: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
db40: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 69  on_done.**     i
db50: 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
db60: 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  =0 ){.**       A
db70: 67 67 49 6e 76 65 72 73 65 20 28 63 73 72 32 29  ggInverse (csr2)
db80: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28  .**       Next (
db90: 63 73 72 32 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a  csr2).**     }.*
dba0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
dbb0: 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78   windowCodeRowEx
dbc0: 70 72 53 74 65 70 28 0a 20 20 50 61 72 73 65 20  prStep(.  Parse 
dbd0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65  *pParse, .  Sele
dbe0: 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e  ct *p,.  WhereIn
dbf0: 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e  fo *pWInfo,.  in
dc00: 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69  t regGosub, .  i
dc10: 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a  nt addrGosub.){.
dc20: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20    Window *pMWin 
dc30: 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62  = p->pWin;.  Vdb
dc40: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
dc50: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
dc60: 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72   int regFlushPar
dc70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
dc80: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
dc90: 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61   "Gosub flush_pa
dca0: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e  rtition" */.  in
dcb0: 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 20  t lblFlushPart; 
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcd0: 20 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75   Label for "Gosu
dce0: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
dcf0: 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46  n" */.  int lblF
dd00: 6c 75 73 68 44 6f 6e 65 3b 20 20 20 20 20 20 20  lushDone;       
dd10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
dd20: 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73   for "Gosub flus
dd30: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
dd40: 22 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 65 67 41  " */..  int regA
dd50: 72 67 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  rg;.  int addr;.
dd60: 20 20 69 6e 74 20 63 73 72 53 74 61 72 74 20 3d    int csrStart =
dd70: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
dd80: 0a 20 20 69 6e 74 20 63 73 72 45 6e 64 20 3d 20  .  int csrEnd = 
dd90: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
dda0: 20 20 69 6e 74 20 72 65 67 53 74 61 72 74 3b 20    int regStart; 
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c     /* Value of <
ddd0: 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
dde0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 3b  */.  int regEnd;
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
de10: 66 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  f <expr> FOLLOWI
de20: 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  NG */.  int addr
de30: 47 6f 74 6f 3b 0a 20 20 69 6e 74 20 61 64 64 72  Goto;.  int addr
de40: 54 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72 49  Top;.  int addrI
de50: 66 50 6f 73 31 20 3d 20 30 3b 0a 20 20 69 6e 74  fPos1 = 0;.  int
de60: 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20 30 3b   addrIfPos2 = 0;
de70: 0a 20 20 69 6e 74 20 72 65 67 53 69 7a 65 20 3d  .  int regSize =
de80: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
de90: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
dea0: 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20 20  _PRECEDING .    
deb0: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
dec0: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
ded0: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
dee0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
def0: 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20 7c  LOWING .       |
df00: 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
df10: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20  =TK_UNBOUNDED . 
df20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
df30: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
df40: 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20  LLOWING .       
df50: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
df60: 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20  TK_CURRENT .    
df70: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e     || pMWin->eEn
df80: 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
df90: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
dfa0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
dfb0: 44 49 4e 47 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a  DING .  );..  /*
dfc0: 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74   Allocate regist
dfd0: 65 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f 72  er and label for
dfe0: 20 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72 74   the "flush_part
dff0: 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74 69  ition" sub-routi
e000: 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75 73  ne. */.  regFlus
e010: 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  hPart = ++pParse
e020: 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75  ->nMem;.  lblFlu
e030: 73 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65 33  shPart = sqlite3
e040: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
e050: 61 72 73 65 29 3b 0a 20 20 6c 62 6c 46 6c 75 73  arse);.  lblFlus
e060: 68 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56  hDone = sqlite3V
e070: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
e080: 72 73 65 29 3b 0a 0a 20 20 72 65 67 53 74 61 72  rse);..  regStar
e090: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
e0a0: 65 6d 3b 0a 20 20 72 65 67 45 6e 64 20 3d 20 2b  em;.  regEnd = +
e0b0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
e0c0: 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f    windowPartitio
e0d0: 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70  nCache(pParse, p
e0e0: 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75  , pWInfo, regFlu
e0f0: 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68  shPart, lblFlush
e100: 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29 3b  Part, &regSize);
e110: 0a 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73  ..  addrGoto = s
e120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
e130: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20  (v, OP_Goto);.. 
e140: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c   /* Start of "fl
e150: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
e160: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
e170: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
e180: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
e190: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e1a0: 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c  2(v, OP_Once, 0,
e1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e1c0: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
e1d0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e1e0: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
e1f0: 28 76 2c 20 22 46 6c 75 73 68 5f 70 61 72 74 69  (v, "Flush_parti
e200: 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 22  tion subroutine"
e210: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
e220: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
e230: 65 6e 44 75 70 2c 20 63 73 72 53 74 61 72 74 2c  enDup, csrStart,
e240: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
e250: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e260: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
e270: 44 75 70 2c 20 63 73 72 45 6e 64 2c 20 70 4d 57  Dup, csrEnd, pMW
e280: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20  in->iEphCsr);.. 
e290: 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 72 65   /* If either re
e2a0: 67 53 74 61 72 74 20 6f 72 20 72 65 67 45 6e 64  gStart or regEnd
e2b0: 20 61 72 65 20 6e 6f 74 20 6e 6f 6e 2d 6e 65 67   are not non-neg
e2c0: 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 2c 20  ative integers, 
e2d0: 74 68 72 6f 77 20 0a 20 20 2a 2a 20 61 6e 20 65  throw .  ** an e
e2e0: 78 63 65 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  xception.  */.  
e2f0: 69 66 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72  if( pMWin->pStar
e300: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
e310: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
e320: 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20   pMWin->pStart, 
e330: 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20 77  regStart);.    w
e340: 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c  indowCheckIntVal
e350: 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74  ue(pParse, regSt
e360: 61 72 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  art, 0);.  }.  i
e370: 66 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 20 29  f( pMWin->pEnd )
e380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
e390: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d  rCode(pParse, pM
e3a0: 57 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e  Win->pEnd, regEn
e3b0: 64 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68  d);.    windowCh
e3c0: 65 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72  eckIntValue(pPar
e3d0: 73 65 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a  se, regEnd, 1);.
e3e0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
e3f0: 73 20 69 73 20 22 52 4f 57 53 20 3c 65 78 70 72  s is "ROWS <expr
e400: 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44  1> FOLLOWING AND
e410: 20 52 4f 57 53 20 3c 65 78 70 72 32 3e 20 46 4f   ROWS <expr2> FO
e420: 4c 4c 4f 57 49 4e 47 22 2c 20 64 6f 3a 0a 20 20  LLOWING", do:.  
e430: 2a 2a 0a 20 20 2a 2a 20 20 20 69 66 28 20 72 65  **.  **   if( re
e440: 67 45 6e 64 3c 72 65 67 53 74 61 72 74 20 29 7b  gEnd<regStart ){
e450: 0a 20 20 2a 2a 20 20 20 20 20 2f 2f 20 54 68 65  .  **     // The
e460: 20 66 72 61 6d 65 20 61 6c 77 61 79 73 20 63 6f   frame always co
e470: 6e 73 69 73 74 73 20 6f 66 20 30 20 72 6f 77 73  nsists of 0 rows
e480: 0a 20 20 2a 2a 20 20 20 20 20 72 65 67 53 74 61  .  **     regSta
e490: 72 74 20 3d 20 72 65 67 53 69 7a 65 3b 0a 20 20  rt = regSize;.  
e4a0: 2a 2a 20 20 20 7d 0a 20 20 2a 2a 20 20 20 72 65  **   }.  **   re
e4b0: 67 45 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d 20  gEnd = regEnd - 
e4c0: 72 65 67 53 74 61 72 74 3b 0a 20 20 2a 2f 0a 20  regStart;.  */. 
e4d0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64   if( pMWin->pEnd
e4e0: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   && pMWin->eStar
e4f0: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
e500: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e510: 4d 57 69 6e 2d 3e 70 53 74 61 72 74 21 3d 30 20  MWin->pStart!=0 
e520: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e530: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46  MWin->eEnd==TK_F
e540: 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20  OLLOWING );.    
e550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e560: 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53  3(v, OP_Ge, regS
e570: 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62  tart, sqlite3Vdb
e580: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e590: 32 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  2, regEnd);.    
e5a0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
e5b0: 72 4e 75 6c 6c 28 76 29 3b 0a 20 20 20 20 73 71  rNull(v);.    sq
e5c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e5d0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
e5e0: 69 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  ize, regStart);.
e5f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e600: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
e610: 72 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20  ract, regStart, 
e620: 72 65 67 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b  regEnd, regEnd);
e630: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69  .  }..  if( pMWi
e640: 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57  n->pStart && pMW
e650: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
e660: 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 73  CEDING ){.    as
e670: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 70 45 6e  sert( pMWin->pEn
e680: 64 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d!=0 );.    asse
e690: 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  rt( pMWin->eStar
e6a0: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
e6b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e6c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c  beAddOp3(v, OP_L
e6d0: 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c  e, regStart, sql
e6e0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e6f0: 64 64 72 28 76 29 2b 33 2c 20 72 65 67 45 6e 64  ddr(v)+3, regEnd
e700: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
e710: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b  ageNeverNull(v);
e720: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e730: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
e740: 79 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53  y, regSize, regS
e750: 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
e760: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e770: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65  OP_Copy, regSize
e780: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a  , regEnd);.  }..
e790: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
e7a0: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
e7b0: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
e7c0: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
e7d0: 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
e7e0: 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
e7f0: 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
e800: 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
e810: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e820: 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e  OP_Rewind, pMWin
e830: 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c 46 6c  ->iEphCsr, lblFl
e840: 75 73 68 44 6f 6e 65 29 3b 0a 20 20 56 64 62 65  ushDone);.  Vdbe
e850: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
e860: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e870: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
e880: 73 72 53 74 61 72 74 2c 20 6c 62 6c 46 6c 75 73  srStart, lblFlus
e890: 68 44 6f 6e 65 29 3b 0a 20 20 56 64 62 65 43 6f  hDone);.  VdbeCo
e8a0: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
e8b0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
e8c0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
e8d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e8e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
e8f0: 6e 64 2c 20 63 73 72 45 6e 64 2c 20 6c 62 6c 46  nd, csrEnd, lblF
e900: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 56 64 62  lushDone);.  Vdb
e910: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61  eCoverageNeverTa
e920: 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  ken(v);.  sqlite
e930: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
e940: 20 31 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b   1);..  /* Invok
e950: 65 20 41 67 67 53 74 65 70 20 66 75 6e 63 74 69  e AggStep functi
e960: 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  on for each wind
e970: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e  ow function usin
e980: 67 20 74 68 65 20 72 6f 77 20 74 68 61 74 0a 20  g the row that. 
e990: 20 2a 2a 20 63 73 72 45 6e 64 20 63 75 72 72 65   ** csrEnd curre
e9a0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20  ntly points to. 
e9b0: 4f 72 2c 20 69 66 20 63 73 72 45 6e 64 20 69 73  Or, if csrEnd is
e9c0: 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46 2c   already at EOF,
e9d0: 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 68 69 6e 67  .  ** do nothing
e9e0: 2e 20 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  .  */.  addrTop 
e9f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
ea00: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
ea10: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
ea20: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
ea30: 20 20 20 20 61 64 64 72 49 66 50 6f 73 31 20 3d      addrIfPos1 =
ea40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ea50: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
ea60: 72 65 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b 0a  regEnd, 0 , 1);.
ea70: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ea80: 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
ea90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
eaa0: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c  OP_Next, csrEnd,
eab0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
eac0: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
ead0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
eae0: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
eaf0: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
eb00: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 77 69 6e 64  OP_Goto);.  wind
eb10: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
eb20: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 45 6e 64 2c  , pMWin, csrEnd,
eb30: 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53   0, regArg, regS
eb40: 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 4d 57 69  ize);.  if( pMWi
eb50: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
eb60: 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  UNDED ){.    sql
eb70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
eb80: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
eb90: 64 72 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69  drTop);.    sqli
eba0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
ebb0: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 61 64  v, addr);.    ad
ebc0: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
ebd0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ebe0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ebf0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
ec00: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
ec10: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
ec20: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
ec30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ec40: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
ec50: 61 64 64 72 49 66 50 6f 73 31 29 3b 0a 20 20 20  addrIfPos1);.   
ec60: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d   }.  }..  if( pM
ec70: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
ec80: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61  LLOWING ){.    a
ec90: 64 64 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69  ddrIfPos1 = sqli
eca0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ecb0: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e   OP_IfPos, regEn
ecc0: 64 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56  d, 0 , 1);.    V
ecd0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ece0: 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d    }.  if( pMWin-
ecf0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
ed00: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64  OWING ){.    add
ed10: 72 49 66 50 6f 73 32 20 3d 20 73 71 6c 69 74 65  rIfPos2 = sqlite
ed20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
ed30: 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72  P_IfPos, regStar
ed40: 74 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56  t, 0 , 1);.    V
ed50: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
ed60: 20 20 7d 0a 20 20 77 69 6e 64 6f 77 41 67 67 46    }.  windowAggF
ed70: 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57  inal(pParse, pMW
ed80: 69 6e 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77  in, 0);.  window
ed90: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61  ReturnOneRow(pPa
eda0: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47  rse, pMWin, regG
edb0: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
edc0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
edd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
ede0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
edf0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
ee00: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a  rentAddr(v)+2);.
ee10: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
ee20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ee30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
ee40: 6f 2c 20 30 2c 20 6c 62 6c 46 6c 75 73 68 44 6f  o, 0, lblFlushDo
ee50: 6e 65 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e  ne);.  if( pMWin
ee60: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  ->eStart==TK_FOL
ee70: 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71  LOWING ){.    sq
ee80: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ee90: 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 32 29  e(v, addrIfPos2)
eea0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57  ;.  }..  if( pMW
eeb0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43  in->eStart==TK_C
eec0: 55 52 52 45 4e 54 20 0a 20 20 20 7c 7c 20 70 4d  URRENT .   || pM
eed0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
eee0: 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20 7c 7c  PRECEDING .   ||
eef0: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
ef00: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20  TK_FOLLOWING .  
ef10: 29 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 53 6b  ){.    int lblSk
ef20: 69 70 49 6e 76 65 72 73 65 20 3d 20 73 71 6c 69  ipInverse = sqli
ef30: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ef40: 28 70 50 61 72 73 65 29 3b 3b 0a 20 20 20 20 69  (pParse);;.    i
ef50: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
ef60: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
ef70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
ef80: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
ef90: 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c  IfPos, regStart,
efa0: 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 2c   lblSkipInverse,
efb0: 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
efc0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
efd0: 7d 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  }.    if( pMWin-
efe0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
eff0: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73  OWING ){.      s
f000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f010: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72  (v, OP_Next, csr
f020: 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64  Start, sqlite3Vd
f030: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f040: 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
f050: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
f060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f070: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
f080: 30 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73  0, lblSkipInvers
f090: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
f0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f0b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f0c0: 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c  t, csrStart, sql
f0d0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f0e0: 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20 20  ddr(v)+1);.     
f0f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 41 6c 77   VdbeCoverageAlw
f100: 61 79 73 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20  aysTaken(v);.   
f110: 20 7d 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67   }.    windowAgg
f120: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
f130: 69 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c  in, csrStart, 1,
f140: 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65   regArg, regSize
f150: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f160: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
f170: 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65  , lblSkipInverse
f180: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  );.  }.  if( pMW
f190: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
f1a0: 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71  LOWING ){.    sq
f1b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f1c0: 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29  e(v, addrIfPos1)
f1d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
f1e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f1f0: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70  Goto, 0, addrTop
f200: 29 3b 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70  );..  /* flush_p
f210: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a  artition_done: *
f220: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
f230: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
f240: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
f250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f260: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
f270: 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ter, pMWin->iEph
f280: 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Csr);.  sqlite3V
f290: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
f2a0: 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68  Return, regFlush
f2b0: 50 61 72 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d  Part);.  VdbeCom
f2c0: 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 66 6c  ment((v, "end fl
f2d0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75  ush_partition su
f2e0: 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 0a 20 20  broutine"));..  
f2f0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
f300: 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75  to skip over flu
f310: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  sh_partition */.
f320: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
f330: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
f340: 6f 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65  o);.}../* .** Re
f350: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
f360: 20 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f   entire partitio
f370: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 63 68  n should be cach
f380: 65 64 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65  ed in the epheme
f390: 72 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 62 65 66  ral.** table bef
f3a0: 6f 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 61  ore processing a
f3b0: 6e 79 20 72 6f 77 73 2e 0a 2a 2f 0a 73 74 61 74  ny rows..*/.stat
f3c0: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43 61 63  ic int windowCac
f3d0: 68 65 50 61 72 74 69 74 69 6f 6e 28 57 69 6e 64  hePartition(Wind
f3e0: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69  ow *pMWin){.  Wi
f3f0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f  ndow *pWin;.  fo
f400: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
f410: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
f420: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75  NextWin){.    Fu
f430: 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70  ncDef *pFunc = p
f440: 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  Win->pFunc;.    
f450: 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63  if( (pFunc->func
f460: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
f470: 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29  UNC_WINDOW_SIZE)
f480: 0a 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d  .     || (pFunc-
f490: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
f4a0: 65 4e 61 6d 65 29 0a 20 20 20 20 20 7c 7c 20 28  eName).     || (
f4b0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
f4c0: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20  rst_valueName). 
f4d0: 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a      || (pFunc->z
f4e0: 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a  Name==leadName).
f4f0: 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
f500: 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a  zName==lagName).
f510: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
f520: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
f530: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f540: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
f550: 69 6e 64 6f 77 43 6f 64 65 41 72 67 20 57 69 6e  indowCodeArg Win
f560: 64 6f 77 43 6f 64 65 41 72 67 3b 0a 73 74 72 75  dowCodeArg;.stru
f570: 63 74 20 57 69 6e 64 6f 77 43 6f 64 65 41 72 67  ct WindowCodeArg
f580: 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
f590: 73 65 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  se;.  Window *pM
f5a0: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 70 56 64  Win;.  Vdbe *pVd
f5b0: 62 65 3b 0a 20 20 69 6e 74 20 72 65 67 47 6f 73  be;.  int regGos
f5c0: 75 62 3b 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  ub;.  int addrGo
f5d0: 73 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 41 72  sub;.  int regAr
f5e0: 67 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 57  g;.};..#define W
f5f0: 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
f600: 20 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f   1.#define WINDO
f610: 57 5f 41 47 47 49 4e 56 45 52 53 45 20 32 0a 23  W_AGGINVERSE 2.#
f620: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 5f 41 47  define WINDOW_AG
f630: 47 53 54 45 50 20 20 20 20 33 0a 0a 73 74 61 74  GSTEP    3..stat
f640: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 43 6f 64  ic int windowCod
f650: 65 4f 70 28 0a 20 57 69 6e 64 6f 77 43 6f 64 65  eOp(. WindowCode
f660: 41 72 67 20 2a 70 2c 0a 20 69 6e 74 20 6f 70 2c  Arg *p,. int op,
f670: 0a 20 69 6e 74 20 63 73 72 2c 0a 20 69 6e 74 20  . int csr,. int 
f680: 72 65 67 43 6f 75 6e 74 64 6f 77 6e 2c 0a 20 69  regCountdown,. i
f690: 6e 74 20 6a 75 6d 70 4f 6e 45 6f 66 0a 29 7b 0a  nt jumpOnEof.){.
f6a0: 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 20    int ret = 0;. 
f6b0: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 70 56   Vdbe *v = p->pV
f6c0: 64 62 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 49  dbe;.  int addrI
f6d0: 66 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20 72  f = 0; ..  if( r
f6e0: 65 67 43 6f 75 6e 74 64 6f 77 6e 3e 30 20 29 7b  egCountdown>0 ){
f6f0: 0a 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71  .    addrIf = sq
f700: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f710: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
f720: 43 6f 75 6e 74 64 6f 77 6e 2c 20 30 2c 20 31 29  Countdown, 0, 1)
f730: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6a 75 6d  ;.  }..  if( jum
f740: 70 4f 6e 45 6f 66 20 29 7b 0a 20 20 20 20 73 71  pOnEof ){.    sq
f750: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f760: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 2c  v, OP_Next, csr,
f770: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
f780: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
f790: 20 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33     ret = sqlite3
f7a0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
f7b0: 5f 47 6f 74 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  _Goto);.  }else{
f7c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f7d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
f7e0: 74 2c 20 63 73 72 2c 20 73 71 6c 69 74 65 33 56  t, csr, sqlite3V
f7f0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
f800: 29 2b 31 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  )+1);.  }..  swi
f810: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
f820: 61 73 65 20 57 49 4e 44 4f 57 5f 52 45 54 55 52  ase WINDOW_RETUR
f830: 4e 5f 52 4f 57 3a 0a 20 20 20 20 20 20 77 69 6e  N_ROW:.      win
f840: 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 2d 3e 70  dowAggFinal(p->p
f850: 50 61 72 73 65 2c 20 70 2d 3e 70 4d 57 69 6e 2c  Parse, p->pMWin,
f860: 20 30 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f   0);.      windo
f870: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 2d  wReturnOneRow(p-
f880: 3e 70 50 61 72 73 65 2c 20 70 2d 3e 70 4d 57 69  >pParse, p->pMWi
f890: 6e 2c 20 70 2d 3e 72 65 67 47 6f 73 75 62 2c 20  n, p->regGosub, 
f8a0: 70 2d 3e 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  p->addrGosub);. 
f8b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
f8c0: 20 63 61 73 65 20 57 49 4e 44 4f 57 5f 41 47 47   case WINDOW_AGG
f8d0: 49 4e 56 45 52 53 45 3a 0a 20 20 20 20 20 20 77  INVERSE:.      w
f8e0: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 2d 3e  indowAggStep(p->
f8f0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4d 57 69 6e  pParse, p->pMWin
f900: 2c 20 63 73 72 2c 20 31 2c 20 70 2d 3e 72 65 67  , csr, 1, p->reg
f910: 41 72 67 2c 20 70 2d 3e 70 4d 57 69 6e 2d 3e 72  Arg, p->pMWin->r
f920: 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 62  egSize);.      b
f930: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
f940: 57 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 3a 0a  WINDOW_AGGSTEP:.
f950: 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53        windowAggS
f960: 74 65 70 28 70 2d 3e 70 50 61 72 73 65 2c 20 70  tep(p->pParse, p
f970: 2d 3e 70 4d 57 69 6e 2c 20 63 73 72 2c 20 30 2c  ->pMWin, csr, 0,
f980: 20 70 2d 3e 72 65 67 41 72 67 2c 20 70 2d 3e 70   p->regArg, p->p
f990: 4d 57 69 6e 2d 3e 72 65 67 53 69 7a 65 29 3b 0a  MWin->regSize);.
f9a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
f9b0: 0a 0a 20 20 69 66 28 20 72 65 74 20 29 7b 0a 20  ..  if( ret ){. 
f9c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
f9d0: 6d 70 48 65 72 65 28 76 2c 20 72 65 74 29 3b 0a  mpHere(v, ret);.
f9e0: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 43 6f 75    }.  if( regCou
f9f0: 6e 74 64 6f 77 6e 3e 30 20 29 7b 0a 20 20 20 20  ntdown>0 ){.    
fa00: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
fa10: 65 72 65 28 76 2c 20 61 64 64 72 49 66 29 3b 0a  ere(v, addrIf);.
fa20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
fa30: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
fa40: 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e  s function - win
fa50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 2d 20  dowCodeStep() - 
fa60: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 56 4d  generates the VM
fa70: 20 63 6f 64 65 20 74 68 61 74 20 72 65 61 64 73   code that reads
fa80: 20 64 61 74 61 0a 2a 2a 20 66 72 6f 6d 20 74 68   data.** from th
fa90: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 61 6e 64  e sub-select and
faa0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 74 6f   returns rows to
fab0: 20 74 68 65 20 63 6f 6e 73 75 6d 65 72 2e 20 46   the consumer. F
fac0: 6f 72 20 74 68 65 20 73 69 6d 70 6c 65 73 74 0a  or the simplest.
fad0: 2a 2a 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  ** case:.**.**  
fae0: 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20     ROWS BETWEEN 
faf0: 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44 49 4e  <expr1> PRECEDIN
fb00: 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f  G AND <expr2> FO
fb10: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 68  LLOWING.**.** Th
fb20: 65 20 56 4d 20 63 6f 64 65 20 67 65 6e 65 72 61  e VM code genera
fb30: 74 65 64 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ted is equivalen
fb40: 74 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 74  t in spirit to t
fb50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
fb60: 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 21  .**     while( !
fb70: 65 6f 66 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  eof ){.**       
fb80: 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
fb90: 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
fba0: 47 6f 73 75 62 20 66 6c 75 73 68 0a 2a 2a 20 20  Gosub flush.**  
fbb0: 20 20 20 20 20 7d 20 20 20 20 0a 2a 2a 20 20 20       }    .**   
fbc0: 20 20 20 20 49 6e 73 65 72 74 20 6e 65 77 20 72      Insert new r
fbd0: 6f 77 20 69 6e 74 6f 20 65 70 68 20 74 61 62 6c  ow into eph tabl
fbe0: 65 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20  e..**     .**   
fbf0: 20 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f      if( first ro
fc00: 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29  w of partition )
fc10: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77  {.**         Rew
fc20: 69 6e 64 28 63 73 72 45 6e 64 2c 20 73 6b 69 70  ind(csrEnd, skip
fc30: 4e 65 78 74 3d 31 29 0a 2a 2a 20 20 20 20 20 20  Next=1).**      
fc40: 20 20 20 52 65 77 69 6e 64 28 63 73 72 53 74 61     Rewind(csrSta
fc50: 72 74 2c 20 73 6b 69 70 4e 65 78 74 3d 31 29 0a  rt, skipNext=1).
fc60: 2a 2a 20 20 20 20 20 20 20 20 20 52 65 77 69 6e  **         Rewin
fc70: 64 28 63 73 72 43 75 72 72 65 6e 74 2c 20 73 6b  d(csrCurrent, sk
fc80: 69 70 4e 65 78 74 3d 31 29 0a 2a 2a 20 20 20 20  ipNext=1).**    
fc90: 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67   .**         reg
fca0: 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 20 20 20  End = <expr2>   
fcb0: 20 20 20 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57         // FOLLOW
fcc0: 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ING expression.*
fcd0: 2a 20 20 20 20 20 20 20 20 20 72 65 67 53 74 61  *         regSta
fce0: 72 74 20 3d 20 3c 65 78 70 72 31 3e 20 20 20 20  rt = <expr1>    
fcf0: 20 20 20 20 2f 2f 20 50 52 45 43 45 44 49 4e 47      // PRECEDING
fd00: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20   expression.**  
fd10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20       }else{.**  
fd20: 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45         if( (regE
fd30: 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  nd--)<=0 ){.**  
fd40: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
fd50: 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20 20  rCurrent).**    
fd60: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 6f 6e         Return on
fd70: 65 20 72 6f 77 2e 0a 2a 2a 20 20 20 20 20 20 20  e row..**       
fd80: 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
fd90: 74 2d 2d 29 3c 30 20 29 7b 0a 2a 2a 20 20 20 20  t--)<0 ){.**    
fda0: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
fdb0: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
fdc0: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
fdd0: 65 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20  e(csrStart).**  
fde0: 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
fdf0: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
fe00: 20 7d 20 20 20 20 0a 2a 2a 20 20 20 20 20 0a 2a   }    .**     .*
fe10: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
fe20: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20 41 67  End).**       Ag
fe30: 67 53 74 65 70 28 63 73 72 45 6e 64 29 0a 2a 2a  gStep(csrEnd).**
fe40: 20 20 20 20 20 7d 20 20 20 20 0a 2a 2a 20 20 20       }    .**   
fe50: 20 20 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20    flush:.**     
fe60: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 20 0a 2a    while( 1 ){ .*
fe70: 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63  *         Next(c
fe80: 73 72 43 75 72 72 65 6e 74 29 0a 2a 2a 20 20 20  srCurrent).**   
fe90: 20 20 20 20 20 20 69 66 28 20 65 6f 66 20 29 20        if( eof ) 
fea0: 62 72 65 61 6b 0a 2a 2a 20 20 20 20 20 20 20 20  break.**        
feb0: 20 52 65 74 75 72 6e 20 6f 6e 65 20 72 6f 77 2e   Return one row.
fec0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
fed0: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 30 20 29  (regStart--)<0 )
fee0: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  {.**           N
fef0: 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
ff00: 20 20 20 20 20 20 20 20 20 20 20 41 67 67 49 6e             AggIn
ff10: 76 65 72 73 65 28 63 73 72 53 74 61 72 74 29 0a  verse(csrStart).
ff20: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
ff30: 20 20 20 20 20 20 7d 20 20 20 20 0a 2a 2a 20 20        }    .**  
ff40: 20 20 20 20 20 45 6d 70 74 79 20 65 70 68 20 74       Empty eph t
ff50: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  able..**.** More
ff60: 20 67 65 6e 65 72 61 6c 6c 79 2c 20 74 68 65 20   generally, the 
ff70: 70 61 74 74 65 72 6e 20 75 73 65 64 20 66 6f 72  pattern used for
ff80: 20 61 6c 6c 20 77 69 6e 64 6f 77 20 74 79 70 65   all window type
ff90: 73 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  s is:.**.**     
ffa0: 77 68 69 6c 65 28 20 21 65 6f 66 20 29 7b 0a 2a  while( !eof ){.*
ffb0: 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
ffc0: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
ffd0: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
ffe0: 75 73 68 0a 2a 2a 20 20 20 20 20 20 20 7d 20 20  ush.**       }  
fff0: 20 20 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65    .**       Inse
10000 72 74 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20  rt new row into 
10010 65 70 68 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  eph table..**   
10020 20 20 20 20 69 66 28 20 66 69 72 73 74 20 72 6f      if( first ro
10030 77 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 29  w of partition )
10040 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 46 49 52  {.**         FIR
10050 53 54 5f 52 4f 57 5f 43 4f 44 45 0a 2a 2a 20 20  ST_ROW_CODE.**  
10060 20 20 20 20 20 7d 65 6c 73 65 7b 0a 2a 2a 20 20       }else{.**  
10070 20 20 20 20 20 20 20 53 45 43 4f 4e 44 5f 52 4f         SECOND_RO
10080 57 5f 43 4f 44 45 0a 2a 2a 20 20 20 20 20 20 20  W_CODE.**       
10090 7d 20 20 20 20 0a 2a 2a 20 20 20 20 20 20 20 41  }    .**       A
100a0 4c 4c 5f 52 4f 57 5f 43 4f 44 45 0a 2a 2a 20 20  LL_ROW_CODE.**  
100b0 20 20 20 7d 20 20 20 20 0a 2a 2a 20 20 20 20 20     }    .**     
100c0 66 6c 75 73 68 3a 0a 2a 2a 20 20 20 20 20 20 20  flush:.**       
100d0 46 4c 55 53 48 5f 43 4f 44 45 0a 2a 2a 20 20 20  FLUSH_CODE.**   
100e0 20 20 20 20 45 6d 70 74 79 20 65 70 68 20 74 61      Empty eph ta
100f0 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ble..**.*/.stati
10100 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64  c void windowCod
10110 65 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a  eStep(.  Parse *
10120 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63  pParse, .  Selec
10130 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66  t *p,.  WhereInf
10140 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74  o *pWInfo,.  int
10150 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e   regGosub, .  in
10160 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20  t addrGosub.){. 
10170 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
10180 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65   p->pWin;.  Vdbe
10190 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
101a0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
101b0 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74  int regFlushPart
101c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
101d0 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
101e0 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72  "Gosub flush_par
101f0 74 69 74 69 6f 6e 22 20 2a 2f 0a 0a 20 20 69 6e  tition" */..  in
10200 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20  t regArg;.  int 
10210 63 73 72 43 75 72 72 65 6e 74 20 3d 20 70 4d 57  csrCurrent = pMW
10220 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20 69  in->iEphCsr;.  i
10230 6e 74 20 63 73 72 57 72 69 74 65 20 3d 20 63 73  nt csrWrite = cs
10240 72 43 75 72 72 65 6e 74 2b 31 3b 0a 20 20 69 6e  rCurrent+1;.  in
10250 74 20 63 73 72 53 74 61 72 74 20 3d 20 63 73 72  t csrStart = csr
10260 43 75 72 72 65 6e 74 2b 32 3b 0a 20 20 69 6e 74  Current+2;.  int
10270 20 63 73 72 45 6e 64 20 3d 20 63 73 72 43 75 72   csrEnd = csrCur
10280 72 65 6e 74 2b 33 3b 0a 0a 20 20 69 6e 74 20 72  rent+3;..  int r
10290 65 67 53 74 61 72 74 3b 20 20 20 20 20 20 20 20  egStart;        
102a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
102b0 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 50  alue of <expr> P
102c0 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e  RECEDING */.  in
102d0 74 20 72 65 67 45 6e 64 3b 20 20 20 20 20 20 20  t regEnd;       
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
102f0 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
10300 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 0a  > FOLLOWING */..
10310 20 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20    int iSubCsr = 
10320 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  p->pSrc->a[0].iC
10330 75 72 73 6f 72 3b 20 20 20 20 20 20 2f 2a 20 43  ursor;      /* C
10340 75 72 73 6f 72 20 6f 66 20 73 75 62 2d 73 65 6c  ursor of sub-sel
10350 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  ect */.  int nSu
10360 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
10370 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 20 20  ].pTab->nCol;   
10380 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10390 63 6f 6c 73 20 72 65 74 75 72 6e 65 64 20 62 79  cols returned by
103a0 20 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 43   sub */.  int iC
103b0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74      /* To iterat
103e0 65 20 74 68 72 6f 75 67 68 20 73 75 62 20 63 6f  e through sub co
103f0 6c 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 61 64 64  ls */..  int add
10400 72 47 6f 74 6f 3b 0a 20 20 69 6e 74 20 61 64 64  rGoto;.  int add
10410 72 49 66 3b 0a 20 20 69 6e 74 20 61 64 64 72 47  rIf;.  int addrG
10420 6f 73 75 62 46 6c 75 73 68 3b 0a 20 20 69 6e 74  osubFlush;.  int
10430 20 61 64 64 72 49 6e 74 65 67 65 72 3b 0a 20 20   addrInteger;.  
10440 69 6e 74 20 61 64 64 72 43 61 63 68 65 52 65 77  int addrCacheRew
10450 69 6e 64 3b 0a 20 20 69 6e 74 20 61 64 64 72 43  ind;.  int addrC
10460 61 63 68 65 4e 65 78 74 3b 0a 0a 20 20 69 6e 74  acheNext;..  int
10470 20 61 64 64 72 53 68 6f 72 74 63 75 74 20 3d 20   addrShortcut = 
10480 30 3b 0a 0a 20 20 69 6e 74 20 62 43 61 63 68 65  0;..  int bCache
10490 20 3d 20 77 69 6e 64 6f 77 43 61 63 68 65 50 61   = windowCachePa
104a0 72 74 69 74 69 6f 6e 28 70 4d 57 69 6e 29 3b 0a  rtition(pMWin);.
104b0 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61  .  int reg = pPa
104c0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69  rse->nMem+1;.  i
104d0 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72  nt regRecord = r
104e0 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72  eg+nSub;.  int r
104f0 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63  egRowid = regRec
10500 6f 72 64 2b 31 3b 0a 20 20 57 69 6e 64 6f 77 43  ord+1;.  WindowC
10510 6f 64 65 41 72 67 20 73 3b 0a 0a 20 20 6d 65 6d  odeArg s;..  mem
10520 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f  set(&s, 0, sizeo
10530 66 28 57 69 6e 64 6f 77 43 6f 64 65 41 72 67 29  f(WindowCodeArg)
10540 29 3b 0a 20 20 73 2e 70 50 61 72 73 65 20 3d 20  );.  s.pParse = 
10550 70 50 61 72 73 65 3b 0a 20 20 73 2e 70 4d 57 69  pParse;.  s.pMWi
10560 6e 20 3d 20 70 4d 57 69 6e 3b 0a 20 20 73 2e 70  n = pMWin;.  s.p
10570 56 64 62 65 20 3d 20 76 3b 0a 20 20 73 2e 72 65  Vdbe = v;.  s.re
10580 67 47 6f 73 75 62 20 3d 20 72 65 67 47 6f 73 75  gGosub = regGosu
10590 62 3b 0a 20 20 73 2e 61 64 64 72 47 6f 73 75 62  b;.  s.addrGosub
105a0 20 3d 20 61 64 64 72 47 6f 73 75 62 3b 0a 0a 20   = addrGosub;.. 
105b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
105c0 20 31 20 2b 20 6e 53 75 62 20 2b 20 31 3b 0a 0a   1 + nSub + 1;..
105d0 20 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d    regFlushPart =
105e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
105f0 0a 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b  .  regStart = ++
10600 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10610 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73  regEnd = ++pPars
10620 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 61 73 73 65  e->nMem;..  asse
10630 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  rt( pMWin->eStar
10640 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
10650 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
10660 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
10670 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20  RENT .       || 
10680 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
10690 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20  K_FOLLOWING .   
106a0 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53      || pMWin->eS
106b0 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
106c0 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ED .  );.  asser
106d0 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  t( pMWin->eEnd==
106e0 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20  TK_FOLLOWING .  
106f0 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
10700 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  End==TK_CURRENT 
10710 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
10720 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
10730 4e 44 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  NDED .       || 
10740 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
10750 50 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a  PRECEDING .  );.
10760 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
10770 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f  column values fo
10780 72 20 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e  r the row return
10790 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 73 65  ed by the sub-se
107a0 6c 65 63 74 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  lect.  ** into a
107b0 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
107c0 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74  ters starting at
107d0 20 72 65 67 2e 20 41 73 73 65 6d 62 6c 65 20 74   reg. Assemble t
107e0 68 65 6d 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  hem into.  ** a 
107f0 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
10800 65 72 20 72 65 67 52 65 63 6f 72 64 2e 20 54 4f  er regRecord. TO
10810 44 4f 3a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74  DO: An optimizat
10820 69 6f 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20 66  ion here? */.  f
10830 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
10840 6e 53 75 62 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nSub; iCol++){. 
10850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10860 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
10870 6e 2c 20 69 53 75 62 43 73 72 2c 20 69 43 6f 6c  n, iSubCsr, iCol
10880 2c 20 72 65 67 2b 69 43 6f 6c 29 3b 0a 20 20 7d  , reg+iCol);.  }
10890 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
108a0 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
108b0 65 63 6f 72 64 2c 20 72 65 67 2c 20 6e 53 75 62  ecord, reg, nSub
108c0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a 20  , regRecord);.. 
108d0 20 2f 2a 20 41 6e 20 69 6e 70 75 74 20 72 6f 77   /* An input row
108e0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
108f0 65 61 64 20 69 6e 74 6f 20 61 6e 20 61 72 72 61  ead into an arra
10900 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 73  y of registers s
10910 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
10920 72 65 67 2e 20 49 66 20 74 68 65 20 77 69 6e 64  reg. If the wind
10930 6f 77 20 68 61 73 20 61 20 50 41 52 54 49 54 49  ow has a PARTITI
10940 4f 4e 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20  ON clause, this 
10950 62 6c 6f 63 6b 20 67 65 6e 65 72 61 74 65 73 20  block generates 
10960 0a 20 20 2a 2a 20 56 4d 20 63 6f 64 65 20 74 6f  .  ** VM code to
10970 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 69 6e   check if the in
10980 70 75 74 20 72 6f 77 20 69 73 20 74 68 65 20 73  put row is the s
10990 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70 61  tart of a new pa
109a0 72 74 69 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 66  rtition..  ** If
109b0 20 73 6f 2c 20 69 74 20 64 6f 65 73 20 61 6e 20   so, it does an 
109c0 4f 50 5f 47 6f 73 75 62 20 74 6f 20 61 6e 20 61  OP_Gosub to an a
109d0 64 64 72 65 73 73 20 74 6f 20 62 65 20 66 69 6c  ddress to be fil
109e0 6c 65 64 20 69 6e 20 6c 61 74 65 72 2e 20 54 68  led in later. Th
109f0 65 0a 20 20 2a 2a 20 61 64 64 72 65 73 73 20 6f  e.  ** address o
10a00 66 20 74 68 65 20 4f 50 5f 47 6f 73 75 62 20 69  f the OP_Gosub i
10a10 73 20 73 74 6f 72 65 64 20 69 6e 20 6c 6f 63 61  s stored in loca
10a20 6c 20 76 61 72 69 61 62 6c 65 20 61 64 64 72 47  l variable addrG
10a30 6f 73 75 62 46 6c 75 73 68 2e 0a 20 20 2a 2f 0a  osubFlush..  */.
10a40 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61    if( pMWin->pPa
10a50 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  rtition ){.    i
10a60 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78 70  nt addr;.    Exp
10a70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70  rList *pPart = p
10a80 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e  MWin->pPartition
10a90 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20  ;.    int nPart 
10aa0 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b 0a  = pPart->nExpr;.
10ab0 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61      int regNewPa
10ac0 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e  rt = reg + pMWin
10ad0 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20  ->nBufferCol;.  
10ae0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
10af0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
10b00 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
10b10 28 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20  (pParse, pPart, 
10b20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61 64 64 72  0, 0);..    addr
10b30 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  If = sqlite3Vdbe
10b40 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
10b50 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73 74   pMWin->regFirst
10b60 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
10b70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
10b80 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
10b90 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e  egNewPart, pMWin
10ba0 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74  ->regPart, nPart
10bb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10bc0 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
10bd0 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
10be0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
10bf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10c00 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
10c10 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61 64  dr+2, addr+4, ad
10c20 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43  dr+2);.    VdbeC
10c30 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a  overageEqNe(v);.
10c40 20 20 20 20 61 64 64 72 47 6f 73 75 62 46 6c 75      addrGosubFlu
10c50 73 68 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  sh = sqlite3Vdbe
10c60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47 6f 73  AddOp1(v, OP_Gos
10c70 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  ub, regFlushPart
10c80 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
10c90 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75  nt((v, "call flu
10ca0 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29 29 3b  sh_partition"));
10cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10cc0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10cd0 49 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  If);.    sqlite3
10ce0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10cf0 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 61 72  _Copy, regNewPar
10d00 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72  t, pMWin->regPar
10d10 74 2c 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d  t, nPart-1);.  }
10d20 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  ..  /* Insert th
10d30 65 20 6e 65 77 20 72 6f 77 20 69 6e 74 6f 20 74  e new row into t
10d40 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
10d50 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  le */.  sqlite3V
10d60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10d70 4e 65 77 52 6f 77 69 64 2c 20 63 73 72 57 72 69  NewRowid, csrWri
10d80 74 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  te, regRowid);. 
10d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10da0 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
10db0 20 63 73 72 57 72 69 74 65 2c 20 72 65 67 52 65   csrWrite, regRe
10dc0 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b  cord, regRowid);
10dd0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10de0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
10df0 6d 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 69 7a  m, pMWin->regSiz
10e00 65 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 62 43  e, 1);..  if( bC
10e10 61 63 68 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  ache ){.    sqli
10e20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10e30 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
10e40 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73 74 29  pMWin->regFirst)
10e50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  ;.    sqlite3Whe
10e60 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
10e70 20 20 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d     addrInteger =
10e80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e90 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
10ea0 2c 20 30 2c 20 72 65 67 46 6c 75 73 68 50 61 72  , 0, regFlushPar
10eb0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  t);.    if( pMWi
10ec0 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b  n->pPartition ){
10ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10ee0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10ef0 64 72 47 6f 73 75 62 46 6c 75 73 68 29 3b 0a 20  drGosubFlush);. 
10f00 20 20 20 7d 0a 20 20 20 20 61 64 64 72 43 61 63     }.    addrCac
10f10 68 65 52 65 77 69 6e 64 20 3d 20 73 71 6c 69 74  heRewind = sqlit
10f20 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10f30 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 57 72  OP_Rewind, csrWr
10f40 69 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ite);.  }else{. 
10f50 20 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c 69     addrIf = sqli
10f60 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10f70 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 4d 57 69 6e   OP_IfNot, pMWin
10f80 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 7d  ->regFirst);.  }
10f90 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63  ..  /* This bloc
10fa0 6b 20 69 73 20 72 75 6e 20 66 6f 72 20 74 68 65  k is run for the
10fb0 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 65 61   first row of ea
10fc0 63 68 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  ch partition */.
10fd0 20 20 73 2e 72 65 67 41 72 67 20 3d 20 72 65 67    s.regArg = reg
10fe0 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74  Arg = windowInit
10ff0 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d  Accum(pParse, pM
11000 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Win);..  sqlite3
11010 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11020 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20   pMWin->pStart, 
11030 72 65 67 53 74 61 72 74 29 3b 0a 20 20 77 69 6e  regStart);.  win
11040 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65  dowCheckIntValue
11050 28 70 50 61 72 73 65 2c 20 72 65 67 53 74 61 72  (pParse, regStar
11060 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  t, 0);.  sqlite3
11070 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11080 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20 72 65   pMWin->pEnd, re
11090 67 45 6e 64 29 3b 0a 20 20 77 69 6e 64 6f 77 43  gEnd);.  windowC
110a0 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61  heckIntValue(pPa
110b0 72 73 65 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b  rse, regEnd, 1);
110c0 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ..  if( pMWin->e
110d0 53 74 61 72 74 3d 3d 70 4d 57 69 6e 2d 3e 65 45  Start==pMWin->eE
110e0 6e 64 20 0a 20 20 20 26 26 20 70 4d 57 69 6e 2d  nd .   && pMWin-
110f0 3e 65 53 74 61 72 74 21 3d 54 4b 5f 43 55 52 52  >eStart!=TK_CURR
11100 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53  ENT && pMWin->eS
11110 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
11120 45 44 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  ED .  ){.    int
11130 20 6f 70 20 3d 20 28 28 70 4d 57 69 6e 2d 3e 65   op = ((pMWin->e
11140 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
11150 49 4e 47 29 20 3f 20 4f 50 5f 47 65 20 3a 20 4f  ING) ? OP_Ge : O
11160 50 5f 4c 65 29 3b 0a 20 20 20 20 69 6e 74 20 61  P_Le);.    int a
11170 64 64 72 47 65 20 3d 20 73 71 6c 69 74 65 33 56  ddrGe = sqlite3V
11180 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
11190 20 72 65 67 53 74 61 72 74 2c 20 30 2c 20 72 65   regStart, 0, re
111a0 67 45 6e 64 29 3b 0a 20 20 20 20 77 69 6e 64 6f  gEnd);.    windo
111b0 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
111c0 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 20  , pMWin, 0);.   
111d0 20 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20   if( bCache ){. 
111e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
111f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
11200 69 64 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65  id, csrWrite, re
11210 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
11220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11230 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
11240 2c 20 63 73 72 43 75 72 72 65 6e 74 2c 20 30 2c  , csrCurrent, 0,
11250 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
11260 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e    windowReturnOn
11270 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57  eRow(pParse, pMW
11280 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  in, regGosub, ad
11290 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20  drGosub);.      
112a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
112b0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
112c0 72 57 72 69 74 65 2c 20 61 64 64 72 43 61 63 68  rWrite, addrCach
112d0 65 52 65 77 69 6e 64 2b 31 29 3b 0a 20 20 20 20  eRewind+1);.    
112e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
112f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11300 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72  , OP_Rewind, csr
11310 43 75 72 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20  Current, 1);.   
11320 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f     windowReturnO
11330 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d  neRow(pParse, pM
11340 57 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  Win, regGosub, a
11350 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20  ddrGosub);.     
11360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11370 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
11380 72 74 65 72 2c 20 63 73 72 43 75 72 72 65 6e 74  rter, csrCurrent
11390 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64  );.    }.    add
113a0 72 53 68 6f 72 74 63 75 74 20 3d 20 73 71 6c 69  rShortcut = sqli
113b0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
113c0 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73   OP_Goto);.    s
113d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
113e0 72 65 28 76 2c 20 61 64 64 72 47 65 29 3b 0a 20  re(v, addrGe);. 
113f0 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
11400 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
11410 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c 69  WING ){.    sqli
11420 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11430 20 4f 50 5f 53 75 62 74 72 61 63 74 2c 20 72 65   OP_Subtract, re
11440 67 53 74 61 72 74 2c 20 72 65 67 45 6e 64 2c 20  gStart, regEnd, 
11450 72 65 67 53 74 61 72 74 29 3b 0a 20 20 7d 0a 0a  regStart);.  }..
11460 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11470 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
11480 2c 20 63 73 72 53 74 61 72 74 2c 20 31 29 3b 20  , csrStart, 1); 
11490 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
114a0 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 73  ngeP5(v, 1);.  s
114b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
114c0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
114d0 73 72 43 75 72 72 65 6e 74 2c 20 31 29 3b 20 73  srCurrent, 1); s
114e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
114f0 50 35 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c 69  P5(v, 1);.  sqli
11500 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11510 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 45   OP_Rewind, csrE
11520 6e 64 2c 20 31 29 3b 20 73 71 6c 69 74 65 33 56  nd, 1); sqlite3V
11530 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
11540 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62  );..  sqlite3Vdb
11550 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11560 74 65 67 65 72 2c 20 30 2c 20 70 4d 57 69 6e 2d  teger, 0, pMWin-
11570 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 61 64  >regFirst);.  ad
11580 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
11590 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
115a0 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 42 65  _Goto);..  /* Be
115b0 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 53  gin generating S
115c0 45 43 4f 4e 44 5f 52 4f 57 5f 43 4f 44 45 20 2a  ECOND_ROW_CODE *
115d0 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
115e0 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70  mment((pParse->p
115f0 56 64 62 65 2c 20 22 42 65 67 69 6e 20 77 69 6e  Vdbe, "Begin win
11600 64 6f 77 43 6f 64 65 53 74 65 70 2e 53 45 43 4f  dowCodeStep.SECO
11610 4e 44 5f 52 4f 57 5f 43 4f 44 45 22 29 29 3b 0a  ND_ROW_CODE"));.
11620 20 20 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a    if( bCache ){.
11630 20 20 20 20 61 64 64 72 43 61 63 68 65 4e 65 78      addrCacheNex
11640 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
11650 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
11660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
11670 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11680 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 7d 0a  v, addrIf);.  }.
11690 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
116a0 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
116b0 47 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43  G ){.    windowC
116c0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
116d0 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 63 73 72  _RETURN_ROW, csr
116e0 43 75 72 72 65 6e 74 2c 20 72 65 67 45 6e 64 2c  Current, regEnd,
116f0 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43   0);.    windowC
11700 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
11710 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 63 73 72  _AGGINVERSE, csr
11720 53 74 61 72 74 2c 20 72 65 67 53 74 61 72 74 2c  Start, regStart,
11730 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69   0);.  }else.  i
11740 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
11750 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
11760 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70      windowCodeOp
11770 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 53  (&s, WINDOW_AGGS
11780 54 45 50 2c 20 63 73 72 45 6e 64 2c 20 72 65 67  TEP, csrEnd, reg
11790 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 77 69 6e  End, 0);.    win
117a0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
117b0 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c  NDOW_RETURN_ROW,
117c0 20 63 73 72 43 75 72 72 65 6e 74 2c 20 30 2c 20   csrCurrent, 0, 
117d0 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f  0);.    windowCo
117e0 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f  deOp(&s, WINDOW_
117f0 41 47 47 49 4e 56 45 52 53 45 2c 20 63 73 72 53  AGGINVERSE, csrS
11800 74 61 72 74 2c 20 72 65 67 53 74 61 72 74 2c 20  tart, regStart, 
11810 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
11820 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
11830 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11840 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e   OP_IfPos, regEn
11850 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 77 69  d, 0, 1);.    wi
11860 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
11870 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57  INDOW_RETURN_ROW
11880 2c 20 63 73 72 43 75 72 72 65 6e 74 2c 20 30 2c  , csrCurrent, 0,
11890 20 30 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43   0);.    windowC
118a0 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57  odeOp(&s, WINDOW
118b0 5f 41 47 47 49 4e 56 45 52 53 45 2c 20 63 73 72  _AGGINVERSE, csr
118c0 53 74 61 72 74 2c 20 72 65 67 53 74 61 72 74 2c  Start, regStart,
118d0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
118e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
118f0 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 56 64 62  addr);.  }.  Vdb
11900 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28  eModuleComment((
11910 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22  pParse->pVdbe, "
11920 45 6e 64 20 77 69 6e 64 6f 77 43 6f 64 65 53 74  End windowCodeSt
11930 65 70 2e 53 45 43 4f 4e 44 5f 52 4f 57 5f 43 4f  ep.SECOND_ROW_CO
11940 44 45 22 29 29 3b 0a 0a 20 20 56 64 62 65 4d 6f  DE"));..  VdbeMo
11950 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61  duleComment((pPa
11960 72 73 65 2d 3e 70 56 64 62 65 2c 20 22 42 65 67  rse->pVdbe, "Beg
11970 69 6e 20 77 69 6e 64 6f 77 43 6f 64 65 53 74 65  in windowCodeSte
11980 70 2e 41 4c 4c 5f 52 4f 57 5f 43 4f 44 45 22 29  p.ALL_ROW_CODE")
11990 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
119a0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
119b0 47 6f 74 6f 29 3b 0a 20 20 69 66 28 20 70 4d 57  Goto);.  if( pMW
119c0 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 50 52 45  in->eEnd!=TK_PRE
119d0 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 77 69  CEDING ){.    wi
119e0 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57  ndowCodeOp(&s, W
119f0 49 4e 44 4f 57 5f 41 47 47 53 54 45 50 2c 20 63  INDOW_AGGSTEP, c
11a00 73 72 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  srEnd, 0, 0);.  
11a10 7d 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  }.  VdbeModuleCo
11a20 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70  mment((pParse->p
11a30 56 64 62 65 2c 20 22 45 6e 64 20 77 69 6e 64 6f  Vdbe, "End windo
11a40 77 43 6f 64 65 53 74 65 70 2e 41 4c 4c 5f 52 4f  wCodeStep.ALL_RO
11a50 57 5f 43 4f 44 45 22 29 29 3b 0a 0a 20 20 2f 2a  W_CODE"));..  /*
11a60 20 45 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e   End of the main
11a70 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20   input loop */. 
11a80 20 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20   if( bCache ){. 
11a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11aa0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
11ab0 20 63 73 72 57 72 69 74 65 2c 20 61 64 64 72 43   csrWrite, addrC
11ac0 61 63 68 65 4e 65 78 74 29 3b 0a 20 20 20 20 73  acheNext);.    s
11ad0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11ae0 72 65 28 76 2c 20 61 64 64 72 43 61 63 68 65 52  re(v, addrCacheR
11af0 65 77 69 6e 64 29 3b 20 0a 20 20 7d 65 6c 73 65  ewind); .  }else
11b00 7b 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 68  {.    if( addrSh
11b10 6f 72 74 63 75 74 3e 30 20 29 20 73 71 6c 69 74  ortcut>0 ) sqlit
11b20 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
11b30 2c 20 61 64 64 72 53 68 6f 72 74 63 75 74 29 3b  , addrShortcut);
11b40 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
11b50 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
11b60 7d 0a 0a 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72  }..  /* Fall thr
11b70 6f 75 67 68 20 2a 2f 0a 0a 20 20 56 64 62 65 4d  ough */..  VdbeM
11b80 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50  oduleComment((pP
11b90 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22 42 65  arse->pVdbe, "Be
11ba0 67 69 6e 20 77 69 6e 64 6f 77 43 6f 64 65 53 74  gin windowCodeSt
11bb0 65 70 2e 46 4c 55 53 48 5f 43 4f 44 45 22 29 29  ep.FLUSH_CODE"))
11bc0 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  ;.  if( pMWin->p
11bd0 50 61 72 74 69 74 69 6f 6e 20 26 26 20 62 43 61  Partition && bCa
11be0 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 61 64  che==0 ){.    ad
11bf0 64 72 49 6e 74 65 67 65 72 20 3d 20 73 71 6c 69  drInteger = sqli
11c00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11c10 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
11c20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20  regFlushPart);. 
11c30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11c40 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
11c50 73 75 62 46 6c 75 73 68 29 3b 0a 20 20 7d 0a 0a  subFlush);.  }..
11c60 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
11c70 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
11c80 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64  ){.    windowCod
11c90 65 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 41  eOp(&s, WINDOW_A
11ca0 47 47 53 54 45 50 2c 20 63 73 72 45 6e 64 2c 20  GGSTEP, csrEnd, 
11cb0 72 65 67 45 6e 64 2c 20 31 29 3b 0a 20 20 20 20  regEnd, 1);.    
11cc0 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c  windowCodeOp(&s,
11cd0 20 57 49 4e 44 4f 57 5f 52 45 54 55 52 4e 5f 52   WINDOW_RETURN_R
11ce0 4f 57 2c 20 63 73 72 43 75 72 72 65 6e 74 2c 20  OW, csrCurrent, 
11cf0 30 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 1);.  }else{.
11d00 20 20 20 20 69 6e 74 20 61 64 64 72 42 72 65 61      int addrBrea
11d10 6b 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 53  k;.    int addrS
11d20 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
11d30 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
11d40 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
11d50 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
11d60 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 61  OWING ){.      a
11d70 64 64 72 42 72 65 61 6b 20 3d 20 77 69 6e 64 6f  ddrBreak = windo
11d80 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49 4e 44  wCodeOp(&s, WIND
11d90 4f 57 5f 52 45 54 55 52 4e 5f 52 4f 57 2c 20 63  OW_RETURN_ROW, c
11da0 73 72 43 75 72 72 65 6e 74 2c 20 72 65 67 45 6e  srCurrent, regEn
11db0 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 77 69 6e  d, 1);.      win
11dc0 64 6f 77 43 6f 64 65 4f 70 28 26 73 2c 20 57 49  dowCodeOp(&s, WI
11dd0 4e 44 4f 57 5f 41 47 47 49 4e 56 45 52 53 45 2c  NDOW_AGGINVERSE,
11de0 20 63 73 72 53 74 61 72 74 2c 20 72 65 67 53 74   csrStart, regSt
11df0 61 72 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  art, 1);.    }el
11e00 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 42 72  se{.      addrBr
11e10 65 61 6b 20 3d 20 77 69 6e 64 6f 77 43 6f 64 65  eak = windowCode
11e20 4f 70 28 26 73 2c 20 57 49 4e 44 4f 57 5f 52 45  Op(&s, WINDOW_RE
11e30 54 55 52 4e 5f 52 4f 57 2c 20 63 73 72 43 75 72  TURN_ROW, csrCur
11e40 72 65 6e 74 2c 20 30 2c 20 31 29 3b 0a 20 20 20  rent, 0, 1);.   
11e50 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 4f 70 28     windowCodeOp(
11e60 26 73 2c 20 57 49 4e 44 4f 57 5f 41 47 47 49 4e  &s, WINDOW_AGGIN
11e70 56 45 52 53 45 2c 20 63 73 72 53 74 61 72 74 2c  VERSE, csrStart,
11e80 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20   regStart, 0);. 
11e90 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11ea0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11eb0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 53 74  _Goto, 0, addrSt
11ec0 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
11ed0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
11ee0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 7d   addrBreak);.  }
11ef0 0a 0a 20 20 69 66 28 20 62 43 61 63 68 65 20 26  ..  if( bCache &
11f00 26 20 61 64 64 72 53 68 6f 72 74 63 75 74 3e 30  & addrShortcut>0
11f10 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
11f20 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 53 68  mpHere(v, addrSh
11f30 6f 72 74 63 75 74 29 3b 0a 20 20 73 71 6c 69 74  ortcut);.  sqlit
11f40 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11f50 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
11f60 63 73 72 43 75 72 72 65 6e 74 29 3b 0a 20 20 73  csrCurrent);.  s
11f70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11f80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
11f90 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 53 69 7a  0, pMWin->regSiz
11fa0 65 29 3b 0a 20 20 69 66 28 20 62 43 61 63 68 65  e);.  if( bCache
11fb0 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  ==0 ) sqlite3Vdb
11fc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
11fd0 74 65 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d  teger, 1, pMWin-
11fe0 3e 72 65 67 46 69 72 73 74 29 3b 0a 20 20 56 64  >regFirst);.  Vd
11ff0 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
12000 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
12010 22 45 6e 64 20 77 69 6e 64 6f 77 43 6f 64 65 53  "End windowCodeS
12020 74 65 70 2e 46 4c 55 53 48 5f 43 4f 44 45 22 29  tep.FLUSH_CODE")
12030 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
12040 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
12050 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
12060 6e 67 65 50 31 28 76 2c 20 61 64 64 72 49 6e 74  ngeP1(v, addrInt
12070 65 67 65 72 2c 20 73 71 6c 69 74 65 33 56 64 62  eger, sqlite3Vdb
12080 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
12090 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
120a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
120b0 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50 61  turn, regFlushPa
120c0 72 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rt);.  }.}../*.*
120d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
120e0 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
120f0 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
12100 64 65 53 74 65 70 28 29 20 66 6f 72 20 63 61 73  deStep() for cas
12110 65 73 20 74 68 61 74 0a 2a 2a 20 77 6f 75 6c 64  es that.** would
12120 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 68 61 6e   normally be han
12130 64 6c 65 64 20 62 79 20 77 69 6e 64 6f 77 43 6f  dled by windowCo
12140 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 29 20  deDefaultStep() 
12150 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 0a 2a  when there are.*
12160 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 75  * one or more bu
12170 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75  ilt-in window-fu
12180 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 71  nctions that req
12190 75 69 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  uire the entire 
121a0 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20 74 6f 20  partition.** to 
121b0 62 65 20 63 61 63 68 65 64 20 69 6e 20 61 20 74  be cached in a t
121c0 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65  emp table before
121d0 20 61 6e 79 20 72 6f 77 73 20 63 61 6e 20 62 65   any rows can be
121e0 20 72 65 74 75 72 6e 65 64 2e 20 41 64 64 69 74   returned. Addit
121f0 69 6f 6e 61 6c 6c 79 2e 0a 2a 2a 20 22 52 41 4e  ionally..** "RAN
12200 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  GE BETWEEN CURRE
12210 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
12220 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20  NDED FOLLOWING" 
12230 69 73 20 61 6c 77 61 79 73 20 68 61 6e 64 6c 65  is always handle
12240 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e  d by.** this fun
12250 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 73 65  ction..**.** Pse
12260 75 64 6f 2d 63 6f 64 65 20 63 6f 72 72 65 73 70  udo-code corresp
12270 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 56 4d  onding to the VM
12280 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
12290 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
122a0 0a 2a 2a 20 66 6f 72 20 65 61 63 68 20 74 79 70  .** for each typ
122b0 65 20 6f 66 20 77 69 6e 64 6f 77 20 66 6f 6c 6c  e of window foll
122c0 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45  ows..**.** RANGE
122d0 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
122e0 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
122f0 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a   CURRENT ROW.**.
12300 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69  **   flush_parti
12310 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63  tion:.**     Onc
12320 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65  e {.**       Ope
12330 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e  nDup (iEphCsr ->
12340 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20   csrLead).**    
12350 20 7d 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65   }.**     Intege
12360 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66  r ctr 0.**     f
12370 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
12380 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ead){.**       i
12390 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
123a0 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e  *         AggFin
123b0 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
123c0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
123d0 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
123e0 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
123f0 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
12400 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68         Next iEph
12410 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  Csr.**         }
12420 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 6e 74 65  .**         Inte
12430 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20  ger ctr 0.**    
12440 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 41 67     }.**       Ag
12450 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a  gStep (csrLead).
12460 2a 2a 20 20 20 20 20 20 20 49 6e 63 72 20 63 74  **       Incr ct
12470 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  r.**     }.**.**
12480 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
12490 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20  Finalize).**    
124a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
124b0 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
124c0 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
124d0 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 69 45  **       Next iE
124e0 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  phCsr.**     }.*
124f0 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f  *.**     ResetSo
12500 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20  rter (csr).**   
12510 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52    Return.**.** R
12520 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
12530 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
12540 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  AND CURRENT ROW.
12550 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  **.**   As above
12560 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  , except that th
12570 65 20 22 69 66 28 20 6e 65 77 20 70 65 65 72 20  e "if( new peer 
12580 29 22 20 62 72 61 6e 63 68 20 69 73 20 61 6c 77  )" branch is alw
12590 61 79 73 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a  ays taken..**.**
125a0 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
125b0 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43  URRENT ROW AND C
125c0 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2a 0a 2a  URRENT ROW .**.*
125d0 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78  *   As above, ex
125e0 63 65 70 74 20 74 68 61 74 20 65 61 63 68 20 6f  cept that each o
125f0 66 20 74 68 65 20 66 6f 72 28 29 20 6c 6f 6f 70  f the for() loop
12600 73 20 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a  s becomes:.**.**
12610 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
12620 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a  ; i<ctr; i++){.*
12630 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  *           Gosu
12640 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
12650 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76 65           AggInve
12660 72 73 65 20 28 69 45 70 68 43 73 72 29 0a 2a 2a  rse (iEphCsr).**
12670 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20             Next 
12680 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20  iEphCsr.**      
12690 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45     }.**.** RANGE
126a0 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
126b0 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
126c0 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
126d0 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75  WING.**.**   flu
126e0 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a  sh_partition:.**
126f0 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20       Once {.**  
12700 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45       OpenDup (iE
12710 70 68 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64  phCsr -> csrLead
12720 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
12730 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63    foreach row (c
12740 73 72 4c 65 61 64 29 20 7b 0a 2a 2a 20 20 20 20  srLead) {.**    
12750 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c     AggStep (csrL
12760 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  ead).**     }.**
12770 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
12780 20 28 69 45 70 68 43 73 72 29 20 7b 0a 2a 2a 20   (iEphCsr) {.** 
12790 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
127a0 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 7d 0a 2a  Gosub.**     }.*
127b0 2a 20 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  * .** RANGE BETW
127c0 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
127d0 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
127e0 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
127f0 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a  flush_partition:
12800 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a  .**     Once {.*
12810 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20  *       OpenDup 
12820 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 4c  (iEphCsr -> csrL
12830 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  ead).**     }.**
12840 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
12850 20 28 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20   (csrLead){.**  
12860 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73       AggStep (cs
12870 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a  rLead).**     }.
12880 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20 28 63  **     Rewind (c
12890 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 49  srLead).**     I
128a0 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20  nteger ctr 0.** 
128b0 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20      foreach row 
128c0 28 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20  (csrLead){.**   
128d0 20 20 20 20 69 66 28 20 6e 65 77 20 70 65 65 72      if( new peer
128e0 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41   ){.**         A
128f0 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29  ggFinal (xValue)
12900 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28  .**         for(
12910 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29  i=0; i<ctr; i++)
12920 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47  {.**           G
12930 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
12940 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67 49  *           AggI
12950 6e 76 65 72 73 65 20 28 69 45 70 68 43 73 72 29  nverse (iEphCsr)
12960 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65  .**           Ne
12970 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20  xt iEphCsr.**   
12980 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
12990 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20 30     Integer ctr 0
129a0 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
129b0 20 20 20 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a       Incr ctr.**
129c0 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20       }.**.**    
129d0 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
129e0 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72  lize).**     for
129f0 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b  (i=0; i<ctr; i++
12a00 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  ){.**       Gosu
12a10 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
12a20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73       Next iEphCs
12a30 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  r.**     }.**.**
12a40 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72       ResetSorter
12a50 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65   (csr).**     Re
12a60 74 75 72 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  turn.*/.static v
12a70 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 43 61  oid windowCodeCa
12a80 63 68 65 53 74 65 70 28 0a 20 20 50 61 72 73 65  cheStep(.  Parse
12a90 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c   *pParse, .  Sel
12aa0 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49  ect *p,.  WhereI
12ab0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69  nfo *pWInfo,.  i
12ac0 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20  nt regGosub, .  
12ad0 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b  int addrGosub.){
12ae0 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
12af0 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64   = p->pWin;.  Vd
12b00 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
12b10 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
12b20 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20 61    int k;.  int a
12b30 64 64 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ddr;.  ExprList 
12b40 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e  *pPart = pMWin->
12b50 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78  pPartition;.  Ex
12b60 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
12b70 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   = pMWin->pOrder
12b80 42 79 3b 0a 20 20 69 6e 74 20 6e 50 65 65 72 20  By;.  int nPeer 
12b90 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72  = pOrderBy ? pOr
12ba0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
12bb0 3b 0a 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65  ;.  int regNewPe
12bc0 65 72 3b 0a 0a 20 20 69 6e 74 20 61 64 64 72 47  er;..  int addrG
12bd0 6f 74 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  oto;            
12be0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
12bf0 73 20 6f 66 20 47 6f 74 6f 20 75 73 65 64 20 74  s of Goto used t
12c00 6f 20 6a 75 6d 70 20 66 6c 75 73 68 5f 70 61 72  o jump flush_par
12c10 2e 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  .. */.  int addr
12c20 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
12c30 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
12c40 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 69 74  here for next it
12c50 65 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20  eration of loop 
12c60 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73  */.  int regFlus
12c70 68 50 61 72 74 3b 0a 20 20 69 6e 74 20 6c 62 6c  hPart;.  int lbl
12c80 46 6c 75 73 68 50 61 72 74 3b 0a 20 20 69 6e 74  FlushPart;.  int
12c90 20 63 73 72 4c 65 61 64 3b 0a 20 20 69 6e 74 20   csrLead;.  int 
12ca0 72 65 67 43 74 72 3b 0a 20 20 69 6e 74 20 72 65  regCtr;.  int re
12cb0 67 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  gArg;           
12cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
12cd0 69 73 74 65 72 20 61 72 72 61 79 20 74 6f 20 6d  ister array to m
12ce0 61 72 74 69 61 6c 20 66 75 6e 63 74 69 6f 6e 20  artial function 
12cf0 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  args */.  int re
12d00 67 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 62 6c  gSize;.  int lbl
12d10 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20 62 52 65  Empty;.  int bRe
12d20 76 65 72 73 65 20 3d 20 70 4d 57 69 6e 2d 3e 70  verse = pMWin->p
12d30 4f 72 64 65 72 42 79 20 26 26 20 70 4d 57 69 6e  OrderBy && pMWin
12d40 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
12d50 52 45 4e 54 20 0a 20 20 20 20 20 20 20 20 20 20  RENT .          
12d60 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
12d70 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 0a 20  TK_UNBOUNDED;.. 
12d80 20 61 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d   assert( (pMWin-
12d90 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
12da0 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e  UNDED && pMWin->
12db0 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
12dc0 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  ) .       || (pM
12dd0 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
12de0 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57  UNBOUNDED && pMW
12df0 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
12e00 4f 55 4e 44 45 44 29 20 0a 20 20 20 20 20 20 20  OUNDED) .       
12e10 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  || (pMWin->eStar
12e20 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26  t==TK_CURRENT &&
12e30 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
12e40 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 20 20 20  _CURRENT) .     
12e50 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
12e60 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
12e70 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
12e80 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20  TK_UNBOUNDED) . 
12e90 20 29 3b 0a 0a 20 20 6c 62 6c 45 6d 70 74 79 20   );..  lblEmpty 
12ea0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12eb0 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
12ec0 20 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20 70    regNewPeer = p
12ed0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
12ee0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
12ef0 20 6e 50 65 65 72 3b 0a 0a 20 20 2f 2a 20 41 6c   nPeer;..  /* Al
12f00 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 20  locate register 
12f10 61 6e 64 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  and label for th
12f20 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69  e "flush_partiti
12f30 6f 6e 22 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e  on" sub-routine.
12f40 20 2a 2f 0a 20 20 72 65 67 46 6c 75 73 68 50 61   */.  regFlushPa
12f50 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rt = ++pParse->n
12f60 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75 73 68 50  Mem;.  lblFlushP
12f70 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
12f80 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72 73  eMakeLabel(pPars
12f90 65 29 3b 0a 0a 20 20 63 73 72 4c 65 61 64 20 3d  e);..  csrLead =
12fa0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12fb0 0a 20 20 72 65 67 43 74 72 20 3d 20 2b 2b 70 50  .  regCtr = ++pP
12fc0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77  arse->nMem;..  w
12fd0 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e 43 61  indowPartitionCa
12fe0 63 68 65 28 70 50 61 72 73 65 2c 20 70 2c 20 70  che(pParse, p, p
12ff0 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75 73 68 50  WInfo, regFlushP
13000 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72  art, lblFlushPar
13010 74 2c 20 26 72 65 67 53 69 7a 65 29 3b 0a 20 20  t, &regSize);.  
13020 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74  addrGoto = sqlit
13030 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
13040 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20  OP_Goto);..  /* 
13050 53 74 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f  Start of "flush_
13060 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20  partition" */.  
13070 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
13080 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c  veLabel(v, lblFl
13090 75 73 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69  ushPart);.  sqli
130a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
130b0 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c   OP_Once, 0, sql
130c0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
130d0 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62  ddr(v)+2);.  Vdb
130e0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
130f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13100 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
13110 20 63 73 72 4c 65 61 64 2c 20 70 4d 57 69 6e 2d   csrLead, pMWin-
13120 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20 2f 2a  >iEphCsr);..  /*
13130 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
13140 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
13150 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69  ster for each wi
13160 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ndow function to
13170 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41 72   NULL */.  regAr
13180 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63  g = windowInitAc
13190 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69  cum(pParse, pMWi
131a0 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  n);..  sqlite3Vd
131b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
131c0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43 74  nteger, 0, regCt
131d0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
131e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
131f0 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20 6c  wind, csrLead, l
13200 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64 62 65  blEmpty);.  Vdbe
13210 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
13220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13230 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
13240 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 6c  MWin->iEphCsr, l
13250 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64 62 65  blEmpty);.  Vdbe
13260 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
13270 65 6e 28 76 29 3b 0a 0a 20 20 69 66 28 20 62 52  en(v);..  if( bR
13280 65 76 65 72 73 65 20 29 7b 0a 20 20 20 20 69 6e  everse ){.    in
13290 74 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65  t addr2 = sqlite
132a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
132b0 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41  (v);.    windowA
132c0 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
132d0 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20 30  MWin, csrLead, 0
132e0 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a  , regArg, regSiz
132f0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
13300 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13310 4e 65 78 74 2c 20 63 73 72 4c 65 61 64 2c 20 61  Next, csrLead, a
13320 64 64 72 32 29 3b 0a 20 20 20 20 56 64 62 65 43  ddr2);.    VdbeC
13330 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
13340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13350 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
13360 63 73 72 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74  csrLead, lblEmpt
13370 79 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  y);.    VdbeCove
13380 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
13390 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 4e 65 78  );.  }.  addrNex
133a0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
133b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
133c0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
133d0 26 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  & (pMWin->eEnd==
133e0 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 70 4d  TK_CURRENT || pM
133f0 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
13400 43 55 52 52 45 4e 54 29 20 29 7b 0a 20 20 20 20  CURRENT) ){.    
13410 69 6e 74 20 62 43 75 72 72 65 6e 74 20 3d 20 28  int bCurrent = (
13420 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
13430 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20  K_CURRENT);.    
13440 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30  int addrJump = 0
13450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13460 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4a   Address of OP_J
13470 75 6d 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ump below */.   
13480 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
13490 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
134a0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
134b0 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
134c0 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61  l + (pPart ? pPa
134d0 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
134e0 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 65 65        int regPee
134f0 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  r = pMWin->regPa
13500 72 74 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50  rt + (pPart ? pP
13510 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  art->nExpr : 0);
13520 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
13530 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
13540 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
13550 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
13560 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
13570 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
13580 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nPeer; k++){.   
13590 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
135a0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
135b0 75 6d 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69 4f  umn, csrLead, iO
135c0 66 66 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65 72  ff+k, regNewPeer
135d0 2b 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +k);.      }.   
135e0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
135f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
13600 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
13610 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20  wPeer, regPeer, 
13620 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71  nPeer);.      sq
13630 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
13640 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
13650 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
13660 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d  );.      addrJum
13670 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
13680 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
13690 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64  , addr+2, 0, add
136a0 72 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  r+2);.      Vdbe
136b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
136c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
136d0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
136e0 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67   regNewPeer, reg
136f0 50 65 65 72 2c 20 6e 50 65 65 72 2d 31 29 3b 0a  Peer, nPeer-1);.
13700 20 20 20 20 7d 0a 0a 20 20 20 20 77 69 6e 64 6f      }..    windo
13710 77 52 65 74 75 72 6e 52 6f 77 73 28 70 50 61 72  wReturnRows(pPar
13720 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43 74  se, pMWin, regCt
13730 72 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  r, regGosub, add
13740 72 47 6f 73 75 62 2c 20 0a 20 20 20 20 20 20 20  rGosub, .       
13750 20 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65 67   (bCurrent ? reg
13760 41 72 67 20 3a 20 30 29 2c 20 28 62 43 75 72 72  Arg : 0), (bCurr
13770 65 6e 74 20 3f 20 72 65 67 53 69 7a 65 20 3a 20  ent ? regSize : 
13780 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  0).    );.    if
13790 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c  ( addrJump ) sql
137a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
137b0 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20  (v, addrJump);. 
137c0 20 7d 0a 0a 20 20 69 66 28 20 62 52 65 76 65 72   }..  if( bRever
137d0 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e  se==0 ){.    win
137e0 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
137f0 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61  e, pMWin, csrLea
13800 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65  d, 0, regArg, re
13810 67 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71  gSize);.  }.  sq
13820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13830 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65  v, OP_AddImm, re
13840 67 43 74 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69  gCtr, 1);.  sqli
13850 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13860 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61   OP_Next, csrLea
13870 64 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  d, addrNext);.  
13880 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13890 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e  ..  windowReturn
138a0 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57  Rows(pParse, pMW
138b0 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67 47  in, regCtr, regG
138c0 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 2c  osub, addrGosub,
138d0 20 30 2c 20 30 29 3b 0a 0a 20 20 73 71 6c 69 74   0, 0);..  sqlit
138e0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
138f0 65 6c 28 76 2c 20 6c 62 6c 45 6d 70 74 79 29 3b  el(v, lblEmpty);
13900 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13910 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
13920 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69  Sorter, pMWin->i
13930 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74  EphCsr);.  sqlit
13940 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13950 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c  OP_Return, regFl
13960 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a 20  ushPart);..  /* 
13970 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f 20  Jump to here to 
13980 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68 5f  skip over flush_
13990 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73  partition */.  s
139a0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
139b0 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b  re(v, addrGoto);
139c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47 45  .}.../*.** RANGE
139d0 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
139e0 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
139f0 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a   CURRENT ROW.**.
13a00 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20  **   ....**     
13a10 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
13a20 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  n ){.**       Ag
13a30 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a  gFinal (xFinaliz
13a40 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  e).**       Gosu
13a50 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
13a60 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72       ResetSorter
13a70 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20 20   eph-table.**   
13a80 20 20 7d 0a 2a 2a 20 20 20 20 20 65 6c 73 65 20    }.**     else 
13a90 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a  if( new peer ){.
13aa0 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61  **       AggFina
13ab0 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
13ac0 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
13ad0 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65 73  sub.**       Res
13ae0 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61 62  etSorter eph-tab
13af0 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  le.**     }.**  
13b00 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20 20     AggStep.**   
13b10 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64    Insert (record
13b20 20 69 6e 74 6f 20 65 70 68 2d 74 61 62 6c 65 29   into eph-table)
13b30 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 68 65  .**   sqlite3Whe
13b40 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 41 67 67  reEnd().**   Agg
13b50 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65  Final (xFinalize
13b60 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20 61 64 64  ).**   Gosub add
13b70 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52 41 4e  rGosub.**.** RAN
13b80 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
13b90 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
13ba0 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
13bb0 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41  LOWING.**.**   A
13bc0 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
13bd0 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e 20 66  take no action f
13be0 6f 72 20 61 20 22 6e 65 77 20 70 65 65 72 22 2e  or a "new peer".
13bf0 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74 68 65   Invoke.**   the
13c00 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f 6e 63   sub-routine onc
13c10 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63 68 20  e only for each 
13c20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  partition..**.**
13c30 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
13c40 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43  URRENT ROW AND C
13c50 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a  URRENT ROW.**.**
13c60 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
13c70 65 70 74 20 74 68 61 74 20 74 68 65 20 22 6e 65  ept that the "ne
13c80 77 20 70 65 65 72 22 20 63 6f 6e 64 69 74 69 6f  w peer" conditio
13c90 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  n is handled in 
13ca0 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20 77 61  the.**   same wa
13cb0 79 20 61 73 20 22 6e 65 77 20 70 61 72 74 69 74  y as "new partit
13cc0 69 6f 6e 22 20 28 73 6f 20 74 68 65 72 65 20 69  ion" (so there i
13cd0 73 20 6e 6f 20 22 65 6c 73 65 20 69 66 22 20 62  s no "else if" b
13ce0 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57  lock)..**.** ROW
13cf0 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
13d00 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
13d10 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
13d20 20 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c   .**   As above,
13d30 20 65 78 63 65 70 74 20 61 73 73 75 6d 65 20 65   except assume e
13d40 76 65 72 79 20 72 6f 77 20 69 73 20 61 20 22 6e  very row is a "n
13d50 65 77 20 70 65 65 72 22 2e 0a 2a 2f 0a 73 74 61  ew peer"..*/.sta
13d60 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
13d70 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 0a  odeDefaultStep(.
13d80 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13d90 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20   .  Select *p,. 
13da0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
13db0 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73  fo,.  int regGos
13dc0 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47  ub, .  int addrG
13dd0 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  osub.){.  Window
13de0 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
13df0 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  n;.  Vdbe *v = s
13e00 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
13e10 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a  arse);.  int k;.
13e20 20 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20    int iSubCsr = 
13e30 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  p->pSrc->a[0].iC
13e40 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75  ursor;.  int nSu
13e50 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
13e60 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  ].pTab->nCol;.  
13e70 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73 65  int reg = pParse
13e80 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20  ->nMem+1;.  int 
13e90 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b  regRecord = reg+
13ea0 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52  nSub;.  int regR
13eb0 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64  owid = regRecord
13ec0 2b 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  +1;.  int addr;.
13ed0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
13ee0 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
13ef0 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73  ition;.  ExprLis
13f00 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d  t *pOrderBy = pM
13f10 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  Win->pOrderBy;..
13f20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
13f30 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45  >eType==TK_RANGE
13f40 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69   .      || (pMWi
13f50 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
13f60 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
13f70 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
13f80 4e 54 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  NT).  );..  asse
13f90 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61  rt( (pMWin->eSta
13fa0 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
13fb0 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
13fc0 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 20  =TK_CURRENT).   
13fd0 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
13fe0 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
13ff0 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
14000 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
14010 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57  ).       || (pMW
14020 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43  in->eStart==TK_C
14030 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d  URRENT && pMWin-
14040 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e  >eEnd==TK_CURREN
14050 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  T).       || (pM
14060 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
14070 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
14080 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
14090 4e 44 45 44 20 26 26 20 21 70 4f 72 64 65 72 42  NDED && !pOrderB
140a0 79 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  y).  );..  if( p
140b0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
140c0 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
140d0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
140e0 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  }..  pParse->nMe
140f0 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a  m += nSub + 2;..
14100 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 69 6e    /* Load the in
14110 64 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e 20  dividual column 
14120 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72 6f  values of the ro
14130 77 20 72 65 74 75 72 6e 65 64 20 62 79 0a 20 20  w returned by.  
14140 2a 2a 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  ** the sub-selec
14150 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  t into an array 
14160 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f  of registers. */
14170 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53  .  for(k=0; k<nS
14180 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71  ub; k++){.    sq
14190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
141a0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
141b0 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29  ubCsr, k, reg+k)
141c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
141d0 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  k if this is the
141e0 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20   start of a new 
141f0 70 61 72 74 69 74 69 6f 6e 20 6f 72 20 70 65 65  partition or pee
14200 72 20 67 72 6f 75 70 2e 20 2a 2f 0a 20 20 69 66  r group. */.  if
14210 28 20 70 50 61 72 74 20 7c 7c 20 70 4f 72 64 65  ( pPart || pOrde
14220 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
14230 50 61 72 74 20 3d 20 28 70 50 61 72 74 20 3f 20  Part = (pPart ? 
14240 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pPart->nExpr : 0
14250 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47  );.    int addrG
14260 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  oto = 0;.    int
14270 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 0a 20   addrJump = 0;. 
14280 20 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 28     int nPeer = (
14290 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65  pOrderBy ? pOrde
142a0 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  rBy->nExpr : 0);
142b0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72 74 20  ..    if( pPart 
142c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  ){.      int reg
142d0 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20  NewPart = reg + 
142e0 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
142f0 6c 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  l;.      KeyInfo
14300 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c   *pKeyInfo = sql
14310 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
14320 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
14330 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pPart, 0, 0);.  
14340 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
14350 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14360 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e  OP_Compare, regN
14370 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72  ewPart, pMWin->r
14380 65 67 50 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20  egPart,nPart);. 
14390 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
143a0 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69  AppendP4(v, (voi
143b0 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  d*)pKeyInfo, P4_
143c0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
143d0 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74  addrJump = sqlit
143e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
143f0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c  OP_Jump, addr+2,
14400 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20   0, addr+2);.   
14410 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45     VdbeCoverageE
14420 71 4e 65 28 76 29 3b 0a 20 20 20 20 20 20 77 69  qNe(v);.      wi
14430 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
14440 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a  rse, pMWin, 1);.
14450 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
14460 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  By ){.        ad
14470 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
14480 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
14490 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  _Goto);.      }.
144a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
144b0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
144c0 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20   int regNewPeer 
144d0 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e  = reg + pMWin->n
144e0 42 75 66 66 65 72 43 6f 6c 20 2b 20 6e 50 61 72  BufferCol + nPar
144f0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  t;.      int reg
14500 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65  Peer = pMWin->re
14510 67 50 61 72 74 20 2b 20 6e 50 61 72 74 3b 0a 0a  gPart + nPart;..
14520 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4a 75        if( addrJu
14530 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  mp ) sqlite3Vdbe
14540 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
14550 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28  Jump);.      if(
14560 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   pMWin->eType==T
14570 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
14580 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
14590 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
145a0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
145b0 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
145c0 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  By, 0, 0);.     
145d0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
145e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
145f0 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
14600 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20  wPeer, regPeer, 
14610 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 20 20  nPeer);.        
14620 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
14630 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
14640 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
14650 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  FO);.        add
14660 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  rJump = sqlite3V
14670 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14680 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c  Jump, addr+2, 0,
14690 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
146a0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
146b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
146c0 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70          addrJump
146d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
146e0 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e      windowAggFin
146f0 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  al(pParse, pMWin
14700 2c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  , pMWin->eStart=
14710 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20  =TK_CURRENT);.  
14720 20 20 20 20 69 66 28 20 61 64 64 72 47 6f 74 6f      if( addrGoto
14730 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
14740 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
14750 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  to);.    }..    
14760 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14770 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
14780 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73  pMWin->iEphCsr,s
14790 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
147a0 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
147b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
147c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
147d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
147e0 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  sub, regGosub, a
147f0 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 73  ddrGosub);.    s
14800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14810 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57  (v, OP_Next, pMW
14820 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c  in->iEphCsr, sql
14830 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
14840 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 20 20 56  ddr(v)-1);.    V
14850 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
14860 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14870 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
14880 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d  etSorter, pMWin-
14890 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 73  >iEphCsr);.    s
148a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
148b0 28 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f  (.        v, OP_
148c0 43 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e 2d  Copy, reg+pMWin-
148d0 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d 57  >nBufferCol, pMW
148e0 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61  in->regPart, nPa
148f0 72 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20 29  rt+nPeer-1.    )
14900 3b 0a 0a 20 20 20 20 69 66 28 20 61 64 64 72 4a  ;..    if( addrJ
14910 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62  ump ) sqlite3Vdb
14920 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
14930 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rJump);.  }..  /
14940 2a 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66 75  * Invoke step fu
14950 6e 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64 6f  nction for windo
14960 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  w functions */. 
14970 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
14980 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 2d 31  Parse, pMWin, -1
14990 2c 20 30 2c 20 72 65 67 2c 20 30 29 3b 0a 0a 20  , 0, reg, 0);.. 
149a0 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63   /* Buffer the c
149b0 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68  urrent row in th
149c0 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
149d0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  e. */.  if( pMWi
149e0 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30 20  n->nBufferCol>0 
149f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14a00 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
14a10 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20  akeRecord, reg, 
14a20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
14a30 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
14a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
14a50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14a60 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65 67   OP_Blob, 0, reg
14a70 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c  Record);.    sql
14a80 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
14a90 28 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20 30  (v, (void*)"", 0
14aa0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
14ab0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14ac0 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e  _NewRowid, pMWin
14ad0 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f  ->iEphCsr, regRo
14ae0 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
14af0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14b00 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69  Insert, pMWin->i
14b10 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72  EphCsr, regRecor
14b20 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  d, regRowid);.. 
14b30 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
14b40 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 20  base scan loop. 
14b50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
14b60 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
14b70 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
14b80 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31  pParse, pMWin, 1
14b90 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14ba0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
14bb0 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ind, pMWin->iEph
14bc0 43 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43  Csr,sqlite3VdbeC
14bd0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
14be0 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
14bf0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
14c00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
14c10 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20  osub, regGosub, 
14c20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71  addrGosub);.  sq
14c30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14c40 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69  v, OP_Next, pMWi
14c50 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69  n->iEphCsr, sqli
14c60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14c70 64 72 28 76 29 2d 31 29 3b 0a 20 20 56 64 62 65  dr(v)-1);.  Vdbe
14c80 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 7d 0a 0a  Coverage(v);.}..
14c90 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
14ca0 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c  nd return a dupl
14cb0 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e  icate of the Win
14cc0 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63  dow object indic
14cd0 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74  ated by the.** t
14ce0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53  hird argument. S
14cf0 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f  et the Window.pO
14d00 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68  wner field of th
14d10 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a  e new object to.
14d20 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69  ** pOwner..*/.Wi
14d30 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e  ndow *sqlite3Win
14d40 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a  dowDup(sqlite3 *
14d50 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72  db, Expr *pOwner
14d60 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20  , Window *p){.  
14d70 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30  Window *pNew = 0
14d80 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
14d90 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  ) ){.    pNew = 
14da0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
14db0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  ero(db, sizeof(W
14dc0 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66 28  indow));.    if(
14dd0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70   pNew ){.      p
14de0 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  New->zName = sql
14df0 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
14e00 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
14e10 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72 20    pNew->pFilter 
14e20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
14e30 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72 2c  (db, p->pFilter,
14e40 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
14e50 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75 6e  >pFunc = p->pFun
14e60 63 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  c;.      pNew->p
14e70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69  Partition = sqli
14e80 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
14e90 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e  b, p->pPartition
14ea0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
14eb0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
14ec0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
14ed0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
14ee0 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
14ef0 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70  >eType = p->eTyp
14f00 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65  e;.      pNew->e
14f10 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20  End = p->eEnd;. 
14f20 20 20 20 20 20 70 4e 65 77 2d 3e 65 53 74 61 72       pNew->eStar
14f30 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20  t = p->eStart;. 
14f40 20 20 20 20 20 70 4e 65 77 2d 3e 70 53 74 61 72       pNew->pStar
14f50 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
14f60 75 70 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74  up(db, p->pStart
14f70 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
14f80 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ->pEnd = sqlite3
14f90 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
14fa0 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  End, 0);.      p
14fb0 4e 65 77 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 4f  New->pOwner = pO
14fc0 77 6e 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  wner;.    }.  }.
14fd0 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
14fe0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
14ff0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 69 6e   copy of the lin
15000 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69 6e 64  ked list of Wind
15010 6f 77 20 6f 62 6a 65 63 74 73 20 70 61 73 73 65  ow objects passe
15020 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f  d as the.** seco
15030 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
15040 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57  Window *sqlite3W
15050 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 73 71 6c  indowListDup(sql
15060 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77  ite3 *db, Window
15070 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a   *p){.  Window *
15080 70 57 69 6e 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  pWin;.  Window *
15090 70 52 65 74 20 3d 20 30 3b 0a 20 20 57 69 6e 64  pRet = 0;.  Wind
150a0 6f 77 20 2a 2a 70 70 20 3d 20 26 70 52 65 74 3b  ow **pp = &pRet;
150b0 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 3b 20  ..  for(pWin=p; 
150c0 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
150d0 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
150e0 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 57 69 6e  *pp = sqlite3Win
150f0 64 6f 77 44 75 70 28 64 62 2c 20 30 2c 20 70 57  dowDup(db, 0, pW
15100 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 70  in);.    if( *pp
15110 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
15120 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70   pp = &((*pp)->p
15130 4e 65 78 74 57 69 6e 29 3b 0a 20 20 7d 0a 0a 20  NextWin);.  }.. 
15140 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
15150 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  ./*.** sqlite3Wh
15160 65 72 65 42 65 67 69 6e 28 29 20 68 61 73 20 61  ereBegin() has a
15170 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
15180 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  ed for the SELEC
15190 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  T statement .** 
151a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
151b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 77 68  cond argument wh
151c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
151d0 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74 20   is invoked. It 
151e0 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f 64  generates.** cod
151f0 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  e to populate th
15200 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65 73 75  e Window.regResu
15210 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  lt register for 
15220 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
15230 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 69 6e 76 6f  tion and.** invo
15240 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69  ke the sub-routi
15250 6e 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  ne at instructio
15260 6e 20 61 64 64 72 47 6f 73 75 62 20 6f 6e 63 65  n addrGosub once
15270 20 66 6f 72 20 65 61 63 68 20 72 6f 77 2e 0a 2a   for each row..*
15280 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15290 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65  calls sqlite3Whe
152a0 72 65 45 6e 64 28 29 20 62 65 66 6f 72 65 20 72  reEnd() before r
152b0 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2f 0a 76 6f  eturning. .*/.vo
152c0 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
152d0 43 6f 64 65 53 74 65 70 28 0a 20 20 50 61 72 73  CodeStep(.  Pars
152e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
152f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
15300 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
15310 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15330 20 20 2f 2a 20 52 65 77 72 69 74 74 65 6e 20 53    /* Rewritten S
15340 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
15350 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
15360 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  pWInfo,         
15370 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
15380 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
15390 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
153a0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  */.  int regGosu
153b0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
153c0 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
153d0 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62 20 2a 2f   for OP_Gosub */
153e0 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 2f 2a 20 4f 50 5f 47 6f 73 75 62 20 68     /* OP_Gosub h
15410 65 72 65 20 74 6f 20 72 65 74 75 72 6e 20 65 61  ere to return ea
15420 63 68 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20 57  ch row */.){.  W
15430 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
15440 2d 3e 70 57 69 6e 3b 0a 0a 20 20 2f 2a 20 54 68  ->pWin;..  /* Th
15450 65 72 65 20 61 72 65 20 74 68 72 65 65 20 64 69  ere are three di
15460 66 66 65 72 65 6e 74 20 66 75 6e 63 74 69 6f 6e  fferent function
15470 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  s that may be us
15480 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  ed to do the wor
15490 6b 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f  k.  ** of this o
154a0 6e 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ne, depending on
154b0 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
154c0 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  e and the specif
154d0 69 63 20 62 75 69 6c 74 2d 69 6e 0a 20 20 2a 2a  ic built-in.  **
154e0 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
154f0 73 20 75 73 65 64 20 28 69 66 20 61 6e 79 29 2e  s used (if any).
15500 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f  .  **.  ** windo
15510 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70  wCodeRowExprStep
15520 28 29 20 68 61 6e 64 6c 65 73 20 61 6c 6c 20 22  () handles all "
15530 52 4f 57 53 22 20 77 69 6e 64 6f 77 20 66 72 61  ROWS" window fra
15540 6d 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72 3a  mes, except for:
15550 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 4f 57  .  **.  **   ROW
15560 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
15570 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
15580 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20 20  D CURRENT ROW.  
15590 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 78 63 65  **.  ** The exce
155a0 70 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ption is because
155b0 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78   windowCodeRowEx
155c0 70 72 53 74 65 70 28 29 20 69 6d 70 6c 65 6d 65  prStep() impleme
155d0 6e 74 73 20 61 6c 6c 20 77 69 6e 64 6f 77 0a 20  nts all window. 
155e0 20 2a 2a 20 66 72 61 6d 65 20 74 79 70 65 73 20   ** frame types 
155f0 62 79 20 63 61 63 68 69 6e 67 20 74 68 65 20 65  by caching the e
15600 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f 6e 20  ntire partition 
15610 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c  in a temp table,
15620 20 61 6e 64 0a 20 20 2a 2a 20 22 52 4f 57 53 20   and.  ** "ROWS 
15630 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
15640 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
15650 43 55 52 52 45 4e 54 20 52 4f 57 22 20 69 73 20  CURRENT ROW" is 
15660 65 61 73 79 20 65 6e 6f 75 67 68 20 74 6f 0a 20  easy enough to. 
15670 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 77 69   ** implement wi
15680 74 68 6f 75 74 20 73 75 63 68 20 61 20 63 61 63  thout such a cac
15690 68 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69  he..  **.  ** wi
156a0 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65  ndowCodeCacheSte
156b0 70 28 29 20 69 73 20 75 73 65 64 20 66 6f 72 3a  p() is used for:
156c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 41 4e  .  **.  **   RAN
156d0 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  GE BETWEEN CURRE
156e0 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
156f0 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20  NDED FOLLOWING. 
15700 20 2a 2a 0a 20 20 2a 2a 20 49 74 20 69 73 20 61   **.  ** It is a
15710 6c 73 6f 20 75 73 65 64 20 66 6f 72 20 61 6e 79  lso used for any
15720 74 68 69 6e 67 20 6e 6f 74 20 68 61 6e 64 6c 65  thing not handle
15730 64 20 62 79 20 77 69 6e 64 6f 77 43 6f 64 65 52  d by windowCodeR
15740 6f 77 45 78 70 72 53 74 65 70 28 29 20 0a 20 20  owExprStep() .  
15750 2a 2a 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20  ** that invokes 
15760 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  a built-in windo
15770 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  w function that 
15780 72 65 71 75 69 72 65 73 20 74 68 65 20 65 6e 74  requires the ent
15790 69 72 65 20 0a 20 20 2a 2a 20 70 61 72 74 69 74  ire .  ** partit
157a0 69 6f 6e 20 74 6f 20 62 65 20 63 61 63 68 65 64  ion to be cached
157b0 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65   in a temp table
157c0 20 62 65 66 6f 72 65 20 61 6e 79 20 72 6f 77 73   before any rows
157d0 20 61 72 65 20 72 65 74 75 72 6e 65 64 0a 20 20   are returned.  
157e0 2a 2a 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ** (e.g. nth_val
157f0 75 65 28 29 20 6f 72 20 70 65 72 63 65 6e 74 5f  ue() or percent_
15800 72 61 6e 6b 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rank())..  **.  
15810 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 73 73 75  ** Finally, assu
15820 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e 6f  ming there is no
15830 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
15840 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 72   function that r
15850 65 71 75 69 72 65 73 0a 20 20 2a 2a 20 74 68 65  equires.  ** the
15860 20 70 61 72 74 69 74 69 6f 6e 20 74 6f 20 62 65   partition to be
15870 20 63 61 63 68 65 64 2c 20 77 69 6e 64 6f 77 43   cached, windowC
15880 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 29  odeDefaultStep()
15890 20 69 73 20 75 73 65 64 20 66 6f 72 3a 0a 20 20   is used for:.  
158a0 2a 2a 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20  **.  **   RANGE 
158b0 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
158c0 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
158d0 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a  CURRENT ROW .  *
158e0 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45  *   RANGE BETWEE
158f0 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
15900 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e  EDING AND UNBOUN
15910 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20  DED FOLLOWING.  
15920 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
15930 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
15940 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
15950 20 20 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57    **   ROWS BETW
15960 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
15970 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
15980 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a  ENT ROW.  **.  *
15990 2a 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61  * windowCodeDefa
159a0 75 6c 74 53 74 65 70 28 29 20 69 73 20 74 68 65  ultStep() is the
159b0 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65   only one of the
159c0 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
159d0 20 74 68 61 74 0a 20 20 2a 2a 20 64 6f 65 73 20   that.  ** does 
159e0 6e 6f 74 20 63 61 63 68 65 20 65 61 63 68 20 70  not cache each p
159f0 61 72 74 69 74 69 6f 6e 20 69 6e 20 61 20 74 65  artition in a te
15a00 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20  mp table before 
15a10 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a  beginning to.  *
15a20 2a 20 72 65 74 75 72 6e 20 72 6f 77 73 2e 0a 20  * return rows.. 
15a30 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
15a40 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20  >eType==TK_ROWS 
15a50 0a 20 20 20 26 26 20 28 70 4d 57 69 6e 2d 3e 65  .   && (pMWin->e
15a60 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
15a70 44 45 44 7c 7c 70 4d 57 69 6e 2d 3e 65 45 6e 64  DED||pMWin->eEnd
15a80 21 3d 54 4b 5f 43 55 52 52 45 4e 54 7c 7c 21 70  !=TK_CURRENT||!p
15a90 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 0a  MWin->pOrderBy).
15aa0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4d    ){.    if( (pM
15ab0 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f  Win->eStart!=TK_
15ac0 50 52 45 43 45 44 49 4e 47 20 26 26 20 70 4d 57  PRECEDING && pMW
15ad0 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 46  in->eStart!=TK_F
15ae0 4f 4c 4c 4f 57 49 4e 47 29 0a 20 20 20 20 20 7c  OLLOWING).     |
15af0 7c 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d  | (pMWin->eEnd!=
15b00 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26 20  TK_FOLLOWING && 
15b10 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f  pMWin->eEnd!=TK_
15b20 50 52 45 43 45 44 49 4e 47 29 20 0a 20 20 20 20  PRECEDING) .    
15b30 29 7b 0a 20 20 20 20 20 20 56 64 62 65 4d 6f 64  ){.      VdbeMod
15b40 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72  uleComment((pPar
15b50 73 65 2d 3e 70 56 64 62 65 2c 20 22 42 65 67 69  se->pVdbe, "Begi
15b60 6e 20 52 6f 77 45 78 70 72 53 74 65 70 28 29 22  n RowExprStep()"
15b70 29 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77  ));.      window
15b80 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
15b90 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
15ba0 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  o, regGosub, add
15bb0 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56  rGosub);.      V
15bc0 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
15bd0 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  ((pParse->pVdbe,
15be0 20 22 45 6e 64 20 52 6f 77 45 78 70 72 53 74 65   "End RowExprSte
15bf0 70 28 29 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  p()"));.    }els
15c00 65 7b 0a 20 20 20 20 20 20 56 64 62 65 4d 6f 64  e{.      VdbeMod
15c10 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72  uleComment((pPar
15c20 73 65 2d 3e 70 56 64 62 65 2c 20 22 42 65 67 69  se->pVdbe, "Begi
15c30 6e 20 77 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  n windowCodeStep
15c40 28 29 22 29 29 3b 0a 20 20 20 20 20 20 77 69 6e  ()"));.      win
15c50 64 6f 77 43 6f 64 65 53 74 65 70 28 70 50 61 72  dowCodeStep(pPar
15c60 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72  se, p, pWInfo, r
15c70 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
15c80 75 62 29 3b 0a 20 20 20 20 20 20 56 64 62 65 4d  ub);.      VdbeM
15c90 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50  oduleComment((pP
15ca0 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 22 45 6e  arse->pVdbe, "En
15cb0 64 20 77 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  d windowCodeStep
15cc0 28 29 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ()"));.    }.  }
15cd0 65 6c 73 65 7b 0a 20 20 20 20 57 69 6e 64 6f 77  else{.    Window
15ce0 20 2a 70 57 69 6e 3b 0a 20 20 20 20 69 6e 74 20   *pWin;.    int 
15cf0 62 43 61 63 68 65 20 3d 20 30 3b 20 20 20 20 20  bCache = 0;     
15d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15d10 65 20 74 6f 20 75 73 65 20 43 61 63 68 65 53 74  e to use CacheSt
15d20 65 70 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ep() */..    if(
15d30 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
15d40 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
15d50 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
15d60 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20  BOUNDED ){.     
15d70 20 62 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20   bCache = 1;.   
15d80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
15d90 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
15da0 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
15db0 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
15dc0 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63    FuncDef *pFunc
15dd0 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a   = pWin->pFunc;.
15de0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 75          if( (pFu
15df0 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
15e00 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
15e10 4f 57 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  OW_SIZE).       
15e20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61    || (pFunc->zNa
15e30 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
15e40 65 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  e).         || (
15e50 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69  pFunc->zName==fi
15e60 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20  rst_valueName). 
15e70 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e          || (pFun
15e80 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61  c->zName==leadNa
15e90 6d 65 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  me).         || 
15ea0 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c  (pFunc->zName==l
15eb0 61 67 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  agName).        
15ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 43 61  ){.          bCa
15ed0 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  che = 1;.       
15ee0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15ef0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15f00 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  }..    /* Otherw
15f10 69 73 65 2c 20 63 61 6c 6c 20 77 69 6e 64 6f 77  ise, call window
15f20 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
15f30 29 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ).  */.    if( b
15f40 43 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20 56  Cache ){.      V
15f50 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
15f60 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  ((pParse->pVdbe,
15f70 20 22 42 65 67 69 6e 20 43 61 63 68 65 53 74 65   "Begin CacheSte
15f80 70 28 29 22 29 29 3b 0a 20 20 20 20 20 20 77 69  p()"));.      wi
15f90 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65  ndowCodeCacheSte
15fa0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49  p(pParse, p, pWI
15fb0 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  nfo, regGosub, a
15fc0 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20  ddrGosub);.     
15fd0 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65   VdbeModuleComme
15fe0 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62  nt((pParse->pVdb
15ff0 65 2c 20 22 45 6e 64 20 43 61 63 68 65 53 74 65  e, "End CacheSte
16000 70 28 29 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  p()"));.    }els
16010 65 7b 0a 20 20 20 20 20 20 56 64 62 65 4d 6f 64  e{.      VdbeMod
16020 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72  uleComment((pPar
16030 73 65 2d 3e 70 56 64 62 65 2c 20 22 42 65 67 69  se->pVdbe, "Begi
16040 6e 20 44 65 66 61 75 6c 74 53 74 65 70 28 29 22  n DefaultStep()"
16050 29 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77  ));.      window
16060 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
16070 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66  pParse, p, pWInf
16080 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  o, regGosub, add
16090 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20 56  rGosub);.      V
160a0 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74  dbeModuleComment
160b0 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c  ((pParse->pVdbe,
160c0 20 22 45 6e 64 20 44 65 66 61 75 6c 74 53 74 65   "End DefaultSte
160d0 70 28 29 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20  p()"));.    }.  
160e0 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  }.}..#endif /* S
160f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
16100 57 46 55 4e 43 20 2a 2f 0a                       WFUNC */.