/ Hex Artifact Content
Login

Artifact 0e127e916e7a56a580242604d438707571ce250b4ad4ae1652b08fad716d9c56:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 7d 0a 73 74 61 74 69   (*p)++;.}.stati
16e0: 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65  c void row_numbe
16f0: 72 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69  rInvFunc(.  sqli
1700: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
1710: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
1720: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1730: 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61  **apArg.){.}.sta
1740: 74 69 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d  tic void row_num
1750: 62 65 72 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  berValueFunc(sql
1760: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1770: 74 78 29 7b 0a 20 20 69 36 34 20 2a 70 20 3d 20  tx){.  i64 *p = 
1780: 28 69 36 34 2a 29 73 71 6c 69 74 65 33 5f 61 67  (i64*)sqlite3_ag
1790: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
17a0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
17b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
17c0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
17d0: 28 70 20 3f 20 2a 70 20 3a 20 30 29 29 3b 0a 7d  (p ? *p : 0));.}
17e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20  ../*.** Context 
17f0: 6f 62 6a 65 63 74 20 74 79 70 65 20 75 73 65 64  object type used
1800: 20 62 79 20 72 61 6e 6b 28 29 2c 20 64 65 6e 73   by rank(), dens
1810: 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72 63 65 6e  e_rank(), percen
1820: 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a 2a 2a 20  t_rank() and.** 
1830: 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a 2a 2f 0a  cume_dist()..*/.
1840: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
1850: 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c 75 65 3b   {.  i64 nValue;
1860: 0a 20 20 69 36 34 20 6e 53 74 65 70 3b 0a 20 20  .  i64 nStep;.  
1870: 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d 3b 0a 0a  i64 nTotal;.};..
1880: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1890: 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e  tion of built-in
18a0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
18b0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 2e 20 41   dense_rank(). A
18c0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
18d0: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
18e0: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
18f0: 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42  .**.**   RANGE B
1900: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
1910: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
1920: 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73  URRENT ROW .*/.s
1930: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1940: 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20  _rankStepFunc(. 
1950: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1960: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1970: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1980: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1990: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
19a0: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
19b0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
19c0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
19d0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
19e0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
19f0: 66 28 20 70 20 29 20 70 2d 3e 6e 53 74 65 70 20  f( p ) p->nStep 
1a00: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
1a10: 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b 49 6e 76  id dense_rankInv
1a20: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1a30: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1a40: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1a50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1a60: 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20  Arg.){.}.static 
1a70: 76 6f 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b 56  void dense_rankV
1a80: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
1a90: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
1aa0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
1ab0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
1ac0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
1ad0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
1ae0: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
1af0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1b00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
1b10: 20 70 2d 3e 6e 53 74 65 70 20 29 7b 0a 20 20 20   p->nStep ){.   
1b20: 20 20 20 70 2d 3e 6e 56 61 6c 75 65 2b 2b 3b 0a     p->nValue++;.
1b30: 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d        p->nStep =
1b40: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
1b50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1b60: 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e 56 61 6c  64(pCtx, p->nVal
1b70: 75 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ue);.  }.}../*.*
1b80: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1b90: 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e   of built-in win
1ba0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 72 61 6e  dow function ran
1bb0: 6b 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61  k(). Assumes tha
1bc0: 74 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20  t.** the window 
1bd0: 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73  frame has been s
1be0: 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  et to:.**.**   R
1bf0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
1c00: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
1c10: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
1c20: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
1c30: 20 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20   rankStepFunc(. 
1c40: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1c50: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1c60: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1c70: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1c80: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
1c90: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
1ca0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
1cb0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1cc0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
1cd0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
1ce0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  f( p ){.    p->n
1cf0: 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Step++;.    if( 
1d00: 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20 29 7b 0a  p->nValue==0 ){.
1d10: 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20        p->nValue 
1d20: 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20  = p->nStep;.    
1d30: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
1d40: 6f 69 64 20 72 61 6e 6b 49 6e 76 46 75 6e 63 28  oid rankInvFunc(
1d50: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1d60: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
1d70: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
1d80: 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29  _value **apArg.)
1d90: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
1da0: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
1db0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1dc0: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
1dd0: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1de0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1df0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1e00: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1e10: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1e20: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1e30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1e40: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
1e50: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
1e60: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
1e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1e80: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1e90: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1ea0: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
1eb0: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
1ec0: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
1ed0: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
1ee0: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41  t to:.**.**   RA
1ef0: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
1f00: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
1f10: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
1f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f30: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
1f40: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1f50: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1f60: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1f70: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1f80: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
1f90: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1fa0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1fb0: 29 3b 0a 0a 20 20 70 20 3d 20 28 73 74 72 75 63  );..  p = (struc
1fc0: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
1fd0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1fe0: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
1ff0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
2000: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
2010: 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  nTotal==0 ){.   
2020: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73     p->nTotal = s
2030: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2040: 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20  64(apArg[0]);.  
2050: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70    }.    p->nStep
2060: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ++;.    if( p->n
2070: 56 61 6c 75 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Value==0 ){.    
2080: 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20 70 2d    p->nValue = p-
2090: 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 0a 20 20  >nStep;.    }.  
20a0: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
20b0: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 49 6e 76 46  percent_rankInvF
20c0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
20d0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
20e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
20f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
2100: 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  rg.){.}.static v
2110: 6f 69 64 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  oid percent_rank
2120: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
2130: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
2140: 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43  {.  struct CallC
2150: 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28  ount *p;.  p = (
2160: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
2170: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
2180: 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78  ate_context(pCtx
2190: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
21a0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
21b0: 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31 20 29 7b  ( p->nTotal>1 ){
21c0: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
21d0: 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 56  = (double)(p->nV
21e0: 61 6c 75 65 2d 31 29 20 2f 20 28 64 6f 75 62 6c  alue-1) / (doubl
21f0: 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b  e)(p->nTotal-1);
2200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
2210: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74  esult_double(pCt
2220: 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  x, r);.    }else
2230: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2240: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43  result_double(pC
2250: 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20 20 7d 0a  tx, 0.0);.    }.
2260: 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20      p->nValue = 
2270: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
2280: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
2290: 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  f built-in windo
22a0: 77 20 66 75 6e 63 74 69 6f 6e 20 63 75 6d 65 5f  w function cume_
22b0: 64 69 73 74 28 29 2e 20 41 73 73 75 6d 65 73 20  dist(). Assumes 
22c0: 74 68 61 74 0a 2a 2a 20 74 68 65 20 77 69 6e 64  that.** the wind
22d0: 6f 77 20 66 72 61 6d 65 20 68 61 73 20 62 65 65  ow frame has bee
22e0: 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  n set to:.**.** 
22f0: 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20    RANGE BETWEEN 
2300: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
2310: 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
2320: 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ROW .*/.static v
2330: 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 53 74 65  oid cume_distSte
2340: 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  pFunc(.  sqlite3
2350: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2360: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
2370: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2380: 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74  pArg.){.  struct
2390: 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20   CallCount *p;. 
23a0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
23b0: 20 29 3b 0a 0a 20 20 70 20 3d 20 28 73 74 72 75   );..  p = (stru
23c0: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71  ct CallCount*)sq
23d0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
23e0: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
23f0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
2400: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
2410: 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20  >nTotal==0 ){.  
2420: 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20      p->nTotal = 
2430: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2440: 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20  t64(apArg[0]);. 
2450: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53 74 65     }.    p->nSte
2460: 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  p++;.  }.}.stati
2470: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
2480: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
2490: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
24a0: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
24b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
24c0: 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74  *apArg.){.}.stat
24d0: 69 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73  ic void cume_dis
24e0: 74 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  tValueFunc(sqlit
24f0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2500: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
2510: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
2520: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
2530: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
2540: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
2550: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
2560: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 54    if( p && p->nT
2570: 6f 74 61 6c 20 29 7b 0a 20 20 20 20 64 6f 75 62  otal ){.    doub
2580: 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28  le r = (double)(
2590: 70 2d 3e 6e 53 74 65 70 29 20 2f 20 28 64 6f 75  p->nStep) / (dou
25a0: 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 29 3b  ble)(p->nTotal);
25b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
25c0: 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c  ult_double(pCtx,
25d0: 20 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   r);.  }.}../*.*
25e0: 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  * Context object
25f0: 20 66 6f 72 20 6e 74 69 6c 65 28 29 20 77 69 6e   for ntile() win
2600: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  dow function..*/
2610: 0a 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78  .struct NtileCtx
2620: 20 7b 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b   {.  i64 nTotal;
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 72 6f       /* Total ro
2650: 77 73 20 69 6e 20 70 61 72 74 69 74 69 6f 6e 20  ws in partition 
2660: 2a 2f 0a 20 20 69 36 34 20 6e 50 61 72 61 6d 3b  */.  i64 nParam;
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65       /* Paramete
2690: 72 20 70 61 73 73 65 64 20 74 6f 20 6e 74 69 6c  r passed to ntil
26a0: 65 28 4e 29 20 2a 2f 0a 20 20 69 36 34 20 69 52  e(N) */.  i64 iR
26b0: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26d0: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a  rent row */.};..
26e0: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
26f0: 74 69 6f 6e 20 6f 66 20 6e 74 69 6c 65 28 29 2e  tion of ntile().
2700: 20 54 68 69 73 20 61 73 73 75 6d 65 73 20 74 68   This assumes th
2710: 61 74 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  at the window fr
2720: 61 6d 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  ame has.** been 
2730: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
2740: 2a 20 20 20 52 4f 57 53 20 55 4e 42 4f 55 4e 44  *   ROWS UNBOUND
2750: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
2760: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2f 0a   CURRENT ROW.*/.
2770: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c  static void ntil
2780: 65 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c  eStepFunc(.  sql
2790: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
27a0: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
27b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
27c0: 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74   **apArg.){.  st
27d0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70  ruct NtileCtx *p
27e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
27f0: 3d 3d 32 20 29 3b 0a 20 20 70 20 3d 20 28 73 74  ==2 );.  p = (st
2800: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
2810: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2820: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2830: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2840: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
2850: 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20  ->nTotal==0 ){. 
2860: 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20 3d       p->nParam =
2870: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2880: 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a  nt64(apArg[0]);.
2890: 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20        p->nTotal 
28a0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
28b0: 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d 29 3b  int64(apArg[1]);
28c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50  .      if( p->nP
28d0: 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  aram<=0 ){.     
28e0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
28f0: 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20  t_error(.       
2900: 20 20 20 20 20 70 43 74 78 2c 20 22 61 72 67 75       pCtx, "argu
2910: 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75  ment of ntile mu
2920: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
2930: 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20   integer", -1.  
2940: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2950: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 52  .    }.    p->iR
2960: 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ow++;.  }.}.stat
2970: 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 49 6e 76  ic void ntileInv
2980: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
2990: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
29a0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
29b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
29c0: 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20  Arg.){.}.static 
29d0: 76 6f 69 64 20 6e 74 69 6c 65 56 61 6c 75 65 46  void ntileValueF
29e0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
29f0: 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74  ext *pCtx){.  st
2a00: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70  ruct NtileCtx *p
2a10: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
2a20: 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65  NtileCtx*)sqlite
2a30: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2a40: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2a50: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2a60: 26 20 70 2d 3e 6e 50 61 72 61 6d 3e 30 20 29 7b  & p->nParam>0 ){
2a70: 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d  .    int nSize =
2a80: 20 28 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20 70 2d   (p->nTotal / p-
2a90: 3e 6e 50 61 72 61 6d 29 3b 0a 20 20 20 20 69 66  >nParam);.    if
2aa0: 28 20 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  ( nSize==0 ){.  
2ab0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2ac0: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
2ad0: 2d 3e 69 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  ->iRow);.    }el
2ae0: 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 4c  se{.      i64 nL
2af0: 61 72 67 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c  arge = p->nTotal
2b00: 20 2d 20 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69   - p->nParam*nSi
2b10: 7a 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53  ze;.      i64 iS
2b20: 6d 61 6c 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e  mall = nLarge*(n
2b30: 53 69 7a 65 2b 31 29 3b 0a 20 20 20 20 20 20 69  Size+1);.      i
2b40: 36 34 20 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f  64 iRow = p->iRo
2b50: 77 2d 31 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  w-1;..      asse
2b60: 72 74 28 20 28 6e 4c 61 72 67 65 2a 28 6e 53 69  rt( (nLarge*(nSi
2b70: 7a 65 2b 31 29 20 2b 20 28 70 2d 3e 6e 50 61 72  ze+1) + (p->nPar
2b80: 61 6d 2d 6e 4c 61 72 67 65 29 2a 6e 53 69 7a 65  am-nLarge)*nSize
2b90: 29 3d 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29 3b 0a  )==p->nTotal );.
2ba0: 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 3c  .      if( iRow<
2bb0: 69 53 6d 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20  iSmall ){.      
2bc0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2bd0: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b  _int64(pCtx, 1 +
2be0: 20 69 52 6f 77 2f 28 6e 53 69 7a 65 2b 31 29 29   iRow/(nSize+1))
2bf0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2c00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2c10: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2c20: 2c 20 31 20 2b 20 6e 4c 61 72 67 65 20 2b 20 28  , 1 + nLarge + (
2c30: 69 52 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e 53 69  iRow-iSmall)/nSi
2c40: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
2c50: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
2c60: 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66  Context object f
2c70: 6f 72 20 6c 61 73 74 5f 76 61 6c 75 65 28 29 20  or last_value() 
2c80: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e  window function.
2c90: 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 61 73 74 56  .*/.struct LastV
2ca0: 61 6c 75 65 43 74 78 20 7b 0a 20 20 73 71 6c 69  alueCtx {.  sqli
2cb0: 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
2cc0: 0a 20 20 69 6e 74 20 6e 56 61 6c 3b 0a 7d 3b 0a  .  int nVal;.};.
2cd0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2ce0: 61 74 69 6f 6e 20 6f 66 20 6c 61 73 74 5f 76 61  ation of last_va
2cf0: 6c 75 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lue()..*/.static
2d00: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2d10: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2d20: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2d30: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2d40: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2d50: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
2d60: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
2d70: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
2d80: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a  ct LastValueCtx*
2d90: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2da0: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2db0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2dc0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
2dd0: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
2de0: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
2df0: 3e 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f  >pVal = sqlite3_
2e00: 76 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b  value_dup(apArg[
2e10: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0]);.    if( p->
2e20: 70 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pVal==0 ){.     
2e30: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2e40: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78  error_nomem(pCtx
2e50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e60: 20 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20      p->nVal++;. 
2e70: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2e80: 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75  c void last_valu
2e90: 65 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69  eInvFunc(.  sqli
2ea0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2eb0: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
2ec0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2ed0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
2ee0: 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78  uct LastValueCtx
2ef0: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
2f00: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a  ct LastValueCtx*
2f10: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2f20: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2f30: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2f40: 69 66 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b  if( ALWAYS(p) ){
2f50: 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 2d 2d 3b 0a  .    p->nVal--;.
2f60: 20 20 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 3d      if( p->nVal=
2f70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2f80: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
2f90: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 70  ->pVal);.      p
2fa0: 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ->pVal = 0;.    
2fb0: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
2fc0: 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 56 61  oid last_valueVa
2fd0: 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  lueFunc(sqlite3_
2fe0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
2ff0: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
3000: 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ueCtx *p;.  p = 
3010: 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75  (struct LastValu
3020: 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67  eCtx*)sqlite3_ag
3030: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
3040: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
3050: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
3060: 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  >pVal ){.    sql
3070: 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75  ite3_result_valu
3080: 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29  e(pCtx, p->pVal)
3090: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
30a0: 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 46 69  oid last_valueFi
30b0: 6e 61 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74  nalizeFunc(sqlit
30c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
30d0: 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73 74  ){.  struct Last
30e0: 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70  ValueCtx *p;.  p
30f0: 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74 56   = (struct LastV
3100: 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33  alueCtx*)sqlite3
3110: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
3120: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
3130: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26  *p));.  if( p &&
3140: 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20   p->pVal ){.    
3150: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
3160: 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56  alue(pCtx, p->pV
3170: 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
3180: 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70  _value_free(p->p
3190: 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61  Val);.    p->pVa
31a0: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  l = 0;.  }.}../*
31b0: 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d  .** No-op implem
31c0: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 6e 74 68  entations of nth
31d0: 5f 76 61 6c 75 65 28 29 2c 20 66 69 72 73 74 5f  _value(), first_
31e0: 76 61 6c 75 65 28 29 2c 20 6c 65 61 64 28 29 20  value(), lead() 
31f0: 61 6e 64 20 6c 61 67 28 29 2e 0a 2a 2a 20 54 68  and lag()..** Th
3200: 65 73 65 20 61 72 65 20 61 6c 6c 20 69 6d 70 6c  ese are all impl
3210: 65 6d 65 6e 74 65 64 20 69 6e 6c 69 6e 65 20 75  emented inline u
3220: 73 69 6e 67 20 56 44 42 45 20 69 6e 73 74 72 75  sing VDBE instru
3230: 63 74 69 6f 6e 73 2e 20 0a 2a 2f 0a 73 74 61 74  ctions. .*/.stat
3240: 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75  ic void nth_valu
3250: 65 53 74 65 70 46 75 6e 63 28 73 71 6c 69 74 65  eStepFunc(sqlite
3260: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3270: 20 69 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f   int n, sqlite3_
3280: 76 61 6c 75 65 20 2a 2a 61 29 7b 7d 0a 73 74 61  value **a){}.sta
3290: 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c  tic void nth_val
32a0: 75 65 49 6e 76 46 75 6e 63 28 73 71 6c 69 74 65  ueInvFunc(sqlite
32b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
32c0: 20 69 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f   int n, sqlite3_
32d0: 76 61 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a 73 74  value **ap){}.st
32e0: 61 74 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61  atic void nth_va
32f0: 6c 75 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  lueValueFunc(sql
3300: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
3310: 74 78 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69  tx){}.static voi
3320: 64 20 66 69 72 73 74 5f 76 61 6c 75 65 53 74 65  d first_valueSte
3330: 70 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  pFunc(sqlite3_co
3340: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 6e 2c  ntext *p, int n,
3350: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3360: 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f  *ap){}.static vo
3370: 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65 49 6e  id first_valueIn
3380: 76 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  vFunc(sqlite3_co
3390: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 6e 2c  ntext *p, int n,
33a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
33b0: 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f  *ap){}.static vo
33c0: 69 64 20 66 69 72 73 74 5f 76 61 6c 75 65 56 61  id first_valueVa
33d0: 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  lueFunc(sqlite3_
33e0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 7d  context *pCtx){}
33f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61  .static void lea
3400: 64 53 74 65 70 46 75 6e 63 28 73 71 6c 69 74 65  dStepFunc(sqlite
3410: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3420: 20 69 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f   int n, sqlite3_
3430: 76 61 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a 73 74  value **ap){}.st
3440: 61 74 69 63 20 76 6f 69 64 20 6c 65 61 64 49 6e  atic void leadIn
3450: 76 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  vFunc(sqlite3_co
3460: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74  ntext *pCtx, int
3470: 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   n, sqlite3_valu
3480: 65 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63  e **ap){}.static
3490: 20 76 6f 69 64 20 6c 65 61 64 56 61 6c 75 65 46   void leadValueF
34a0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
34b0: 65 78 74 20 2a 70 43 74 78 29 7b 7d 0a 73 74 61  ext *pCtx){}.sta
34c0: 74 69 63 20 76 6f 69 64 20 6c 61 67 53 74 65 70  tic void lagStep
34d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
34e0: 74 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20  text *pCtx, int 
34f0: 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  n, sqlite3_value
3500: 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20   **ap){}.static 
3510: 76 6f 69 64 20 6c 61 67 49 6e 76 46 75 6e 63 28  void lagInvFunc(
3520: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3530: 2a 70 43 74 78 2c 20 69 6e 74 20 6e 2c 20 73 71  *pCtx, int n, sq
3540: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
3550: 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ){}.static void 
3560: 6c 61 67 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  lagValueFunc(sql
3570: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
3580: 74 78 29 7b 7d 0a 0a 23 64 65 66 69 6e 65 20 57  tx){}..#define W
3590: 49 4e 44 4f 57 46 55 4e 43 28 6e 61 6d 65 2c 6e  INDOWFUNC(name,n
35a0: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
35e0: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
35f0: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3600: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3620: 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46  .  name ## StepF
3630: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
3640: 75 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  ueFunc, name ## 
3650: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3660: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3670: 6e 61 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c  name ## InvFunc,
3680: 20 23 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20   #name          
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e       \.}..#defin
36c0: 65 20 57 49 4e 44 4f 57 46 55 4e 43 46 28 6e 61  e WINDOWFUNCF(na
36d0: 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29 20 7b  me,nArg,extra) {
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28       \.  nArg, (
3710: 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49  SQLITE_UTF8|SQLI
3720: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65  TE_FUNC_WINDOW|e
3730: 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20  xtra), 0, 0,    
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 53 74    \.  name ## St
3760: 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  epFunc, name ## 
3770: 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20 6e 61  FinalizeFunc, na
3780: 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c  me ## ValueFunc,
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
37a0: 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76 46 75  .  name ## InvFu
37b0: 6e 63 2c 20 23 6e 61 6d 65 20 20 20 20 20 20 20  nc, #name       
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a          \.}../*.
37f0: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 6f 73  ** Register thos
3800: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
3810: 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  w functions that
3820: 20 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67   are not also ag
3830: 67 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69  gregates..*/.voi
3840: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46  d sqlite3WindowF
3850: 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a  unctions(void){.
3860: 20 20 73 74 61 74 69 63 20 46 75 6e 63 44 65 66    static FuncDef
3870: 20 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20   aWindowFuncs[] 
3880: 3d 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  = {.    WINDOWFU
3890: 4e 43 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30  NC(row_number, 0
38a0: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
38b0: 46 55 4e 43 28 64 65 6e 73 65 5f 72 61 6e 6b 2c  FUNC(dense_rank,
38c0: 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44   0, 0),.    WIND
38d0: 4f 57 46 55 4e 43 28 72 61 6e 6b 2c 20 30 2c 20  OWFUNC(rank, 0, 
38e0: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
38f0: 4e 43 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c  NC(percent_rank,
3900: 20 30 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f   0, SQLITE_FUNC_
3910: 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20  WINDOW_SIZE),.  
3920: 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 63 75 6d    WINDOWFUNC(cum
3930: 65 5f 64 69 73 74 2c 20 30 2c 20 53 51 4c 49 54  e_dist, 0, SQLIT
3940: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49  E_FUNC_WINDOW_SI
3950: 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46  ZE),.    WINDOWF
3960: 55 4e 43 28 6e 74 69 6c 65 2c 20 31 2c 20 53 51  UNC(ntile, 1, SQ
3970: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
3980: 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44  _SIZE),.    WIND
3990: 4f 57 46 55 4e 43 46 28 6c 61 73 74 5f 76 61 6c  OWFUNCF(last_val
39a0: 75 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57  ue, 1, 0),.    W
39b0: 49 4e 44 4f 57 46 55 4e 43 28 6e 74 68 5f 76 61  INDOWFUNC(nth_va
39c0: 6c 75 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20  lue, 2, 0),.    
39d0: 57 49 4e 44 4f 57 46 55 4e 43 28 66 69 72 73 74  WINDOWFUNC(first
39e0: 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20  _value, 1, 0),. 
39f0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65     WINDOWFUNC(le
3a00: 61 64 2c 20 31 2c 20 30 29 2c 20 57 49 4e 44 4f  ad, 1, 0), WINDO
3a10: 57 46 55 4e 43 28 6c 65 61 64 2c 20 32 2c 20 30  WFUNC(lead, 2, 0
3a20: 29 2c 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65  ), WINDOWFUNC(le
3a30: 61 64 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57  ad, 3, 0),.    W
3a40: 49 4e 44 4f 57 46 55 4e 43 28 6c 61 67 2c 20 31  INDOWFUNC(lag, 1
3a50: 2c 20 30 29 2c 20 20 57 49 4e 44 4f 57 46 55 4e  , 0),  WINDOWFUN
3a60: 43 28 6c 61 67 2c 20 32 2c 20 30 29 2c 20 20 57  C(lag, 2, 0),  W
3a70: 49 4e 44 4f 57 46 55 4e 43 28 6c 61 67 2c 20 33  INDOWFUNC(lag, 3
3a80: 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c  , 0),.  };.  sql
3a90: 69 74 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69  ite3InsertBuilti
3aa0: 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f 77 46 75  nFuncs(aWindowFu
3ab0: 6e 63 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61  ncs, ArraySize(a
3ac0: 57 69 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a 7d  WindowFuncs));.}
3ad0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3ae0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
3af0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
3b00: 72 20 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20  r resolving the 
3b10: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a  function name.**
3b20: 20 66 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75   for a window fu
3b30: 6e 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20  nction within a 
3b40: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3b50: 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74  . Argument pList
3b60: 20 69 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20   is a.** linked 
3b70: 6c 69 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64  list of WINDOW d
3b80: 65 66 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74  efinitions for t
3b90: 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
3ba0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
3bb0: 41 72 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69  Argument pFunc i
3bc0: 73 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  s the function d
3bd0: 65 66 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72  efinition just r
3be0: 65 73 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e  esolved and pWin
3bf0: 0a 2a 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f  .** is the Windo
3c00: 77 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  w object represe
3c10: 6e 74 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69  nting the associ
3c20: 61 74 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65  ated OVER clause
3c30: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
3c40: 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20 63  on updates the c
3c50: 6f 6e 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20  ontents of pWin 
3c60: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3c70: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45  *   * If the OVE
3c80: 52 20 63 6c 61 75 73 65 20 72 65 66 65 72 65 64  R clause refered
3c90: 20 74 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64   to a named wind
3ca0: 6f 77 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78  ow (as in "max(x
3cb0: 29 20 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a  ) OVER win"),.**
3cc0: 20 20 20 20 20 73 65 61 72 63 68 20 6c 69 73 74       search list
3cd0: 20 70 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74   pList for a mat
3ce0: 63 68 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66  ching WINDOW def
3cf0: 69 6e 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64  inition, and upd
3d00: 61 74 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20  ate pWin.**     
3d10: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
3d20: 6e 6f 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63  no such WINDOW c
3d30: 6c 61 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75  lause can be fou
3d40: 6e 64 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  nd, leave an err
3d50: 6f 72 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61  or.**     in pPa
3d60: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  rse..**.**   * I
3d70: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  f the function i
3d80: 73 20 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  s a built-in win
3d90: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  dow function tha
3da0: 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a  t requires the.*
3db0: 2a 20 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20  *     window to 
3dc0: 62 65 20 63 6f 65 72 63 65 64 20 28 73 65 65 20  be coerced (see 
3dd0: 22 42 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57  "BUILT-IN WINDOW
3de0: 20 46 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74   FUNCTIONS" at t
3df0: 68 65 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66  he top.**     of
3e00: 20 74 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69   this file), pWi
3e10: 6e 20 69 73 20 75 70 64 61 74 65 64 20 68 65 72  n is updated her
3e20: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
3e30: 65 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a  e3WindowUpdate(.
3e40: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3e50: 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73   .  Window *pLis
3e60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
3e70: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e      /* List of n
3e80: 61 6d 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72  amed windows for
3e90: 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
3ea0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20    Window *pWin, 
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d    /* Window fram
3ed0: 65 20 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20  e to update */. 
3ee0: 20 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20   FuncDef *pFunc 
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 20 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74   /* Window funct
3f10: 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a  ion definition *
3f20: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d  /.){.  if( pWin-
3f30: 3e 7a 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e  >zName && pWin->
3f40: 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eType==0 ){.    
3f50: 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20 20 20 66  Window *p;.    f
3f60: 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
3f70: 3d 70 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  =p->pNextWin){. 
3f80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3f90: 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65  StrICmp(p->zName
3fa0: 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29 3d 3d  , pWin->zName)==
3fb0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
3fc0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
3fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3fe0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3ff0: 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20  no such window: 
4000: 25 73 22 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65  %s", pWin->zName
4010: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
4020: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 2d  .    }.    pWin-
4030: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71  >pPartition = sq
4040: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
4050: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
4060: 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
4070: 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72      pWin->pOrder
4080: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
4090: 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
40a0: 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
40b0: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70   0);.    pWin->p
40c0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45  Start = sqlite3E
40d0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
40e0: 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29  b, p->pStart, 0)
40f0: 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64  ;.    pWin->pEnd
4100: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4110: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  p(pParse->db, p-
4120: 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 70  >pEnd, 0);.    p
4130: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d  Win->eStart = p-
4140: 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 70 57 69  >eStart;.    pWi
4150: 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e  n->eEnd = p->eEn
4160: 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 54 79  d;.    pWin->eTy
4170: 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20  pe = p->eType;. 
4180: 20 7d 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e   }.  if( pFunc->
4190: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
41a0: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29  TE_FUNC_WINDOW )
41b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
41c0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
41d0: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
41e0: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  ilter ){.      s
41f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4200: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
4210: 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65    "FILTER clause
4220: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
4230: 64 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  d with aggregate
4240: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4250: 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  s".      );.    
4260: 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 46  }else.    if( pF
4270: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 72 6f 77  unc->xSFunc==row
4280: 5f 6e 75 6d 62 65 72 53 74 65 70 46 75 6e 63 20  _numberStepFunc 
4290: 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  || pFunc->xSFunc
42a0: 3d 3d 6e 74 69 6c 65 53 74 65 70 46 75 6e 63 20  ==ntileStepFunc 
42b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
42c0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
42d0: 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20  Win->pStart);.  
42e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
42f0: 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e  elete(db, pWin->
4300: 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69  pEnd);.      pWi
4310: 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e  n->pStart = pWin
4320: 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20  ->pEnd = 0;.    
4330: 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20    pWin->eType = 
4340: 54 4b 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70  TK_ROWS;.      p
4350: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b  Win->eStart = TK
4360: 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20  _UNBOUNDED;.    
4370: 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54    pWin->eEnd = T
4380: 4b 5f 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d  K_CURRENT;.    }
4390: 65 6c 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46  else..    if( pF
43a0: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 64 65 6e  unc->xSFunc==den
43b0: 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 20  se_rankStepFunc 
43c0: 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  || pFunc->xSFunc
43d0: 3d 3d 72 61 6e 6b 53 74 65 70 46 75 6e 63 0a 20  ==rankStepFunc. 
43e0: 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53      || pFunc->xS
43f0: 46 75 6e 63 3d 3d 70 65 72 63 65 6e 74 5f 72 61  Func==percent_ra
4400: 6e 6b 53 74 65 70 46 75 6e 63 20 7c 7c 20 70 46  nkStepFunc || pF
4410: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 63 75 6d  unc->xSFunc==cum
4420: 65 5f 64 69 73 74 53 74 65 70 46 75 6e 63 0a 20  e_distStepFunc. 
4430: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
4440: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4450: 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b  , pWin->pStart);
4460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4470: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4480: 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 20 20  n->pEnd);.      
4490: 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70  pWin->pStart = p
44a0: 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20  Win->pEnd = 0;. 
44b0: 20 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65       pWin->eType
44c0: 20 3d 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 20   = TK_RANGE;.   
44d0: 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20     pWin->eStart 
44e0: 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a  = TK_UNBOUNDED;.
44f0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64        pWin->eEnd
4500: 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b 0a 20   = TK_CURRENT;. 
4510: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 69 6e 2d     }.  }.  pWin-
4520: 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0a  >pFunc = pFunc;.
4530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74  }../*.** Context
4540: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 74   object passed t
4550: 68 72 6f 75 67 68 20 73 71 6c 69 74 65 33 57 61  hrough sqlite3Wa
4560: 6c 6b 45 78 70 72 4c 69 73 74 28 29 20 74 6f 0a  lkExprList() to.
4570: 2a 2a 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52  ** selectWindowR
4580: 65 77 72 69 74 65 45 78 70 72 43 62 28 29 20 62  ewriteExprCb() b
4590: 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  y selectWindowRe
45a0: 77 72 69 74 65 45 4c 69 73 74 28 29 2e 0a 2a 2f  writeEList()..*/
45b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
45c0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 57 69  WindowRewrite Wi
45d0: 6e 64 6f 77 52 65 77 72 69 74 65 3b 0a 73 74 72  ndowRewrite;.str
45e0: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
45f0: 65 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e {.  Window *pW
4600: 69 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  in;.  ExprList *
4610: 70 53 75 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  pSub;.};../*.** 
4620: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
4630: 6e 20 75 73 65 64 20 62 79 20 73 65 6c 65 63 74  n used by select
4640: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
4650: 73 74 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61  st(). If necessa
4660: 72 79 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ry,.** this func
4670: 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20  tion appends to 
4680: 74 68 65 20 6f 75 74 70 75 74 20 65 78 70 72 65  the output expre
4690: 73 73 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75  ssion-list and u
46a0: 70 64 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65  pdates .** expre
46b0: 73 73 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20  ssion (*ppExpr) 
46c0: 69 6e 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61  in place..*/.sta
46d0: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69  tic int selectWi
46e0: 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43  ndowRewriteExprC
46f0: 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  b(Walker *pWalke
4700: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
4710: 0a 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  .  struct Window
4720: 52 65 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61  Rewrite *p = pWa
4730: 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65  lker->u.pRewrite
4740: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
4750: 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
4760: 72 73 65 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  rse;..  switch( 
4770: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20  pExpr->op ){..  
4780: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
4790: 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45  ON:.      if( pE
47a0: 78 70 72 2d 3e 70 57 69 6e 3d 3d 30 20 29 7b 0a  xpr->pWin==0 ){.
47b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
47c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
47d0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
47e0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 57  ;.        for(pW
47f0: 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e  in=p->pWin; pWin
4800: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
4810: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20  xtWin){.        
4820: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 57 69    if( pExpr->pWi
4830: 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  n==pWin ){.     
4840: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
4850: 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70 45 78  Win->pOwner==pEx
4860: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pr );.          
4870: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
4880: 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ne;.          }.
4890: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
48a0: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
48b0: 74 68 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20  through.  */..  
48c0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
48d0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65  NCTION:.    case
48e0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
48f0: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d      Expr *pDup =
4900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4910: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
4920: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e  r, 0);.      p->
4930: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 45 78  pSub = sqlite3Ex
4940: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
4950: 72 73 65 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44  rse, p->pSub, pD
4960: 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  up);.      if( p
4970: 2d 3e 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  ->pSub ){.      
4980: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
4990: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
49a0: 20 45 50 5f 53 74 61 74 69 63 29 3d 3d 30 20 29   EP_Static)==0 )
49b0: 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53 65  ;.        ExprSe
49c0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
49d0: 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20   EP_Static);.   
49e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
49f0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
4a00: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  b, pExpr);.     
4a10: 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70     ExprClearProp
4a20: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
4a30: 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20  tatic);.        
4a40: 6d 65 6d 73 65 74 28 70 45 78 70 72 2c 20 30 2c  memset(pExpr, 0,
4a50: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a   sizeof(Expr));.
4a60: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
4a70: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
4a80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4a90: 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62  Column = p->pSub
4aa0: 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 20  ->nExpr-1;.     
4ab0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
4ac0: 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68   = p->pWin->iEph
4ad0: 43 73 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Csr;.      }..  
4ae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4af0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f  ..    default: /
4b00: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20  * no-op */.     
4b10: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72   break;.  }..  r
4b20: 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
4b30: 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ue;.}.static int
4b40: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
4b50: 72 69 74 65 53 65 6c 65 63 74 43 62 28 57 61 6c  riteSelectCb(Wal
4b60: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
4b70: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
4b80: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
4b90: 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74  ne;.}.../*.** It
4ba0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 61  erate through ea
4bb0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
4bc0: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
4bd0: 20 70 45 4c 69 73 74 2e 20 46 6f 72 20 65 61 63   pEList. For eac
4be0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 4b 5f  h:.**.**   * TK_
4bf0: 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20 20 2a 20 61  COLUMN,.**   * a
4c00: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
4c10: 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 77 69 6e  n, or.**   * win
4c20: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  dow function wit
4c30: 68 20 61 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63  h a Window objec
4c40: 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
4c50: 6d 65 6d 62 65 72 20 6f 66 20 74 68 65 20 0a 2a  member of the .*
4c60: 2a 20 20 20 20 20 6c 69 6e 6b 65 64 20 6c 69 73  *     linked lis
4c70: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
4c80: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
4c90: 28 70 57 69 6e 29 0a 2a 2a 0a 2a 2a 20 41 70 70  (pWin).**.** App
4ca0: 65 6e 64 20 74 68 65 20 6e 6f 64 65 20 74 6f 20  end the node to 
4cb0: 6f 75 74 70 75 74 20 65 78 70 72 65 73 73 69 6f  output expressio
4cc0: 6e 2d 6c 69 73 74 20 28 2a 70 70 53 75 62 29 2e  n-list (*ppSub).
4cd0: 20 41 6e 64 20 72 65 70 6c 61 63 65 20 69 74 0a   And replace it.
4ce0: 2a 2a 20 77 69 74 68 20 61 20 54 4b 5f 43 4f 4c  ** with a TK_COL
4cf0: 55 4d 4e 20 74 68 61 74 20 72 65 61 64 73 20 74  UMN that reads t
4d00: 68 65 20 28 4e 2d 31 29 74 68 20 65 6c 65 6d 65  he (N-1)th eleme
4d10: 6e 74 20 6f 66 20 74 61 62 6c 65 20 0a 2a 2a 20  nt of table .** 
4d20: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 77  pWin->iEphCsr, w
4d30: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
4d40: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4d50: 20 69 6e 20 28 2a 70 70 53 75 62 29 20 61 66 74   in (*ppSub) aft
4d60: 65 72 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20  er.** appending 
4d70: 74 68 65 20 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a  the new one..*/.
4d80: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
4d90: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
4da0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
4db0: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
4dc0: 20 2a 70 57 69 6e 2c 0a 20 20 45 78 70 72 4c 69   *pWin,.  ExprLi
4dd0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
4de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77            /* Rew
4df0: 72 69 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  rite expressions
4e00: 20 69 6e 20 74 68 69 73 20 6c 69 73 74 20 2a 2f   in this list */
4e10: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
4e20: 53 75 62 20 20 20 20 20 20 20 20 20 20 20 20 20  Sub             
4e30: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75     /* IN/OUT: Su
4e40: 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73  b-select express
4e50: 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20  ion-list */.){. 
4e60: 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b   Walker sWalker;
4e70: 0a 20 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  .  WindowRewrite
4e80: 20 73 52 65 77 72 69 74 65 3b 0a 0a 20 20 6d 65   sRewrite;..  me
4e90: 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30  mset(&sWalker, 0
4ea0: 2c 20 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29  , sizeof(Walker)
4eb0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 52 65  );.  memset(&sRe
4ec0: 77 72 69 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66  write, 0, sizeof
4ed0: 28 57 69 6e 64 6f 77 52 65 77 72 69 74 65 29 29  (WindowRewrite))
4ee0: 3b 0a 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53  ;..  sRewrite.pS
4ef0: 75 62 20 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73  ub = *ppSub;.  s
4f00: 52 65 77 72 69 74 65 2e 70 57 69 6e 20 3d 20 70  Rewrite.pWin = p
4f10: 57 69 6e 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e  Win;..  sWalker.
4f20: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
4f30: 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72  .  sWalker.xExpr
4f40: 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
4f50: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78  tWindowRewriteEx
4f60: 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  prCb;.  sWalker.
4f70: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
4f80: 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  = selectWindowRe
4f90: 77 72 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20  writeSelectCb;. 
4fa0: 20 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72   sWalker.u.pRewr
4fb0: 69 74 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b  ite = &sRewrite;
4fc0: 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ..  (void)sqlite
4fd0: 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73  3WalkExprList(&s
4fe0: 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b  Walker, pEList);
4ff0: 0a 0a 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65  ..  *ppSub = sRe
5000: 77 72 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f  write.pSub;.}../
5010: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f  *.** Append a co
5020: 70 79 20 6f 66 20 65 61 63 68 20 65 78 70 72 65  py of each expre
5030: 73 73 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73  ssion in express
5040: 69 6f 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64  ion-list pAppend
5050: 20 74 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f   to.** expressio
5060: 6e 20 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65  n list pList. Re
5070: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
5080: 6f 20 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73  o the result lis
5090: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70  t..*/.static Exp
50a0: 72 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41  rList *exprListA
50b0: 70 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72  ppendList(.  Par
50c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
50d0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
50e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
50f0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
5100: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
5110: 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
5120: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
5130: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41  /.  ExprList *pA
5140: 70 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c  ppend       /* L
5150: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  ist of values to
5160: 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
5170: 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  e NULL */.){.  i
5180: 66 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20  f( pAppend ){.  
5190: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
51a0: 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f   nInit = pList ?
51b0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
51c0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
51d0: 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72  i<pAppend->nExpr
51e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
51f0: 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74  pr *pDup = sqlit
5200: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
5210: 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61  ->db, pAppend->a
5220: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [i].pExpr, 0);. 
5230: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
5240: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
5250: 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
5260: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
5270: 66 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74  f( pList ) pList
5280: 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72  ->a[nInit+i].sor
5290: 74 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64  tOrder = pAppend
52a0: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
52b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
52c0: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
52d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
52e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
52f0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
5300: 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20  d argument does 
5310: 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e  not invoke.** an
5320: 79 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e  y SQL window fun
5330: 63 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e  ctions, this fun
5340: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
5350: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
5360: 0a 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65  .** rewrites the
5370: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5380: 74 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77  t so that window
5390: 20 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20   function xStep 
53a0: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  functions.** are
53b0: 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20   invoked in the 
53c0: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 20 61 73  correct order as
53d0: 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72   described under
53e0: 20 22 53 45 4c 45 43 54 20 52 45 57 52 49 54 49   "SELECT REWRITI
53f0: 4e 47 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f  NG".** at the to
5400: 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a  p of this file..
5410: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69  */.int sqlite3Wi
5420: 6e 64 6f 77 52 65 77 72 69 74 65 28 50 61 72 73  ndowRewrite(Pars
5430: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
5440: 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  t *p){.  int rc 
5450: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
5460: 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20  f( p->pWin ){.  
5470: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
5480: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
5490: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  e);.    sqlite3 
54a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
54b0: 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
54c0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
54d0: 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75      /* The subqu
54e0: 65 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69  ery */.    SrcLi
54f0: 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
5500: 72 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57  rc;.    Expr *pW
5510: 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65  here = p->pWhere
5520: 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
5530: 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
5540: 72 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72  roupBy;.    Expr
5550: 20 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70   *pHaving = p->p
5560: 48 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72  Having;.    Expr
5570: 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b  List *pSort = 0;
5580: 0a 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ..    ExprList *
5590: 70 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20  pSublist = 0;   
55a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
55b0: 6e 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71  n list for sub-q
55c0: 75 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64  uery */.    Wind
55d0: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
55e0: 57 69 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73  Win;      /* Mas
55f0: 74 65 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  ter window objec
5600: 74 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20  t */.    Window 
5610: 2a 70 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20  *pWin;          
5620: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
5630: 20 6f 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72   object iterator
5640: 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63   */..    p->pSrc
5650: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68   = 0;.    p->pWh
5660: 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ere = 0;.    p->
5670: 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20  pGroupBy = 0;.  
5680: 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30    p->pHaving = 0
5690: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
56a0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
56b0: 61 75 73 65 20 66 6f 72 20 74 68 65 20 73 75 62  ause for the sub
56c0: 2d 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73  -select. This is
56d0: 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69   the concatenati
56e0: 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  on.    ** of the
56f0: 20 77 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f   window PARTITIO
5700: 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63  N and ORDER BY c
5710: 6c 61 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66  lauses. Then, if
5720: 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20   this makes it. 
5730: 20 20 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c     ** redundant,
5740: 20 72 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45   remove the ORDE
5750: 52 20 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61  R BY from the pa
5760: 72 65 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f  rent SELECT.  */
5770: 0a 20 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c  .    pSort = sql
5780: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
5790: 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  db, pMWin->pPart
57a0: 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70  ition, 0);.    p
57b0: 53 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41  Sort = exprListA
57c0: 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65  ppendList(pParse
57d0: 2c 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e  , pSort, pMWin->
57e0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
57f0: 66 28 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70  f( pSort && p->p
5800: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
5810: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
5820: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72  ListCompare(pSor
5830: 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  t, p->pOrderBy, 
5840: 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
5850: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
5860: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
5870: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
5880: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
5890: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
58a0: 0a 0a 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20  ..    /* Assign 
58b0: 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  a cursor number 
58c0: 66 6f 72 20 74 68 65 20 65 70 68 65 6d 65 72 61  for the ephemera
58d0: 6c 20 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  l table used to 
58e0: 62 75 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20  buffer rows..   
58f0: 20 2a 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65   ** The OpenEphe
5900: 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
5910: 6e 20 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72  n is coded later
5920: 2c 20 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e  , after it is kn
5930: 6f 77 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d  own how.    ** m
5940: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20  any columns the 
5950: 74 61 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e  table will have.
5960: 20 20 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e    */.    pMWin->
5970: 69 45 70 68 43 73 72 20 3d 20 70 50 61 72 73 65  iEphCsr = pParse
5980: 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 73  ->nTab++;..    s
5990: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
59a0: 74 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20  teEList(pParse, 
59b0: 70 4d 57 69 6e 2c 20 70 2d 3e 70 45 4c 69 73 74  pMWin, p->pEList
59c0: 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20  , &pSublist);.  
59d0: 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65    selectWindowRe
59e0: 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73  writeEList(pPars
59f0: 65 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 4f 72  e, pMWin, p->pOr
5a00: 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74  derBy, &pSublist
5a10: 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42  );.    pMWin->nB
5a20: 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62  ufferCol = (pSub
5a30: 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d  list ? pSublist-
5a40: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20  >nExpr : 0);..  
5a50: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
5a60: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e 64  PARTITION BY and
5a70: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
5a80: 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74 6f 20  sions to the to 
5a90: 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
5aa0: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
5ab0: 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72 65  n list. They are
5ac0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 67   required to fig
5ad0: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 0a 20  ure out where . 
5ae0: 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69 65 73     ** boundaries
5af0: 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20   for partitions 
5b00: 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65 72  and sets of peer
5b10: 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f 0a 20   rows lie.  */. 
5b20: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78     pSublist = ex
5b30: 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74  prListAppendList
5b40: 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73  (pParse, pSublis
5b50: 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  t, pMWin->pParti
5b60: 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75 62 6c  tion);.    pSubl
5b70: 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ist = exprListAp
5b80: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
5b90: 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e   pSublist, pMWin
5ba0: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  ->pOrderBy);..  
5bb0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
5bc0: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
5bd0: 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20   to each window 
5be0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a  function to the.
5bf0: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
5c00: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
5c10: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
5c20: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66   two registers f
5c30: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77  or each.    ** w
5c40: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d  indow function -
5c50: 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63   one for the acc
5c60: 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65  umulator, anothe
5c70: 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20  r for interim.  
5c80: 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a    ** results.  *
5c90: 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70  /.    for(pWin=p
5ca0: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
5cb0: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
5cc0: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41  {.      pWin->iA
5cd0: 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73  rgCol = (pSublis
5ce0: 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45  t ? pSublist->nE
5cf0: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
5d00: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
5d10: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
5d20: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
5d30: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
5d40: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
5d50: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
5d60: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
5d70: 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  *pFilter = sqlit
5d80: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
5d90: 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b  in->pFilter, 0);
5da0: 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c 69 73  .        pSublis
5db0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
5dc0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
5dd0: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69 6c  , pSublist, pFil
5de0: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
5df0: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63      pWin->regAcc
5e00: 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  um = ++pParse->n
5e10: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Mem;.      pWin-
5e20: 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70  >regResult = ++p
5e30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5e40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5e50: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
5e60: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
5e70: 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  um);.    }..    
5e80: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
5e90: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 50 41  o ORDER BY or PA
5ea0: 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61 75 73  RTITION BY claus
5eb0: 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e 64 6f  e, and the windo
5ec0: 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  w.    ** functio
5ed0: 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f 20 61  n accepts zero a
5ee0: 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68  rguments, and th
5ef0: 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72  ere are no other
5f00: 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20   columns.    ** 
5f10: 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e 20 22  selected (e.g. "
5f20: 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65  SELECT row_numbe
5f30: 72 28 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d  r() OVER () FROM
5f40: 20 74 31 22 29 2c 20 69 74 20 69 73 20 70 6f 73   t1"), it is pos
5f50: 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61  sible.    ** tha
5f60: 74 20 70 53 75 62 6c 69 73 74 20 69 73 20 73 74  t pSublist is st
5f70: 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e 20 41  ill NULL here. A
5f80: 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  dd a constant ex
5f90: 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20 74 6f  pression here to
5fa0: 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20 65 76   .    ** keep ev
5fb0: 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c 20 69  erything legal i
5fc0: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a 20 20  n this case. .  
5fd0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
5fe0: 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  blist==0 ){.    
5ff0: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c    pSublist = sql
6000: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6010: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
6020: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6030: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
6040: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
6050: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
6060: 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
6070: 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20 73 71  }..    pSub = sq
6080: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
6090: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
60a0: 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63 2c 20  pSublist, pSrc, 
60b0: 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
60c0: 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f 72 74  , pHaving, pSort
60d0: 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
60e0: 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
60f0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
6100: 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  (db, 0, 0, 0);. 
6110: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
6120: 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rc || db->malloc
6130: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
6140: 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20  ( p->pSrc ){.   
6150: 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d     p->pSrc->a[0]
6160: 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 3b  .pSelect = pSub;
6170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
6180: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
6190: 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53  rs(pParse, p->pS
61a0: 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
61b0: 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71  qlite3ExpandSubq
61c0: 75 65 72 79 28 70 50 61 72 73 65 2c 20 26 70 2d  uery(pParse, &p-
61d0: 3e 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a  >pSrc->a[0]) ){.
61e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
61f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
6200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6210: 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSub->selFlags |
6220: 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20  = SF_Expanded;. 
6230: 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61         p->selFla
6240: 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67  gs &= ~SF_Aggreg
6250: 61 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ate;.        sql
6260: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
6270: 50 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29 3b  Parse, pSub, 0);
6280: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
6290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
62a0: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
62b0: 6d 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45  meral, pMWin->iE
62c0: 70 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74 2d  phCsr, pSublist-
62d0: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c  >nExpr);.    }el
62e0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
62f0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
6300: 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20  , pSub);.    }. 
6310: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
6320: 63 46 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53  cFailed ) rc = S
6330: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
6340: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
6350: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
6360: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70   Window object p
6370: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
6380: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
6390: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
63a0: 64 6f 77 44 65 6c 65 74 65 28 73 71 6c 69 74 65  dowDelete(sqlite
63b0: 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70  3 *db, Window *p
63c0: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
63d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
63e0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74  ete(db, p->pFilt
63f0: 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
6400: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
6410: 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e  b, p->pPartition
6420: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6430: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
6440: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
6450: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6460: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 6e 64  lete(db, p->pEnd
6470: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6480: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
6490: 70 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  pStart);.    sql
64a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
64b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
64c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
64d0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
64e0: 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b 65 64   Free the linked
64f0: 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20   list of Window 
6500: 6f 62 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67  objects starting
6510: 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 61   at the second a
6520: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
6530: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69   sqlite3WindowLi
6540: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
6550: 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29   *db, Window *p)
6560: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
6570: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78      Window *pNex
6580: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b  t = p->pNextWin;
6590: 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64  .    sqlite3Wind
65a0: 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  owDelete(db, p);
65b0: 0a 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a  .    p = pNext;.
65c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
65d0: 20 61 72 67 75 6d 65 6e 74 20 65 78 70 72 65 73   argument expres
65e0: 73 69 6f 6e 20 69 73 20 61 6e 20 50 52 45 43 45  sion is an PRECE
65f0: 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e  DING or FOLLOWIN
6600: 47 20 6f 66 66 73 65 74 2e 20 20 54 68 65 0a 2a  G offset.  The.*
6610: 2a 20 76 61 6c 75 65 20 73 68 6f 75 6c 64 20 62  * value should b
6620: 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  e a non-negative
6630: 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74 68   integer.  If th
6640: 65 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20 61  e value is not a
6650: 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63 68  .** constant, ch
6660: 61 6e 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c 2e  ange it to NULL.
6670: 20 20 54 68 65 20 66 61 63 74 20 74 68 61 74 20    The fact that 
6680: 69 74 20 69 73 20 74 68 65 6e 20 61 20 6e 6f 6e  it is then a non
6690: 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e 74  -negative.** int
66a0: 65 67 65 72 20 77 69 6c 6c 20 62 65 20 63 61 75  eger will be cau
66b0: 67 68 74 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ght later.  But 
66c0: 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
66d0: 6e 6f 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a 20  not to leave.** 
66e0: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 73 20  variable values 
66f0: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
6700: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  n tree..*/.stati
6710: 63 20 45 78 70 72 20 2a 73 71 6c 69 74 65 33 57  c Expr *sqlite3W
6720: 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28  indowOffsetExpr(
6730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
6740: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
6750: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78 70  f( 0==sqlite3Exp
6760: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78 70  rIsConstant(pExp
6770: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
6780: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
6790: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
67a0: 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
67b0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
67c0: 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c  rse->db, TK_NULL
67d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
67e0: 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a  eturn pExpr;.}..
67f0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
6800: 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77 20  nd return a new 
6810: 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 64 65  Window object de
6820: 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e 64 6f  scribing a Windo
6830: 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  w Definition..*/
6840: 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
6850: 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20 50  WindowAlloc(.  P
6860: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6870: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6880: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  ext */.  int eTy
6890: 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 46 72  pe,        /* Fr
68a0: 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52 41 4e  ame type. TK_RAN
68b0: 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20 2a 2f  GE or TK_ROWS */
68c0: 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20 20  .  int eStart,  
68d0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74 79       /* Start ty
68e0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50 52 45  pe: CURRENT, PRE
68f0: 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e  CEDING, FOLLOWIN
6900: 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a  G, UNBOUNDED */.
6910: 20 20 45 78 70 72 20 2a 70 53 74 61 72 74 2c 20    Expr *pStart, 
6920: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77 69 6e      /* Start win
6930: 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f 50  dow size if TK_P
6940: 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c  RECEDING or FOLL
6950: 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 65  OWING */.  int e
6960: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  End,         /* 
6970: 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52 45 4e  End type: CURREN
6980: 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b  T, FOLLOWING, TK
6990: 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52 45 43  _UNBOUNDED, PREC
69a0: 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72 20  EDING */.  Expr 
69b0: 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a 20  *pEnd        /* 
69c0: 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a 65 20  End window size 
69d0: 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  if TK_FOLLOWING 
69e0: 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a  or PRECEDING */.
69f0: 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  ){.  Window *pWi
6a00: 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72  n = 0;..  /* Par
6a10: 73 65 72 20 61 73 73 75 72 65 73 20 74 68 65 20  ser assures the 
6a20: 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20  following: */.  
6a30: 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 54  assert( eType==T
6a40: 4b 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70 65  K_RANGE || eType
6a50: 3d 3d 54 4b 5f 52 4f 57 53 20 29 3b 0a 20 20 61  ==TK_ROWS );.  a
6a60: 73 73 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54  ssert( eStart==T
6a70: 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74  K_CURRENT || eSt
6a80: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
6a90: 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  G.           || 
6aa0: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
6ab0: 4e 44 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d  NDED || eStart==
6ac0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a  TK_FOLLOWING );.
6ad0: 20 20 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d    assert( eEnd==
6ae0: 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45  TK_CURRENT || eE
6af0: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
6b00: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
6b10: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
6b20: 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  D || eEnd==TK_PR
6b30: 45 43 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73  ECEDING );.  ass
6b40: 65 72 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b  ert( (eStart==TK
6b50: 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53  _PRECEDING || eS
6b60: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
6b70: 4e 47 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29  NG)==(pStart!=0)
6b80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65   );.  assert( (e
6b90: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
6ba0: 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  G || eEnd==TK_PR
6bb0: 45 43 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21  ECEDING)==(pEnd!
6bc0: 3d 30 29 20 29 3b 0a 0a 0a 20 20 2f 2a 20 49 66  =0) );...  /* If
6bd0: 20 61 20 66 72 61 6d 65 20 69 73 20 64 65 63 6c   a frame is decl
6be0: 61 72 65 64 20 22 52 41 4e 47 45 22 20 28 6e 6f  ared "RANGE" (no
6bf0: 74 20 22 52 4f 57 53 22 29 2c 20 74 68 65 6e 20  t "ROWS"), then 
6c00: 69 74 20 6d 61 79 20 6e 6f 74 20 75 73 65 0a 20  it may not use. 
6c10: 20 2a 2a 20 65 69 74 68 65 72 20 22 3c 65 78 70   ** either "<exp
6c20: 72 3e 20 50 52 45 43 45 44 49 4e 47 22 20 6f 72  r> PRECEDING" or
6c30: 20 22 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49   "<expr> FOLLOWI
6c40: 4e 47 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  NG"..  */.  if( 
6c50: 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20  eType==TK_RANGE 
6c60: 26 26 20 28 70 53 74 61 72 74 21 3d 30 20 7c 7c  && (pStart!=0 ||
6c70: 20 70 45 6e 64 21 3d 30 29 20 29 7b 0a 20 20 20   pEnd!=0) ){.   
6c80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6c90: 28 70 50 61 72 73 65 2c 20 22 52 41 4e 47 45 20  (pParse, "RANGE 
6ca0: 6d 75 73 74 20 75 73 65 20 6f 6e 6c 79 20 55 4e  must use only UN
6cb0: 42 4f 55 4e 44 45 44 20 6f 72 20 43 55 52 52 45  BOUNDED or CURRE
6cc0: 4e 54 20 52 4f 57 22 29 3b 0a 20 20 20 20 67 6f  NT ROW");.    go
6cd0: 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72  to windowAllocEr
6ce0: 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64  r;.  }..  /* Add
6cf0: 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 20  itionally, the. 
6d00: 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f 75   ** starting bou
6d10: 6e 64 61 72 79 20 74 79 70 65 20 6d 61 79 20 6e  ndary type may n
6d20: 6f 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65 72  ot occur earlier
6d30: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
6d40: 67 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a 2a  g list than.  **
6d50: 20 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75 6e   the ending boun
6d60: 64 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a 0a  dary type:.  **.
6d70: 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44    **   UNBOUNDED
6d80: 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20   PRECEDING.  ** 
6d90: 20 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49    <expr> PRECEDI
6da0: 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45 4e  NG.  **   CURREN
6db0: 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65 78  T ROW.  **   <ex
6dc0: 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20  pr> FOLLOWING.  
6dd0: 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 46  **   UNBOUNDED F
6de0: 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20  OLLOWING.  **.  
6df0: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 65 6e  ** The parser en
6e00: 73 75 72 65 73 20 74 68 61 74 20 22 55 4e 42 4f  sures that "UNBO
6e10: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 22  UNDED PRECEDING"
6e20: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
6e30: 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20 2a  as an ending.  *
6e40: 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64 20  * boundary, and 
6e50: 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44 20  than "UNBOUNDED 
6e60: 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e 6f  FOLLOWING" canno
6e70: 74 20 62 65 20 75 73 65 64 20 61 73 20 61 20 73  t be used as a s
6e80: 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72 61  tarting.  ** fra
6e90: 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20 2a  me boundary..  *
6ea0: 2f 0a 20 20 69 66 28 20 28 65 53 74 61 72 74 3d  /.  if( (eStart=
6eb0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 65  =TK_CURRENT && e
6ec0: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
6ed0: 47 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72 74  G).   || (eStart
6ee0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26  ==TK_FOLLOWING &
6ef0: 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  & (eEnd==TK_PREC
6f00: 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54  EDING || eEnd==T
6f10: 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29 7b  K_CURRENT)).  ){
6f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6f30: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
6f40: 73 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65 20  supported frame 
6f50: 64 65 6c 69 6d 69 74 65 72 20 66 6f 72 20 52 4f  delimiter for RO
6f60: 57 53 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77  WS");.    goto w
6f70: 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20  indowAllocErr;. 
6f80: 20 7d 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57 69   }..  pWin = (Wi
6f90: 6e 64 6f 77 2a 29 73 71 6c 69 74 65 33 44 62 4d  ndow*)sqlite3DbM
6fa0: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
6fb0: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e  ->db, sizeof(Win
6fc0: 64 6f 77 29 29 3b 0a 20 20 69 66 28 20 70 57 69  dow));.  if( pWi
6fd0: 6e 3d 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e 64  n==0 ) goto wind
6fe0: 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70 57  owAllocErr;.  pW
6ff0: 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65 54 79 70  in->eType = eTyp
7000: 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61 72  e;.  pWin->eStar
7010: 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70 57  t = eStart;.  pW
7020: 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64 3b  in->eEnd = eEnd;
7030: 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20  .  pWin->pEnd = 
7040: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66  sqlite3WindowOff
7050: 73 65 74 45 78 70 72 28 70 50 61 72 73 65 2c 20  setExpr(pParse, 
7060: 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e 70  pEnd);.  pWin->p
7070: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 57  Start = sqlite3W
7080: 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72 28  indowOffsetExpr(
7090: 70 50 61 72 73 65 2c 20 70 53 74 61 72 74 29 3b  pParse, pStart);
70a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a  .  return pWin;.
70b0: 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a  .windowAllocErr:
70c0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
70d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
70e0: 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65   pEnd);.  sqlite
70f0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
7100: 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29 3b  se->db, pStart);
7110: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7120: 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 77 69 6e  /*.** Attach win
7130: 64 6f 77 20 6f 62 6a 65 63 74 20 70 57 69 6e 20  dow object pWin 
7140: 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2e  to expression p.
7150: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7160: 57 69 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72  WindowAttach(Par
7170: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7180: 20 2a 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69   *p, Window *pWi
7190: 6e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  n){.  if( p ){. 
71a0: 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20     if( pWin ){. 
71b0: 20 20 20 20 20 70 2d 3e 70 57 69 6e 20 3d 20 70       p->pWin = p
71c0: 57 69 6e 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Win;.      pWin-
71d0: 3e 70 4f 77 6e 65 72 20 3d 20 70 3b 0a 20 20 20  >pOwner = p;.   
71e0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
71f0: 26 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b  & EP_Distinct ){
7200: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7210: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7220: 0a 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53  .           "DIS
7230: 54 49 4e 43 54 20 69 73 20 6e 6f 74 20 73 75 70  TINCT is not sup
7240: 70 6f 72 74 65 64 20 66 6f 72 20 77 69 6e 64 6f  ported for windo
7250: 77 20 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20  w functions");. 
7260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7270: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
7280: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 70 50  3WindowDelete(pP
7290: 61 72 73 65 2d 3e 64 62 2c 20 70 57 69 6e 29 3b  arse->db, pWin);
72a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
72b0: 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 74 77  turn 0 if the tw
72c0: 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73  o window objects
72d0: 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20   are identical, 
72e0: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 74 68 65  or non-zero othe
72f0: 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65 6e 74 69  rwise..** Identi
7300: 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63  cal window objec
7310: 74 73 20 63 61 6e 20 62 65 20 70 72 6f 63 65 73  ts can be proces
7320: 73 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  sed in a single 
7330: 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  scan..*/.int sql
7340: 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72  ite3WindowCompar
7350: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
7360: 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20 57 69 6e   Window *p1, Win
7370: 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69 66 28 20  dow *p2){.  if( 
7380: 70 31 2d 3e 65 54 79 70 65 21 3d 70 32 2d 3e 65  p1->eType!=p2->e
7390: 54 79 70 65 20 29 20 72 65 74 75 72 6e 20 31 3b  Type ) return 1;
73a0: 0a 20 20 69 66 28 20 70 31 2d 3e 65 53 74 61 72  .  if( p1->eStar
73b0: 74 21 3d 70 32 2d 3e 65 53 74 61 72 74 20 29 20  t!=p2->eStart ) 
73c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
73d0: 70 31 2d 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45  p1->eEnd!=p2->eE
73e0: 6e 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  nd ) return 1;. 
73f0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
7400: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
7410: 70 31 2d 3e 70 53 74 61 72 74 2c 20 70 32 2d 3e  p1->pStart, p2->
7420: 70 53 74 61 72 74 2c 20 2d 31 29 20 29 20 72 65  pStart, -1) ) re
7430: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7440: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
7450: 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 45 6e  (pParse, p1->pEn
7460: 64 2c 20 70 32 2d 3e 70 45 6e 64 2c 20 2d 31 29  d, p2->pEnd, -1)
7470: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7480: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
7490: 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 50  stCompare(p1->pP
74a0: 61 72 74 69 74 69 6f 6e 2c 20 70 32 2d 3e 70 50  artition, p2->pP
74b0: 61 72 74 69 74 69 6f 6e 2c 20 2d 31 29 20 29 20  artition, -1) ) 
74c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
74d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
74e0: 6f 6d 70 61 72 65 28 70 31 2d 3e 70 4f 72 64 65  ompare(p1->pOrde
74f0: 72 42 79 2c 20 70 32 2d 3e 70 4f 72 64 65 72 42  rBy, p2->pOrderB
7500: 79 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  y, -1) ) return 
7510: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
7520: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
7530: 20 63 61 6c 6c 65 64 20 62 79 20 63 6f 64 65 20   called by code 
7540: 69 6e 20 73 65 6c 65 63 74 2e 63 20 62 65 66 6f  in select.c befo
7550: 72 65 20 69 74 20 63 61 6c 6c 73 20 73 71 6c 69  re it calls sqli
7560: 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a  te3WhereBegin().
7570: 2a 2a 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72  ** to begin iter
7580: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
7590: 65 20 73 75 62 2d 71 75 65 72 79 20 72 65 73 75  e sub-query resu
75a0: 6c 74 73 2e 20 49 74 20 69 73 20 75 73 65 64 20  lts. It is used 
75b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61  to allocate.** a
75c0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  nd initialize re
75d0: 67 69 73 74 65 72 73 20 61 6e 64 20 63 75 72 73  gisters and curs
75e0: 6f 72 73 20 75 73 65 64 20 62 79 20 73 71 6c 69  ors used by sqli
75f0: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
7600: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
7610: 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e  ite3WindowCodeIn
7620: 69 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  it(Parse *pParse
7630: 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29  , Window *pMWin)
7640: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
7650: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
7660: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
7670: 72 73 65 29 3b 0a 20 20 69 6e 74 20 6e 50 61 72  rse);.  int nPar
7680: 74 20 3d 20 28 70 4d 57 69 6e 2d 3e 70 50 61 72  t = (pMWin->pPar
7690: 74 69 74 69 6f 6e 20 3f 20 70 4d 57 69 6e 2d 3e  tition ? pMWin->
76a0: 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70  pPartition->nExp
76b0: 72 20 3a 20 30 29 3b 0a 20 20 6e 50 61 72 74 20  r : 0);.  nPart 
76c0: 2b 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  += (pMWin->pOrde
76d0: 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72  rBy ? pMWin->pOr
76e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
76f0: 29 3b 0a 20 20 69 66 28 20 6e 50 61 72 74 20 29  );.  if( nPart )
7700: 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67  {.    pMWin->reg
7710: 50 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Part = pParse->n
7720: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
7730: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 61 72 74  e->nMem += nPart
7740: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7750: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
7760: 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65  ll, 0, pMWin->re
7770: 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  gPart, pMWin->re
7780: 67 50 61 72 74 2b 6e 50 61 72 74 2d 31 29 3b 0a  gPart+nPart-1);.
7790: 20 20 7d 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d    }..  for(pWin=
77a0: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
77b0: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
77c0: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
77d0: 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  p = pWin->pFunc;
77e0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66 75 6e  .    if( (p->fun
77f0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
7800: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20  FUNC_MINMAX) && 
7810: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
7820: 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
7830: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c 69 6e      /* The inlin
7840: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d 69  e versions of mi
7850: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 72 65  n() and max() re
7860: 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65 20 65  quire a single e
7870: 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20 20 2a  phemeral.      *
7880: 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20 72 65  * table and 3 re
7890: 67 69 73 74 65 72 73 2e 20 54 68 65 20 72 65 67  gisters. The reg
78a0: 69 73 74 65 72 73 20 61 72 65 20 75 73 65 64 20  isters are used 
78b0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
78c0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
78d0: 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74 20 74  regApp+0: slot t
78e0: 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d 61 78  o copy min()/max
78f0: 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66  () argument to f
7900: 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20  or MakeRecord.  
7910: 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b      **   regApp+
7920: 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  1: integer value
7930: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
7940: 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 0a  keys are unique.
7950: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70        **   regAp
7960: 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66 20 4d  p+2: output of M
7970: 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20  akeRecord.      
7980: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
7990: 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d  t *pList = pWin-
79a0: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
79b0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
79c0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
79d0: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
79e0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
79f0: 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
7a00: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
7a10: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
7a20: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
7a30: 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gApp = pParse->n
7a40: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61  Mem+1;.      pPa
7a50: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a  rse->nMem += 3;.
7a60: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
7a70: 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46 75 6e  fo && pWin->pFun
7a80: 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27  c->zName[1]=='i'
7a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
7aa0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
7ab0: 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 30 20 29  ortOrder[0]==0 )
7ac0: 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
7ad0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
7ae0: 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 1;.      }. 
7af0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7b00: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
7b10: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 57 69 6e  nEphemeral, pWin
7b20: 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a 20 20  ->csrApp, 2);.  
7b30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b40: 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49  ppendP4(v, pKeyI
7b50: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
7b60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7b70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7b80: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
7b90: 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20  ->regApp+1);.   
7ba0: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
7bb0: 70 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76  p->xSFunc==nth_v
7bc0: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 7c 7c 20  alueStepFunc || 
7bd0: 70 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74  p->xSFunc==first
7be0: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 29  _valueStepFunc )
7bf0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63  {.      /* Alloc
7c00: 61 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72  ate two register
7c10: 73 20 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70  s at pWin->regAp
7c20: 70 2e 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65  p. These will be
7c30: 20 75 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a   used to.      *
7c40: 2a 20 73 74 6f 72 65 20 74 68 65 20 73 74 61 72  * store the star
7c50: 74 20 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20  t and end index 
7c60: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  of the current f
7c70: 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rame.  */.      
7c80: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69  assert( pMWin->i
7c90: 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20  EphCsr );.      
7ca0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70  pWin->regApp = p
7cb0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
7cc0: 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70       pWin->csrAp
7cd0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  p = pParse->nTab
7ce0: 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ++;.      pParse
7cf0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20  ->nMem += 2;.   
7d00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7d10: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
7d20: 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  up, pWin->csrApp
7d30: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
7d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  );.    }.    els
7d50: 65 20 69 66 28 20 70 2d 3e 78 53 46 75 6e 63 3d  e if( p->xSFunc=
7d60: 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 20 7c 7c  =leadStepFunc ||
7d70: 20 70 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53   p->xSFunc==lagS
7d80: 74 65 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  tepFunc ){.     
7d90: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
7da0: 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20  iEphCsr );.     
7db0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20   pWin->csrApp = 
7dc0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
7dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7de0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
7df0: 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72  enDup, pWin->csr
7e00: 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  App, pMWin->iEph
7e10: 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Csr);.    }.  }.
7e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43  }../*.** A "PREC
7e30: 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 62  EDING <expr>" (b
7e40: 45 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c 4c  End==0) or "FOLL
7e50: 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 62  OWING <expr>" (b
7e60: 45 6e 64 3d 3d 31 29 20 68 61 73 20 6a 75 73 74  End==1) has just
7e70: 20 0a 2a 2a 20 62 65 65 6e 20 65 76 61 6c 75 61   .** been evalua
7e80: 74 65 64 20 61 6e 64 20 74 68 65 20 72 65 73 75  ted and the resu
7e90: 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  lt left in regis
7ea0: 74 65 72 20 72 65 67 2e 20 54 68 69 73 20 66 75  ter reg. This fu
7eb0: 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73  nction generates
7ec0: 0a 2a 2a 20 56 4d 20 63 6f 64 65 20 74 6f 20 63  .** VM code to c
7ed0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
7ee0: 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67  lue is a non-neg
7ef0: 61 74 69 76 65 20 69 6e 74 65 67 65 72 20 61 6e  ative integer an
7f00: 64 20 74 68 72 6f 77 73 0a 2a 2a 20 61 6e 20 65  d throws.** an e
7f10: 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74 20 69  xception if it i
7f20: 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s not..*/.static
7f30: 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68 65 63   void windowChec
7f40: 6b 46 72 61 6d 65 4f 66 66 73 65 74 28 50 61 72  kFrameOffset(Par
7f50: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
7f60: 72 65 67 2c 20 69 6e 74 20 62 45 6e 64 29 7b 0a  reg, int bEnd){.
7f70: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
7f80: 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b  har *azErr[] = {
7f90: 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61 72  .    "frame star
7fa0: 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74  ting offset must
7fb0: 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   be a non-negati
7fc0: 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20  ve integer",.   
7fd0: 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f   "frame ending o
7fe0: 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20  ffset must be a 
7ff0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
8000: 65 67 65 72 22 0a 20 20 7d 3b 0a 20 20 56 64 62  eger".  };.  Vdb
8010: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
8020: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
8030: 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20 73   int regZero = s
8040: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
8050: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
8060: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8070: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8080: 72 65 67 5a 65 72 6f 29 3b 0a 20 20 73 71 6c 69  regZero);.  sqli
8090: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
80a0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
80b0: 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  eg, sqlite3VdbeC
80c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
80d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
80e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
80f0: 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69 74 65 33  regZero, sqlite3
8100: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
8110: 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20 56 64  v)+2, reg);.  Vd
8120: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8130: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8140: 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p2(v, OP_Halt, S
8150: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 4f 45 5f  QLITE_ERROR, OE_
8160: 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  Abort);.  sqlite
8170: 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
8180: 20 28 76 6f 69 64 2a 29 61 7a 45 72 72 5b 62 45   (void*)azErr[bE
8190: 6e 64 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  nd], P4_STATIC);
81a0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
81b0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
81c0: 20 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a   regZero);.}../*
81d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
81e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
81f0: 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
8200: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
8210: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
8220: 69 74 68 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ith the object p
8230: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
8240: 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  y argument to th
8250: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
8260: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f  static int windo
8270: 77 41 72 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77  wArgCount(Window
8280: 20 2a 70 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c   *pWin){.  ExprL
8290: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69  ist *pList = pWi
82a0: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
82b0: 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 4c  st;.  return (pL
82c0: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
82d0: 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pr : 0);.}../*.*
82e0: 2a 20 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f  * Generate VM co
82f0: 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74  de to invoke eit
8300: 68 65 72 20 78 53 74 65 70 28 29 20 28 69 66 20  her xStep() (if 
8310: 62 49 6e 76 65 72 73 65 20 69 73 20 30 29 20 6f  bInverse is 0) o
8320: 72 20 0a 2a 2a 20 78 49 6e 76 65 72 73 65 20 28  r .** xInverse (
8330: 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 6e  if bInverse is n
8340: 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72 20 65 61 63  on-zero) for eac
8350: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
8360: 6e 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  n in the .** lin
8370: 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
8380: 67 20 61 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20  g at pMWin. Or, 
8390: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
83a0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  dow functions.**
83b0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65   that do not use
83c0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 75   the standard fu
83d0: 6e 63 74 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65  nction API, gene
83e0: 72 61 74 65 20 74 68 65 20 72 65 71 75 69 72 65  rate the require
83f0: 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63  d.** inline VM c
8400: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ode..**.** If ar
8410: 67 75 6d 65 6e 74 20 63 73 72 20 69 73 20 67 72  gument csr is gr
8420: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
8430: 75 61 6c 20 74 6f 20 30 2c 20 74 68 65 6e 20 61  ual to 0, then a
8440: 72 67 75 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a  rgument reg is.*
8450: 2a 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  * the first regi
8460: 73 74 65 72 20 69 6e 20 61 6e 20 61 72 72 61 79  ster in an array
8470: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 67 75   of registers gu
8480: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
8490: 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74  arge.** enough t
84a0: 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79  o hold the array
84b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66 6f   of arguments fo
84c0: 72 20 65 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e  r each function.
84d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
84e0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   the arguments a
84f0: 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
8500: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  m the current ro
8510: 77 20 6f 66 20 63 73 72 20 69 6e 74 6f 20 74 68  w of csr into th
8520: 65 0a 2a 2a 20 61 72 72 61 79 20 6f 66 20 72 65  e.** array of re
8530: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 69  gisters before i
8540: 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74  nvoking OP_AggSt
8550: 65 70 20 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65  ep or OP_AggInve
8560: 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  rse.**.** Or, if
8570: 20 63 73 72 20 69 73 20 6c 65 73 73 20 74 68 61   csr is less tha
8580: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
8590: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
85a0: 65 72 73 20 61 74 20 72 65 67 20 69 73 0a 2a 2a  ers at reg is.**
85b0: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
85c0: 65 64 20 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75  ed with all colu
85d0: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 63 75 72  mns from the cur
85e0: 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
85f0: 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
8600: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 72 65 67   If argument reg
8610: 50 61 72 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d  PartSize is non-
8620: 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
8630: 20 61 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74   a register cont
8640: 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75  aining the.** nu
8650: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
8660: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 72 74  the current part
8670: 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
8680: 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 53   void windowAggS
8690: 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tep(.  Parse *pP
86a0: 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20  arse, .  Window 
86b0: 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20  *pMWin,         
86c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b           /* Link
86d0: 65 64 20 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f  ed list of windo
86e0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  w functions */. 
86f0: 20 69 6e 74 20 63 73 72 2c 20 20 20 20 20 20 20   int csr,       
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 2f 2a 20 52 65 61 64 20 61 72 67 75 6d 65 6e   /* Read argumen
8720: 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 75 72  ts from this cur
8730: 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e  sor */.  int bIn
8740: 76 65 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  verse,          
8750: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
8760: 20 74 6f 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65   to invoke xInve
8770: 72 73 65 20 69 6e 73 74 65 61 64 20 6f 66 20 78  rse instead of x
8780: 53 74 65 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65  Step */.  int re
8790: 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
87b0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
87c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 61 72 74  */.  int regPart
87d0: 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
87e0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
87f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 69 7a 65   containing size
8800: 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f   of partition */
8810: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
8820: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
8830: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
8840: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
8850: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
8860: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
8870: 57 69 6e 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  Win){.    int fl
8880: 61 67 73 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e  ags = pWin->pFun
8890: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 3b 0a 20 20  c->funcFlags;.  
88a0: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
88b0: 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e    int nArg = win
88c0: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
88d0: 29 3b 0a 0a 20 20 20 20 69 66 28 20 63 73 72 3e  );..    if( csr>
88e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
88f0: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
8900: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
8910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8920: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8930: 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69  Column, csr, pWi
8940: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c 20 72 65  n->iArgCol+i, re
8950: 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g+i);.      }.  
8960: 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67      regArg = reg
8970: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ;.      if( flag
8980: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
8990: 57 49 4e 44 4f 57 5f 53 49 5a 45 20 29 7b 0a 20  WINDOW_SIZE ){. 
89a0: 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
89b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
89c0: 72 65 67 41 72 67 20 3d 20 72 65 67 50 61 72 74  regArg = regPart
89d0: 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  Size;.        }e
89e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
89f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8a00: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65  (v, OP_SCopy, re
8a10: 67 50 61 72 74 53 69 7a 65 2c 20 72 65 67 2b 6e  gPartSize, reg+n
8a20: 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Arg);.        }.
8a30: 20 20 20 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a          nArg++;.
8a40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
8a50: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
8a60: 20 21 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   !(flags & SQLIT
8a70: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49  E_FUNC_WINDOW_SI
8a80: 5a 45 29 20 29 3b 0a 20 20 20 20 20 20 72 65 67  ZE) );.      reg
8a90: 41 72 67 20 3d 20 72 65 67 20 2b 20 70 57 69 6e  Arg = reg + pWin
8aa0: 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20 20 20 20 7d  ->iArgCol;.    }
8ab0: 0a 0a 20 20 20 20 69 66 28 20 28 70 57 69 6e 2d  ..    if( (pWin-
8ac0: 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
8ad0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
8ae0: 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20 20 20 26  MINMAX) .      &
8af0: 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d  & pWin->eStart!=
8b00: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20  TK_UNBOUNDED .  
8b10: 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62    ){.      if( b
8b20: 49 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20  Inverse==0 ){.  
8b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8b40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
8b50: 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41  dImm, pWin->regA
8b60: 70 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  pp+1, 1);.      
8b70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8b80: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
8b90: 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72   regArg, pWin->r
8ba0: 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20  egApp);.        
8bb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8bc0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
8bd0: 72 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  rd, pWin->regApp
8be0: 2c 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 2, pWin->regAp
8bf0: 70 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+2);.        sq
8c00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8c10: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
8c20: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70   pWin->csrApp, p
8c30: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a  Win->regApp+2);.
8c40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8c50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8c60: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
8c70: 53 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73  SeekGE, pWin->cs
8c80: 72 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c  rApp, 0, regArg,
8c90: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
8ca0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8cc0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
8cd0: 6c 65 74 65 2c 20 70 57 69 6e 2d 3e 63 73 72 41  lete, pWin->csrA
8ce0: 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pp);.        sql
8cf0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
8d00: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
8d10: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
8d20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
8d30: 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65  lse if( pWin->re
8d40: 67 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73  gApp ){.      as
8d50: 73 65 72 74 28 20 70 57 69 6e 2d 3e 70 46 75 6e  sert( pWin->pFun
8d60: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76  c->xSFunc==nth_v
8d70: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20  alueStepFunc .  
8d80: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69 6e           || pWin
8d90: 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d  ->pFunc->xSFunc=
8da0: 3d 66 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70  =first_valueStep
8db0: 46 75 6e 63 20 0a 20 20 20 20 20 20 29 3b 0a 20  Func .      );. 
8dc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 62 49 6e       assert( bIn
8dd0: 76 65 72 73 65 3d 3d 30 20 7c 7c 20 62 49 6e 76  verse==0 || bInv
8de0: 65 72 73 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  erse==1 );.     
8df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8e00: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
8e10: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2d   pWin->regApp+1-
8e20: 62 49 6e 76 65 72 73 65 2c 20 31 29 3b 0a 20 20  bInverse, 1);.  
8e30: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e    }else if( pWin
8e40: 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d  ->pFunc->xSFunc=
8e50: 3d 6c 65 61 64 53 74 65 70 46 75 6e 63 20 0a 20  =leadStepFunc . 
8e60: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69            || pWi
8e70: 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  n->pFunc->xSFunc
8e80: 3d 3d 6c 61 67 53 74 65 70 46 75 6e 63 20 0a 20  ==lagStepFunc . 
8e90: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e     ){.      /* n
8ea0: 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
8eb0: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  e{.      int add
8ec0: 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rIf = 0;.      i
8ed0: 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  f( pWin->pFilter
8ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
8ef0: 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20  regTmp;.        
8f00: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 70 57  assert( nArg==pW
8f10: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
8f20: 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
8f30: 20 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20        if( csr>0 
8f40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67  ){.          reg
8f50: 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Tmp = sqlite3Get
8f60: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8f70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8f80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8f90: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
8fa0: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41  pWin->iArgCol+nA
8fb0: 72 67 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20 20  rg,regTmp);.    
8fc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8fd0: 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20 72 65       regTmp = re
8fe0: 67 41 72 67 20 2b 20 6e 41 72 67 3b 0a 20 20 20  gArg + nArg;.   
8ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
9000: 64 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56  ddrIf = sqlite3V
9010: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9020: 49 66 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30  IfNot, regTmp, 0
9030: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
9040: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
9050: 20 20 20 20 20 20 20 69 66 28 20 63 73 72 3e 30         if( csr>0
9060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
9070: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
9080: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
9090: 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mp);.        }. 
90a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
90b0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75   pWin->pFunc->fu
90c0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
90d0: 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
90e0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
90f0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
9100: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9110: 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70  3ExprNNCollSeq(p
9120: 50 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77  Parse, pWin->pOw
9130: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  ner->x.pList->a[
9140: 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  0].pExpr);.     
9150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9160: 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
9170: 65 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73  eq, 0,0,0, (cons
9180: 74 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50  t char*)pColl, P
9190: 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
91a0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
91b0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 62  3VdbeAddOp3(v, b
91c0: 49 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67 49  Inverse? OP_AggI
91d0: 6e 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67 53  nverse : OP_AggS
91e0: 74 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  tep, .          
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 49                bI
9200: 6e 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c 20  nverse, regArg, 
9210: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
9220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9230: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
9240: 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
9250: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
9260: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9270: 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
9280: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 49 66        if( addrIf
9290: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
92a0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
92b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
92c0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
92d0: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
92e0: 20 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29   either xValue()
92f0: 20 28 62 46 69 6e 61 6c 3d 3d 30 29 20 6f 72 20   (bFinal==0) or 
9300: 78 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28  xFinalize().** (
9310: 62 46 69 6e 61 6c 3d 3d 31 29 20 66 6f 72 20 65  bFinal==1) for e
9320: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
9330: 69 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  ion in the linke
9340: 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20  d list starting 
9350: 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c  at.** pMWin. Or,
9360: 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69   for built-in wi
9370: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74  ndow-functions t
9380: 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74  hat do not use t
9390: 68 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41  he standard.** A
93a0: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
93b0: 20 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20 63   equivalent VM c
93c0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
93d0: 6f 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69 6e  oid windowAggFin
93e0: 61 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  al(Parse *pParse
93f0: 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c  , Window *pMWin,
9400: 20 69 6e 74 20 62 46 69 6e 61 6c 29 7b 0a 20 20   int bFinal){.  
9410: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9420: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
9430: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
9440: 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  ;..  for(pWin=pM
9450: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
9460: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
9470: 0a 20 20 20 20 69 66 28 20 28 70 57 69 6e 2d 3e  .    if( (pWin->
9480: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
9490: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
94a0: 49 4e 4d 41 58 29 20 0a 20 20 20 20 20 26 26 20  INMAX) .     && 
94b0: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
94c0: 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20  _UNBOUNDED .    
94d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
94e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
94f0: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
9500: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
9510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9520: 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op1(v, OP_Last, 
9530: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
9540: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
9550: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
9560: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9570: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e   OP_Column, pWin
9580: 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 70 57 69  ->csrApp, 0, pWi
9590: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
95a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
95b0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69  JumpHere(v, sqli
95c0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
95d0: 64 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20  dr(v)-2);.      
95e0: 69 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20 20  if( bFinal ){.  
95f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9600: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
9610: 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d  setSorter, pWin-
9620: 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20  >csrApp);.      
9630: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
9640: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
9650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9660: 20 69 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20   if( bFinal ){. 
9670: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9680: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
9690: 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72  ggFinal, pWin->r
96a0: 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41  egAccum, windowA
96b0: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a  rgCount(pWin));.
96c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
96d0: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
96e0: 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  Win->pFunc, P4_F
96f0: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20  UNCDEF);.       
9700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9710: 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
9720: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70  Win->regAccum, p
9730: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
9740: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9750: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9760: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
9770: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20  regAccum);.     
9780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
97a0: 33 28 76 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65  3(v, OP_AggValue
97b0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
97c0: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
97d0: 28 70 57 69 6e 29 2c 0a 20 20 20 20 20 20 20 20  (pWin),.        
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65       pWin->regRe
9800: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73  sult);.        s
9810: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
9820: 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e  P4(v, pWin->pFun
9830: 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
9840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9850: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
9860: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
9870: 65 73 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  es VM code to in
9880: 76 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75  voke the sub-rou
9890: 74 69 6e 65 20 61 74 20 61 64 64 72 65 73 73 0a  tine at address.
98a0: 2a 2a 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  ** lblFlushPart 
98b0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61  once for each pa
98c0: 72 74 69 74 69 6f 6e 20 77 69 74 68 20 74 68 65  rtition with the
98d0: 20 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f   entire partitio
98e0: 6e 20 63 61 63 68 65 64 20 69 6e 0a 2a 2a 20 74  n cached in.** t
98f0: 68 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73  he Window.iEphCs
9900: 72 20 74 65 6d 70 20 74 61 62 6c 65 2e 0a 2a 2f  r temp table..*/
9910: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
9920: 64 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68  dowPartitionCach
9930: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
9940: 73 65 2c 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c  se,.  Select *p,
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 77        /* The rew
9970: 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74  ritten SELECT st
9980: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65  atement */.  Whe
9990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
99b0: 57 68 65 72 65 49 6e 66 6f 20 74 6f 20 63 61 6c  WhereInfo to cal
99c0: 6c 20 57 68 65 72 65 45 6e 64 28 29 20 6f 6e 20  l WhereEnd() on 
99d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73  */.  int regFlus
99e0: 68 50 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  hPart,          
99f0: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
9a00: 20 74 6f 20 75 73 65 20 77 69 74 68 20 47 6f 73   to use with Gos
9a10: 75 62 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  ub lblFlushPart 
9a20: 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73  */.  int lblFlus
9a30: 68 50 61 72 74 2c 20 20 20 20 20 20 20 20 20 20  hPart,          
9a40: 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
9a50: 6e 65 20 74 6f 20 47 6f 73 75 62 20 74 6f 20 2a  ne to Gosub to *
9a60: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 67 53 69 7a  /.  int *pRegSiz
9a70: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
9a80: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69      /* OUT: Regi
9a90: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
9aa0: 70 61 72 74 69 74 69 6f 6e 20 73 69 7a 65 20 2a  partition size *
9ab0: 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  /.){.  Window *p
9ac0: 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
9ad0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
9ae0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
9af0: 65 29 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73  e);.  int iSubCs
9b00: 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  r = p->pSrc->a[0
9b10: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74  ].iCursor;.  int
9b20: 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   nSub = p->pSrc-
9b30: 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c  >a[0].pTab->nCol
9b40: 3b 0a 20 20 69 6e 74 20 6b 3b 0a 0a 20 20 69 6e  ;.  int k;..  in
9b50: 74 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  t reg = pParse->
9b60: 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72 65  nMem+1;.  int re
9b70: 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e 53  gRecord = reg+nS
9b80: 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ub;.  int regRow
9b90: 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b 31  id = regRecord+1
9ba0: 3b 0a 0a 20 20 2a 70 52 65 67 53 69 7a 65 20 3d  ;..  *pRegSize =
9bb0: 20 72 65 67 52 6f 77 69 64 3b 0a 20 20 70 50 61   regRowid;.  pPa
9bc0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75  rse->nMem += nSu
9bd0: 62 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4d 61 72  b + 2;..  /* Mar
9be0: 74 69 61 6c 20 74 68 65 20 72 6f 77 20 72 65 74  tial the row ret
9bf0: 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 75 62  urned by the sub
9c00: 2d 73 65 6c 65 63 74 20 69 6e 74 6f 20 61 6e 20  -select into an 
9c10: 61 72 72 61 79 20 6f 66 20 0a 20 20 2a 2a 20 72  array of .  ** r
9c20: 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 66  egisters. */.  f
9c30: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20  or(k=0; k<nSub; 
9c40: 6b 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  k++){.    sqlite
9c50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9c60: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62 43 73  P_Column, iSubCs
9c70: 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a 20 20  r, k, reg+k);.  
9c80: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
9c90: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
9ca0: 52 65 63 6f 72 64 2c 20 72 65 67 2c 20 6e 53 75  Record, reg, nSu
9cb0: 62 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 0a  b, regRecord);..
9cc0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
9cd0: 69 73 20 69 73 20 74 68 65 20 73 74 61 72 74 20  is is the start 
9ce0: 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69 74 69  of a new partiti
9cf0: 6f 6e 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c 20  on. If so, call 
9d00: 74 68 65 0a 20 20 2a 2a 20 66 6c 75 73 68 5f 70  the.  ** flush_p
9d10: 61 72 74 69 74 69 6f 6e 20 73 75 62 2d 72 6f 75  artition sub-rou
9d20: 74 69 6e 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  tine.  */.  if( 
9d30: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
9d40: 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  n ){.    int add
9d50: 72 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  r;.    ExprList 
9d60: 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e  *pPart = pMWin->
9d70: 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20  pPartition;.    
9d80: 69 6e 74 20 6e 50 61 72 74 20 3d 20 70 50 61 72  int nPart = pPar
9d90: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 6e  t->nExpr;.    in
9da0: 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72  t regNewPart = r
9db0: 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  eg + pMWin->nBuf
9dc0: 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49  ferCol;.    KeyI
9dd0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
9de0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
9df0: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
9e00: 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b  e, pPart, 0, 0);
9e10: 0a 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  ..    addr = sql
9e20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9e30: 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
9e40: 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d  gNewPart, pMWin-
9e50: 3e 72 65 67 50 61 72 74 2c 6e 50 61 72 74 29 3b  >regPart,nPart);
9e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9e70: 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69  AppendP4(v, (voi
9e80: 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  d*)pKeyInfo, P4_
9e90: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71  KEYINFO);.    sq
9ea0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9eb0: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
9ec0: 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61 64 64 72  +2, addr+4, addr
9ed0: 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  +2);.    VdbeCov
9ee0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
9ef0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9f00: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e  v, OP_Copy, regN
9f10: 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72  ewPart, pMWin->r
9f20: 65 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31 29  egPart, nPart-1)
9f30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9f40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
9f50: 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72  sub, regFlushPar
9f60: 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29  t, lblFlushPart)
9f70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 66 66  ;.  }..  /* Buff
9f80: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  er the current r
9f90: 6f 77 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65  ow in the epheme
9fa0: 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ral table. */.  
9fb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9fc0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
9fd0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
9fe0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
9ff0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a000: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
a010: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
a020: 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  egRecord, regRow
a030: 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f  id);..  /* End o
a040: 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
a050: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
a060: 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
a070: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 22 66 6c 75    /* Invoke "flu
a080: 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 74 6f  sh_partition" to
a090: 20 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 66   deal with the f
a0a0: 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c 79 29 20 70  inal (or only) p
a0b0: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  artition */.  sq
a0c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a0d0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
a0e0: 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c  FlushPart, lblFl
a0f0: 75 73 68 50 61 72 74 29 3b 0a 7d 0a 0a 2f 2a 0a  ushPart);.}../*.
a100: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75  ** Invoke the su
a110: 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 72 65 67  b-routine at reg
a120: 47 6f 73 75 62 20 28 67 65 6e 65 72 61 74 65 64  Gosub (generated
a130: 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65   by code in sele
a140: 63 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74 75  ct.c) to.** retu
a150: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
a160: 6f 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45 70  ow of Window.iEp
a170: 68 43 73 72 2e 20 49 66 20 61 6c 6c 20 77 69 6e  hCsr. If all win
a180: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  dow functions ar
a190: 65 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 77  e.** aggregate w
a1a0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
a1b0: 74 68 61 74 20 75 73 65 20 74 68 65 20 73 74 61  that use the sta
a1c0: 6e 64 61 72 64 20 41 50 49 2c 20 61 20 73 69 6e  ndard API, a sin
a1d0: 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62 20  gle.** OP_Gosub 
a1e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61  instruction is a
a1f0: 6c 6c 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ll that this rou
a200: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 2e 20  tine generates. 
a210: 45 78 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a 2a  Extra VM code.**
a220: 20 66 6f 72 20 70 65 72 2d 72 6f 77 20 70 72 6f   for per-row pro
a230: 63 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20  cessing is only 
a240: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68  generated for th
a250: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c  e following buil
a260: 74 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20 66  t-in window.** f
a270: 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
a280: 20 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a 2a    nth_value().**
a290: 20 20 20 66 69 72 73 74 5f 76 61 6c 75 65 28 29     first_value()
a2a0: 0a 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20 20  .**   lag().**  
a2b0: 20 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74 69   lead().*/.stati
a2c0: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74  c void windowRet
a2d0: 75 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50 61 72  urnOneRow(.  Par
a2e0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 69  se *pParse,.  Wi
a2f0: 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20 20 69  ndow *pMWin,.  i
a300: 6e 74 20 72 65 67 47 6f 73 75 62 2c 0a 20 20 69  nt regGosub,.  i
a310: 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a  nt addrGosub.){.
a320: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
a330: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
a340: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
a350: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
a360: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
a370: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
a380: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
a390: 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
a3a0: 6e 63 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  nc;.    if( pFun
a3b0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76  c->xSFunc==nth_v
a3c0: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20  alueStepFunc .  
a3d0: 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46     || pFunc->xSF
a3e0: 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  unc==first_value
a3f0: 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20 29 7b  StepFunc .    ){
a400: 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d  .      int csr =
a410: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20   pWin->csrApp;. 
a420: 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73       int lbl = s
a430: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
a440: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
a450: 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74  t tmpReg = sqlit
a460: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a470: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
a480: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a490: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
a4a0: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 0a  n->regResult);..
a4b0: 20 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d        if( pFunc-
a4c0: 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76 61 6c  >xSFunc==nth_val
a4d0: 75 65 53 74 65 70 46 75 6e 63 20 29 7b 0a 20 20  ueStepFunc ){.  
a4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a4f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
a500: 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  lumn, pMWin->iEp
a510: 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67  hCsr, pWin->iArg
a520: 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29 3b 0a 20  Col+1,tmpReg);. 
a530: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a550: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
a560: 67 65 72 2c 20 31 2c 20 74 6d 70 52 65 67 29 3b  ger, 1, tmpReg);
a570: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a590: 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74 6d 70 52  (v, OP_Add, tmpR
a5a0: 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  eg, pWin->regApp
a5b0: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
a5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a5d0: 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20 70 57 69  p3(v, OP_Gt, pWi
a5e0: 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20 6c 62 6c  n->regApp+1, lbl
a5f0: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
a600: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
a610: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a620: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a630: 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20  SeekRowid, csr, 
a640: 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  lbl, tmpReg);.  
a650: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a660: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
a670: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a680: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
a690: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70  pWin->iArgCol, p
a6a0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
a6b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a6c0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
a6d0: 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71  , lbl);.      sq
a6e0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a6f0: 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52  Reg(pParse, tmpR
a700: 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  eg);.    }.    e
a710: 6c 73 65 20 69 66 28 20 70 46 75 6e 63 2d 3e 78  lse if( pFunc->x
a720: 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46  SFunc==leadStepF
a730: 75 6e 63 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53  unc || pFunc->xS
a740: 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e  Func==lagStepFun
a750: 63 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  c ){.      int n
a760: 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e  Arg = pWin->pOwn
a770: 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  er->x.pList->nEx
a780: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 45  pr;.      int iE
a790: 70 68 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ph = pMWin->iEph
a7a0: 43 73 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  Csr;.      int c
a7b0: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
a7c0: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
a7d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
a7e0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
a7f0: 20 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73    int tmpReg = s
a800: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a810: 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20  (pParse);..     
a820: 20 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20   if( nArg<3 ){. 
a830: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a840: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
a850: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
a860: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
a870: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
a880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a890: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
a8a0: 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  Eph, pWin->iArgC
a8b0: 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67 52  ol+2, pWin->regR
a8c0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a  esult);.      }.
a8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a8e0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
a8f0: 77 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65  wid, iEph, tmpRe
a900: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  g);.      if( nA
a910: 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<2 ){.        
a920: 69 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63  int val = (pFunc
a930: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74  ->xSFunc==leadSt
a940: 65 70 46 75 6e 63 20 3f 20 31 20 3a 20 2d 31 29  epFunc ? 1 : -1)
a950: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a960: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a970: 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65 67  P_AddImm, tmpReg
a980: 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 7d 65  , val);.      }e
a990: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
a9a0: 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e 78 53   op = (pFunc->xS
a9b0: 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75  Func==leadStepFu
a9c0: 6e 63 20 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50  nc ? OP_Add : OP
a9d0: 5f 53 75 62 74 72 61 63 74 29 3b 0a 20 20 20 20  _Subtract);.    
a9e0: 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32 20      int tmpReg2 
a9f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
aa00: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
aa10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
aa20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
aa30: 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d  umn, iEph, pWin-
aa40: 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52  >iArgCol+1, tmpR
aa50: 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eg2);.        sq
aa60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
aa70: 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32 2c 20  v, op, tmpReg2, 
aa80: 74 6d 70 52 65 67 2c 20 74 6d 70 52 65 67 29 3b  tmpReg, tmpReg);
aa90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
aaa0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
aab0: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 32 29 3b  Parse, tmpReg2);
aac0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
aad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aae0: 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69  3(v, OP_SeekRowi
aaf0: 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70  d, csr, lbl, tmp
ab00: 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Reg);.      Vdbe
ab10: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
ab20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ab30: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
ab40: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
ab50: 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67  rgCol, pWin->reg
ab60: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73  Result);.      s
ab70: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ab80: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a  eLabel(v, lbl);.
ab90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
aba0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
abb0: 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  se, tmpReg);.   
abc0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
abd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
abe0: 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62  _Gosub, regGosub
abf0: 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a  , addrGosub);.}.
ac00: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
ac10: 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
ac20: 20 62 79 20 77 69 6e 64 6f 77 52 65 74 75 72 6e   by windowReturn
ac30: 4f 6e 65 52 6f 77 28 29 20 61 6e 64 2c 20 6f 70  OneRow() and, op
ac40: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 2a 2a  tionally, the.**
ac50: 20 78 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63   xInverse() func
ac60: 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69  tion for each wi
ac70: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2c 20 66  ndow function, f
ac80: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72  or one or more r
ac90: 6f 77 73 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ows.** from the 
aca0: 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 20 74  Window.iEphCsr t
acb0: 65 6d 70 20 74 61 62 6c 65 2e 20 54 68 69 73 20  emp table. This 
acc0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
acd0: 73 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 73 69 6d  s VM code.** sim
ace0: 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ilar to:.**.**  
acf0: 20 77 68 69 6c 65 28 20 72 65 67 43 74 72 3e 30   while( regCtr>0
ad00: 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 67 43 74   ){.**     regCt
ad10: 72 2d 2d 3b 0a 2a 2a 20 20 20 20 20 77 69 6e 64  r--;.**     wind
ad20: 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 29  owReturnOneRow()
ad30: 0a 2a 2a 20 20 20 20 20 69 66 28 20 62 49 6e 76  .**     if( bInv
ad40: 65 72 73 65 20 29 7b 0a 2a 2a 20 20 20 20 20 20  erse ){.**      
ad50: 20 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a 20 20   AggInverse.**  
ad60: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 4e 65 78 74     }.**     Next
ad70: 20 28 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72   (Window.iEphCsr
ad80: 29 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 73 74 61 74  ).**   }.*/.stat
ad90: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65  ic void windowRe
ada0: 74 75 72 6e 52 6f 77 73 28 0a 20 20 50 61 72 73  turnRows(.  Pars
adb0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 69 6e  e *pParse,.  Win
adc0: 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20  dow *pMWin,     
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ade0: 4c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66  List of window f
adf0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
ae00: 74 20 72 65 67 43 74 72 2c 20 20 20 20 20 20 20  t regCtr,       
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae20: 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69   Register contai
ae30: 6e 69 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 72  ning number of r
ae40: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ows */.  int reg
ae50: 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20  Gosub,          
ae60: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
ae70: 73 74 65 72 20 66 6f 72 20 47 6f 73 75 62 20 61  ster for Gosub a
ae80: 64 64 72 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e  ddrGosub */.  in
ae90: 74 20 61 64 64 72 47 6f 73 75 62 2c 20 20 20 20  t addrGosub,    
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aeb0: 20 41 64 64 72 65 73 73 20 6f 66 20 73 75 62 2d   Address of sub-
aec0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 52 65 74 75  routine for Retu
aed0: 72 6e 4f 6e 65 52 6f 77 20 2a 2f 0a 20 20 69 6e  rnOneRow */.  in
aee0: 74 20 72 65 67 49 6e 76 41 72 67 2c 20 20 20 20  t regInvArg,    
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af00: 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   Array of regist
af10: 65 72 73 20 66 6f 72 20 78 49 6e 76 65 72 73 65  ers for xInverse
af20: 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74 20 72   args */.  int r
af30: 65 67 49 6e 76 53 69 7a 65 20 20 20 20 20 20 20  egInvSize       
af40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
af50: 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e  gister containin
af60: 67 20 73 69 7a 65 20 6f 66 20 70 61 72 74 69 74  g size of partit
af70: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ion */.){.  int 
af80: 61 64 64 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  addr;.  Vdbe *v 
af90: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
afa0: 28 70 50 61 72 73 65 29 3b 0a 20 20 77 69 6e 64  (pParse);.  wind
afb0: 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73  owAggFinal(pPars
afc0: 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20  e, pMWin, 0);.  
afd0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
afe0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
aff0: 66 50 6f 73 2c 20 72 65 67 43 74 72 2c 20 73 71  fPos, regCtr, sq
b000: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
b010: 41 64 64 72 28 76 29 2b 32 20 2c 31 29 3b 0a 20  Addr(v)+2 ,1);. 
b020: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b030: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
b040: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
b050: 2c 20 30 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f  , 0, 0);.  windo
b060: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50  wReturnOneRow(pP
b070: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67  arse, pMWin, reg
b080: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
b090: 29 3b 0a 20 20 69 66 28 20 72 65 67 49 6e 76 41  );.  if( regInvA
b0a0: 72 67 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77  rg ){.    window
b0b0: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
b0c0: 70 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45  pMWin, pMWin->iE
b0d0: 70 68 43 73 72 2c 20 31 2c 20 72 65 67 49 6e 76  phCsr, 1, regInv
b0e0: 41 72 67 2c 20 72 65 67 49 6e 76 53 69 7a 65 29  Arg, regInvSize)
b0f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
b100: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b110: 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  Next, pMWin->iEp
b120: 68 43 73 72 2c 20 61 64 64 72 29 3b 0a 20 20 56  hCsr, addr);.  V
b130: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b140: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
b150: 70 48 65 72 65 28 76 2c 20 61 64 64 72 2b 31 29  pHere(v, addr+1)
b160: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 47 6f  ;   /* The OP_Go
b170: 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  to */.}../*.** G
b180: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
b190: 73 65 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61  set the accumula
b1a0: 74 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f 72  tor register for
b1b0: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
b1c0: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ction.** in the 
b1d0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73  linked list pass
b1e0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
b1f0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c   argument to NUL
b200: 4c 2e 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a  L. And perform.*
b210: 2a 20 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74  * any equivalent
b220: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
b230: 72 65 71 75 69 72 65 64 20 62 79 20 61 6e 79 20  required by any 
b240: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
b250: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  functions.** in 
b260: 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
b270: 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e  tic int windowIn
b280: 69 74 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70  itAccum(Parse *p
b290: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
b2a0: 4d 57 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76  MWin){.  Vdbe *v
b2b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
b2c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
b2d0: 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e   regArg;.  int n
b2e0: 41 72 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f  Arg = 0;.  Windo
b2f0: 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70  w *pWin;.  for(p
b300: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
b310: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
b320: 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44  tWin){.    FuncD
b330: 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e  ef *pFunc = pWin
b340: 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c  ->pFunc;.    sql
b350: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b360: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
b370: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20  in->regAccum);. 
b380: 20 20 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41     nArg = MAX(nA
b390: 72 67 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75  rg, windowArgCou
b3a0: 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69  nt(pWin));.    i
b3b0: 66 28 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63  f( pFunc->xSFunc
b3c0: 3d 3d 6e 74 68 5f 76 61 6c 75 65 53 74 65 70 46  ==nth_valueStepF
b3d0: 75 6e 63 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e  unc.     || pFun
b3e0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74  c->xSFunc==first
b3f0: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a  _valueStepFunc .
b400: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
b410: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b420: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
b430: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b 0a   pWin->regApp);.
b440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b450: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
b460: 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e  teger, 0, pWin->
b470: 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d  regApp+1);.    }
b480: 0a 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e 63  ..    if( (pFunc
b490: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
b4a0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
b4b0: 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72 41 70  ) && pWin->csrAp
b4c0: 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
b4d0: 74 28 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 21  t( pWin->eStart!
b4e0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 3b  =TK_UNBOUNDED );
b4f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b500: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
b510: 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e  esetSorter, pWin
b520: 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20  ->csrApp);.     
b530: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b540: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
b550: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
b560: 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  p+1);.    }.  }.
b570: 20 20 72 65 67 41 72 67 20 3d 20 70 50 61 72 73    regArg = pPars
b580: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61  e->nMem+1;.  pPa
b590: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41 72  rse->nMem += nAr
b5a0: 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 41  g;.  return regA
b5b0: 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rg;.}.../*.** Th
b5c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
b5d0: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 71 6c   the work of sql
b5e0: 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
b5f0: 65 70 28 29 20 66 6f 72 20 61 6c 6c 20 22 52 4f  ep() for all "RO
b600: 57 53 22 0a 2a 2a 20 77 69 6e 64 6f 77 20 66 72  WS".** window fr
b610: 61 6d 65 20 74 79 70 65 73 20 65 78 63 65 70 74  ame types except
b620: 20 66 6f 72 20 22 42 45 54 57 45 45 4e 20 55 4e   for "BETWEEN UN
b630: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
b640: 47 20 41 4e 44 20 43 55 52 52 45 4e 54 0a 2a 2a  G AND CURRENT.**
b650: 20 52 4f 57 22 2e 20 50 73 65 75 64 6f 2d 63 6f   ROW". Pseudo-co
b660: 64 65 20 66 6f 72 20 65 61 63 68 20 66 6f 6c 6c  de for each foll
b670: 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20  ows..**.** ROWS 
b680: 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e 20  BETWEEN <expr1> 
b690: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
b6a0: 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a  xpr2> FOLLOWING.
b6b0: 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a 2a 2a  **.**     ....**
b6c0: 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
b6d0: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
b6e0: 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75         Gosub flu
b6f0: 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20  sh_partition.** 
b700: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
b710: 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64 20   Insert (record 
b720: 69 6e 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a  in eph-table).**
b730: 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
b740: 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 47 6f  eEnd().**     Go
b750: 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74  sub flush_partit
b760: 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20 20 20 66 6c  ion.**  .**   fl
b770: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a  ush_partition:.*
b780: 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20  *     Once {.** 
b790: 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69        OpenDup (i
b7a0: 45 70 68 43 73 72 20 2d 3e 20 63 73 72 53 74 61  EphCsr -> csrSta
b7b0: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65  rt).**       Ope
b7c0: 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e  nDup (iEphCsr ->
b7d0: 20 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20   csrEnd).**     
b7e0: 7d 0a 2a 2a 20 20 20 20 20 72 65 67 53 74 61 72  }.**     regStar
b7f0: 74 20 3d 20 3c 65 78 70 72 31 3e 20 20 20 20 20  t = <expr1>     
b800: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 50 52             // PR
b810: 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73 69  ECEDING expressi
b820: 6f 6e 0a 2a 2a 20 20 20 20 20 72 65 67 45 6e 64  on.**     regEnd
b830: 20 3d 20 3c 65 78 70 72 32 3e 20 20 20 20 20 20   = <expr2>      
b840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 46              // F
b850: 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73 73  OLLOWING express
b860: 69 6f 6e 0a 2a 2a 20 20 20 20 20 69 66 28 20 72  ion.**     if( r
b870: 65 67 53 74 61 72 74 3c 30 20 7c 7c 20 72 65 67  egStart<0 || reg
b880: 45 6e 64 3c 30 20 29 7b 20 65 72 72 6f 72 21 20  End<0 ){ error! 
b890: 7d 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20  }.**     Rewind 
b8a0: 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73  (csr,csrStart,cs
b8b0: 72 45 6e 64 29 20 20 20 20 20 20 2f 2f 20 69 66  rEnd)      // if
b8c0: 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f   EOF goto flush_
b8d0: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a  partition_done.*
b8e0: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
b8f0: 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20  End)            
b900: 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f          // if EO
b910: 46 20 73 6b 69 70 20 41 67 67 73 74 65 70 0a 2a  F skip Aggstep.*
b920: 2a 20 20 20 20 20 20 20 41 67 67 73 74 65 70 20  *       Aggstep 
b930: 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20  (csrEnd).**     
b940: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
b950: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
b960: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
b970: 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47  ue).**         G
b980: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
b990: 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63  *         Next(c
b9a0: 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  sr)             
b9b0: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
b9c0: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
b9d0: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  n_done.**       
b9e0: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
b9f0: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
ba00: 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65        AggInverse
ba10: 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20   (csrStart).**  
ba20: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
ba30: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
ba40: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d 0a     }.**       }.
ba50: 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69  **   flush_parti
ba60: 74 69 6f 6e 5f 64 6f 6e 65 3a 0a 2a 2a 20 20 20  tion_done:.**   
ba70: 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 28 63    ResetSorter (c
ba80: 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75 72  sr).**     Retur
ba90: 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  n.**.** ROWS BET
baa0: 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43  WEEN <expr> PREC
bab0: 45 44 49 4e 47 20 20 20 20 41 4e 44 20 43 55 52  EDING    AND CUR
bac0: 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 52 4f 57 53  RENT ROW.** ROWS
bad0: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
bae0: 20 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44   ROW         AND
baf0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
bb00: 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  G.** ROWS BETWEE
bb10: 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
bb20: 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 3e  EDING AND <expr>
bb30: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
bb40: 20 20 20 54 68 65 73 65 20 61 72 65 20 73 69 6d     These are sim
bb50: 69 6c 61 72 20 74 6f 20 74 68 65 20 61 62 6f 76  ilar to the abov
bb60: 65 2e 20 46 6f 72 20 22 43 55 52 52 45 4e 54 20  e. For "CURRENT 
bb70: 52 4f 57 22 2c 20 69 6e 74 69 61 6c 69 7a 65 20  ROW", intialize 
bb80: 74 68 65 0a 2a 2a 20 20 20 72 65 67 69 73 74 65  the.**   registe
bb90: 72 20 74 6f 20 30 2e 20 46 6f 72 20 22 55 4e 42  r to 0. For "UNB
bba0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
bbb0: 22 20 74 6f 20 69 6e 66 69 6e 69 74 79 2e 0a 2a  " to infinity..*
bbc0: 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  *.** ROWS BETWEE
bbd0: 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49  N <expr> PRECEDI
bbe0: 4e 47 20 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e  NG    AND UNBOUN
bbf0: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  DED FOLLOWING.**
bc00: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55   ROWS BETWEEN CU
bc10: 52 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20 20  RRENT ROW       
bc20: 20 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20    AND UNBOUNDED 
bc30: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
bc40: 20 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c      Rewind (csr,
bc50: 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29  csrStart,csrEnd)
bc60: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
bc70: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
bc80: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 77  on_done.**     w
bc90: 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20  hile( 1 ){.**   
bca0: 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29      Next(csrEnd)
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 2f 2f 20 45 78 69 74 20 77 68 69 6c 65 28    // Exit while(
bcd0: 31 29 20 61 74 20 45 4f 46 0a 2a 2a 20 20 20 20  1) at EOF.**    
bce0: 20 20 20 41 67 67 73 74 65 70 20 28 63 73 72 45     Aggstep (csrE
bcf0: 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  nd).**     }.** 
bd00: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
bd10: 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61  **       AggFina
bd20: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
bd30: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
bd40: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  sub.**       Nex
bd50: 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20 20  t(csr)          
bd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66             // if
bd70: 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f   EOF goto flush_
bd80: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a  partition_done.*
bd90: 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67  *       if( (reg
bda0: 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
bdb0: 2a 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76  *         AggInv
bdc0: 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29 0a  erse (csrStart).
bdd0: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
bde0: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
bdf0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a     }.**     }.**
be00: 0a 2a 2a 20 20 20 46 6f 72 20 74 68 65 20 22 43  .**   For the "C
be10: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
be20: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
be30: 4e 47 22 20 63 61 73 65 2c 20 74 68 65 20 66 69  NG" case, the fi
be40: 6e 61 6c 20 69 66 28 29 20 0a 2a 2a 20 20 20 63  nal if() .**   c
be50: 6f 6e 64 69 74 69 6f 6e 20 69 73 20 61 6c 77 61  ondition is alwa
be60: 79 73 20 74 72 75 65 20 28 61 73 20 69 66 20 72  ys true (as if r
be70: 65 67 53 74 61 72 74 20 77 65 72 65 20 69 6e 69  egStart were ini
be80: 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 29 2e 0a  tialized to 0)..
be90: 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  **.** RANGE BETW
bea0: 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
beb0: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
bec0: 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 0a 2a 2a 20 20  LLOWING.** .**  
bed0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   This is the onl
bee0: 79 20 52 41 4e 47 45 20 63 61 73 65 20 68 61 6e  y RANGE case han
bef0: 64 6c 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  dled by this rou
bf00: 74 69 6e 65 2e 20 49 74 20 6d 6f 64 69 66 69 65  tine. It modifie
bf10: 73 20 74 68 65 0a 2a 2a 20 20 20 73 65 63 6f 6e  s the.**   secon
bf20: 64 20 77 68 69 6c 65 28 20 31 20 29 20 6c 6f 6f  d while( 1 ) loo
bf30: 70 20 69 6e 20 22 52 4f 57 53 20 42 45 54 57 45  p in "ROWS BETWE
bf40: 45 4e 20 43 55 52 52 45 4e 54 20 2e 2e 2e 20 55  EN CURRENT ... U
bf50: 4e 42 4f 55 4e 44 45 44 2e 2e 2e 22 20 74 6f 0a  NBOUNDED..." to.
bf60: 2a 2a 20 20 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  **   be:.**.**  
bf70: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
bf80: 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c  *       AggFinal
bf90: 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20   (xValue).**    
bfa0: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
bfb0: 2a 20 20 20 20 20 20 20 20 20 72 65 67 50 65 65  *         regPee
bfc0: 72 2b 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47  r++.**         G
bfd0: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
bfe0: 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63  *         Next(c
bff0: 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  sr)             
c000: 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f          // if EO
c010: 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72  F goto flush_par
c020: 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20  tition_done.**  
c030: 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
c040: 65 65 72 20 29 20 62 72 65 61 6b 3b 0a 2a 2a 20  eer ) break;.** 
c050: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
c060: 20 77 68 69 6c 65 28 20 28 72 65 67 50 65 65 72   while( (regPeer
c070: 2d 2d 29 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20  --)>0 ){.**     
c080: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
c090: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
c0a0: 20 20 20 20 20 4e 65 78 74 28 63 73 72 53 74 61       Next(csrSta
c0b0: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  rt).**       }.*
c0c0: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f  *     }.**.** RO
c0d0: 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
c0e0: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 20 20 20 41  > FOLLOWING    A
c0f0: 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  ND <expr> FOLLOW
c100: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 72 65 67 45  ING.**.**   regE
c110: 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d 20 72 65  nd = regEnd - re
c120: 67 53 74 61 72 74 0a 2a 2a 20 20 20 52 65 77 69  gStart.**   Rewi
c130: 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72 74  nd (csr,csrStart
c140: 2c 63 73 72 45 6e 64 29 20 20 20 2f 2f 20 69 66  ,csrEnd)   // if
c150: 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f   EOF goto flush_
c160: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a  partition_done.*
c170: 2a 20 20 20 20 20 41 67 67 73 74 65 70 20 28 63  *     Aggstep (c
c180: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 4e 65  srEnd).**     Ne
c190: 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20 20  xt(csrEnd)      
c1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66             // if
c1b0: 20 45 4f 46 20 66 61 6c 6c 2d 74 68 72 6f 75 67   EOF fall-throug
c1c0: 68 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65  h.**     if( (re
c1d0: 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a  gEnd--)<=0 ){.**
c1e0: 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53         if( (regS
c1f0: 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a  tart--)<=0 ){.**
c200: 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e 61           AggFina
c210: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
c220: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
c230: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20  Gosub.**        
c240: 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20   Next(csr)      
c250: 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f          // if EO
c260: 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72  F goto flush_par
c270: 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20  tition_done.**  
c280: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
c290: 41 67 67 49 6e 76 65 72 73 65 20 28 63 73 72 53  AggInverse (csrS
c2a0: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 4e  tart).**       N
c2b0: 65 78 74 20 28 63 73 72 53 74 61 72 74 29 0a 2a  ext (csrStart).*
c2c0: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52 4f  *     }.**.** RO
c2d0: 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
c2e0: 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20 41  > PRECEDING    A
c2f0: 4e 44 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  ND <expr> PRECED
c300: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 52 65 70 6c  ING.**.**   Repl
c310: 61 63 65 20 74 68 65 20 62 69 74 20 61 66 74 65  ace the bit afte
c320: 72 20 22 52 65 77 69 6e 64 22 20 69 6e 20 74 68  r "Rewind" in th
c330: 65 20 61 62 6f 76 65 20 77 69 74 68 3a 0a 2a 2a  e above with:.**
c340: 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65 67  .**     if( (reg
c350: 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  End--)<=0 ){.** 
c360: 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63        AggStep (c
c370: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20 20  srEnd).**       
c380: 4e 65 78 74 20 28 63 73 72 45 6e 64 29 0a 2a 2a  Next (csrEnd).**
c390: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67       }.**     Ag
c3a0: 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a  gFinal (xValue).
c3b0: 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 61 64 64  **     Gosub add
c3c0: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 4e 65  rGosub.**     Ne
c3d0: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
c3e0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
c3f0: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
c400: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
c410: 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72      if( (regStar
c420: 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  t--)<=0 ){.**   
c430: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
c440: 63 73 72 32 29 0a 2a 2a 20 20 20 20 20 20 20 4e  csr2).**       N
c450: 65 78 74 20 28 63 73 72 32 29 0a 2a 2a 20 20 20  ext (csr2).**   
c460: 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63    }.**.*/.static
c470: 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64 65   void windowCode
c480: 52 6f 77 45 78 70 72 53 74 65 70 28 0a 20 20 50  RowExprStep(.  P
c490: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
c4a0: 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68   Select *p,.  Wh
c4b0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
c4c0: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
c4d0: 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75   .  int addrGosu
c4e0: 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  b.){.  Window *p
c4f0: 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
c500: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
c510: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
c520: 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 46 6c 75  e);.  int regFlu
c530: 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20 20  shPart;         
c540: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
c550: 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75  r for "Gosub flu
c560: 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f  sh_partition" */
c570: 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50  .  int lblFlushP
c580: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
c590: 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
c5a0: 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72  "Gosub flush_par
c5b0: 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  tition" */.  int
c5c0: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 3b 20 20   lblFlushDone;  
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c5e0: 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75 62  Label for "Gosub
c5f0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
c600: 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20 20 69 6e 74  _done" */..  int
c610: 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 61   regArg;.  int a
c620: 64 64 72 3b 0a 20 20 69 6e 74 20 63 73 72 53 74  ddr;.  int csrSt
c630: 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  art = pParse->nT
c640: 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 63 73 72 45  ab++;.  int csrE
c650: 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  nd = pParse->nTa
c660: 62 2b 2b 3b 0a 20 20 69 6e 74 20 72 65 67 53 74  b++;.  int regSt
c670: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
c680: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
c690: 20 6f 66 20 3c 65 78 70 72 3e 20 50 52 45 43 45   of <expr> PRECE
c6a0: 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72 65  DING */.  int re
c6b0: 67 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  gEnd;           
c6c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
c6d0: 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 46 4f  lue of <expr> FO
c6e0: 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74  LLOWING */.  int
c6f0: 20 61 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e 74   addrGoto;.  int
c700: 20 61 64 64 72 54 6f 70 3b 0a 20 20 69 6e 74 20   addrTop;.  int 
c710: 61 64 64 72 49 66 50 6f 73 31 3b 0a 20 20 69 6e  addrIfPos1;.  in
c720: 74 20 61 64 64 72 49 66 50 6f 73 32 3b 0a 20 20  t addrIfPos2;.  
c730: 69 6e 74 20 72 65 67 53 69 7a 65 20 3d 20 30 3b  int regSize = 0;
c740: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69  ..  assert( pMWi
c750: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52  n->eStart==TK_PR
c760: 45 43 45 44 49 4e 47 20 0a 20 20 20 20 20 20 20  ECEDING .       
c770: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
c780: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20  ==TK_CURRENT .  
c790: 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
c7a0: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
c7b0: 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ING .       || p
c7c0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
c7d0: 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 29 3b  _UNBOUNDED .  );
c7e0: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e  .  assert( pMWin
c7f0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
c800: 57 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20  WING .       || 
c810: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
c820: 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20  CURRENT .       
c830: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  || pMWin->eEnd==
c840: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20  TK_UNBOUNDED .  
c850: 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
c860: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
c870: 47 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  G .  );..  /* Al
c880: 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72 20  locate register 
c890: 61 6e 64 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  and label for th
c8a0: 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69  e "flush_partiti
c8b0: 6f 6e 22 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e  on" sub-routine.
c8c0: 20 2a 2f 0a 20 20 72 65 67 46 6c 75 73 68 50 61   */.  regFlushPa
c8d0: 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rt = ++pParse->n
c8e0: 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75 73 68 50  Mem;.  lblFlushP
c8f0: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
c900: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
c910: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 20 3d 20   lblFlushDone = 
c920: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
c930: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 72 65 67 53  abel(v);..  regS
c940: 74 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tart = ++pParse-
c950: 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6e 64 20  >nMem;.  regEnd 
c960: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
c970: 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69  ;..  windowParti
c980: 74 69 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65  tionCache(pParse
c990: 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
c9a0: 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c  FlushPart, lblFl
c9b0: 75 73 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a  ushPart, &regSiz
c9c0: 65 29 3b 0a 0a 20 20 61 64 64 72 47 6f 74 6f 20  e);..  addrGoto 
c9d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c9e0: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
c9f0: 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  ..  /* Start of 
ca00: 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e  "flush_partition
ca10: 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  " */.  sqlite3Vd
ca20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ca30: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
ca40: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ca50: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp2(v, OP_Once,
ca60: 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
ca70: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
ca80: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
ca90: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
caa0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
cab0: 70 65 6e 44 75 70 2c 20 63 73 72 53 74 61 72 74  penDup, csrStart
cac0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
cad0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
cae0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
caf0: 6e 44 75 70 2c 20 63 73 72 45 6e 64 2c 20 70 4d  nDup, csrEnd, pM
cb00: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a  Win->iEphCsr);..
cb10: 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 72    /* If either r
cb20: 65 67 53 74 61 72 74 20 6f 72 20 72 65 67 45 6e  egStart or regEn
cb30: 64 20 61 72 65 20 6e 6f 74 20 6e 6f 6e 2d 6e 65  d are not non-ne
cb40: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 73 2c  gative integers,
cb50: 20 74 68 72 6f 77 20 0a 20 20 2a 2a 20 61 6e 20   throw .  ** an 
cb60: 65 78 63 65 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  exception.  */. 
cb70: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61   if( pMWin->pSta
cb80: 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rt ){.    sqlite
cb90: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cba0: 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c  , pMWin->pStart,
cbb0: 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20   regStart);.    
cbc0: 77 69 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65  windowCheckFrame
cbd0: 4f 66 66 73 65 74 28 70 50 61 72 73 65 2c 20 72  Offset(pParse, r
cbe0: 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 7d  egStart, 0);.  }
cbf0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 45  .  if( pMWin->pE
cc00: 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nd ){.    sqlite
cc10: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cc20: 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20 72  , pMWin->pEnd, r
cc30: 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69 6e 64  egEnd);.    wind
cc40: 6f 77 43 68 65 63 6b 46 72 61 6d 65 4f 66 66 73  owCheckFrameOffs
cc50: 65 74 28 70 50 61 72 73 65 2c 20 72 65 67 45 6e  et(pParse, regEn
cc60: 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d, 1);.  }..  /*
cc70: 20 49 66 20 74 68 69 73 20 69 73 20 22 52 4f 57   If this is "ROW
cc80: 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57  S <expr1> FOLLOW
cc90: 49 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c 65 78  ING AND ROWS <ex
cca0: 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2c  pr2> FOLLOWING",
ccb0: 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   do:.  **.  **  
ccc0: 20 69 66 28 20 72 65 67 45 6e 64 3c 72 65 67 53   if( regEnd<regS
ccd0: 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20 20 20  tart ){.  **    
cce0: 20 2f 2f 20 54 68 65 20 66 72 61 6d 65 20 61 6c   // The frame al
ccf0: 77 61 79 73 20 63 6f 6e 73 69 73 74 73 20 6f 66  ways consists of
cd00: 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20 20 20   0 rows.  **    
cd10: 20 72 65 67 53 74 61 72 74 20 3d 20 72 65 67 53   regStart = regS
cd20: 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20 20  ize;.  **   }.  
cd30: 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65  **   regEnd = re
cd40: 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74 3b  gEnd - regStart;
cd50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  .  */.  if( pMWi
cd60: 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69 6e  n->pEnd && pMWin
cd70: 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57 69  ->pStart && pMWi
cd80: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
cd90: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61  LLOWING ){.    a
cda0: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
cdb0: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
cdc0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
cdd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
cde0: 47 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71  Ge, regStart, sq
cdf0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
ce00: 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 45 6e  Addr(v)+2, regEn
ce10: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
ce20: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
ce30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ce40: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69  , OP_Copy, regSi
ce50: 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20  ze, regStart);. 
ce60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ce70: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
ce80: 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20 72  act, regStart, r
ce90: 65 67 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a  egEnd, regEnd);.
cea0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e    }..  if( pMWin
ceb0: 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69 6e 2d  ->pEnd && pMWin-
cec0: 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57 69 6e  >pStart && pMWin
ced0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
cee0: 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73 65  DING ){.    asse
cef0: 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  rt( pMWin->eStar
cf00: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
cf10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
cf20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c  beAddOp3(v, OP_L
cf30: 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c  e, regStart, sql
cf40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
cf50: 64 64 72 28 76 29 2b 33 2c 20 72 65 67 45 6e 64  ddr(v)+3, regEnd
cf60: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
cf70: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
cf80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cf90: 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a   OP_Copy, regSiz
cfa0: 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20  e, regStart);.  
cfb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cfc0: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
cfd0: 72 65 67 53 69 7a 65 2c 20 72 65 67 45 6e 64 29  regSize, regEnd)
cfe0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
cff0: 69 61 6c 69 7a 65 20 74 68 65 20 61 63 63 75 6d  ialize the accum
d000: 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20  ulator register 
d010: 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
d020: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c  function to NULL
d030: 20 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20 77   */.  regArg = w
d040: 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70  indowInitAccum(p
d050: 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a  Parse, pMWin);..
d060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d070: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
d080: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
d090: 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b  , lblFlushDone);
d0a0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
d0b0: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
d0c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
d0d0: 77 69 6e 64 2c 20 63 73 72 53 74 61 72 74 2c 20  wind, csrStart, 
d0e0: 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20  lblFlushDone);. 
d0f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
d100: 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71  erTaken(v);.  sq
d110: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
d120: 35 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  5(v, 1);.  sqlit
d130: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d140: 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 45 6e  OP_Rewind, csrEn
d150: 64 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29  d, lblFlushDone)
d160: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
d170: 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20  NeverTaken(v);. 
d180: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
d190: 67 65 50 35 28 76 2c 20 31 29 3b 0a 0a 20 20 2f  geP5(v, 1);..  /
d1a0: 2a 20 49 6e 76 6f 6b 65 20 41 67 67 53 74 65 70  * Invoke AggStep
d1b0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
d1c0: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
d1d0: 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77  on using the row
d1e0: 20 74 68 61 74 0a 20 20 2a 2a 20 63 73 72 45 6e   that.  ** csrEn
d1f0: 64 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  d currently poin
d200: 74 73 20 74 6f 2e 20 4f 72 2c 20 69 66 20 63 73  ts to. Or, if cs
d210: 72 45 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20  rEnd is already 
d220: 61 74 20 45 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20  at EOF,.  ** do 
d230: 6e 6f 74 68 69 6e 67 2e 20 20 2a 2f 0a 20 20 61  nothing.  */.  a
d240: 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
d250: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d260: 76 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d  v);.  if( pMWin-
d270: 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44  >eEnd==TK_PRECED
d280: 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49  ING ){.    addrI
d290: 66 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56  fPos1 = sqlite3V
d2a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d2b0: 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30  IfPos, regEnd, 0
d2c0: 20 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43   , 1);.    VdbeC
d2d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
d2e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d2f0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
d300: 63 73 72 45 6e 64 2c 20 73 71 6c 69 74 65 33 56  csrEnd, sqlite3V
d310: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
d320: 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+2);.  VdbeCove
d330: 72 61 67 65 28 76 29 3b 0a 20 20 61 64 64 72 20  rage(v);.  addr 
d340: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d350: 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
d360: 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70  .  windowAggStep
d370: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
d380: 63 73 72 45 6e 64 2c 20 30 2c 20 72 65 67 41 72  csrEnd, 0, regAr
d390: 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 69  g, regSize);.  i
d3a0: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
d3b0: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
d3c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d3d0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
d3e0: 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
d3f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d400: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
d410: 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73  .    addrTop = s
d420: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d430: 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 65 6c 73  tAddr(v);.  }els
d440: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
d450: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d460: 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57  dr);.    if( pMW
d470: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
d480: 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  CEDING ){.      
d490: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d4a0: 65 72 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73  ere(v, addrIfPos
d4b0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  1);.    }.  }.. 
d4c0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
d4d0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
d4e0: 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 31  {.    addrIfPos1
d4f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d500: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
d510: 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31 29  , regEnd, 0 , 1)
d520: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
d530: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ge(v);.  }.  if(
d540: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
d550: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
d560: 20 20 20 20 61 64 64 72 49 66 50 6f 73 32 20 3d      addrIfPos2 =
d570: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d580: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
d590: 72 65 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29  regStart, 0 , 1)
d5a0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
d5b0: 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  ge(v);.  }.  win
d5c0: 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72  dowAggFinal(pPar
d5d0: 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20  se, pMWin, 0);. 
d5e0: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
d5f0: 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69  Row(pParse, pMWi
d600: 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  n, regGosub, add
d610: 72 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69 74  rGosub);.  sqlit
d620: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d630: 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e  OP_Next, pMWin->
d640: 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33  iEphCsr, sqlite3
d650: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d660: 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76  v)+2);.  VdbeCov
d670: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
d680: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d690: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c   OP_Goto, 0, lbl
d6a0: 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 69 66  FlushDone);.  if
d6b0: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
d6c0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
d6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d6e0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
d6f0: 49 66 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a 20 20  IfPos2);.  }..  
d700: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
d710: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20  t==TK_CURRENT . 
d720: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
d730: 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
d740: 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65   .   || pMWin->e
d750: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
d760: 49 4e 47 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e  ING .  ){.    in
d770: 74 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65  t lblSkipInverse
d780: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
d790: 6b 65 4c 61 62 65 6c 28 76 29 3b 3b 0a 20 20 20  keLabel(v);;.   
d7a0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
d7b0: 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
d7c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d7d0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d7e0: 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72  P_IfPos, regStar
d7f0: 74 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73  t, lblSkipInvers
d800: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  e, 1);.      Vdb
d810: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d820: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 57 69    }.    if( pMWi
d830: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
d840: 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20  LLOWING ){.     
d850: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d860: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
d870: 73 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33  srStart, sqlite3
d880: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d890: 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  v)+2);.      Vdb
d8a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d8b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d8c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
d8d0: 2c 20 30 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65  , 0, lblSkipInve
d8e0: 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
d8f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d900: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
d910: 65 78 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73  ext, csrStart, s
d920: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d930: 74 41 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20  tAddr(v)+1);.   
d940: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
d950: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  v);.    }.    wi
d960: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
d970: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 53 74  se, pMWin, csrSt
d980: 61 72 74 2c 20 31 2c 20 72 65 67 41 72 67 2c 20  art, 1, regArg, 
d990: 72 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71  regSize);.    sq
d9a0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
d9b0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 53 6b 69 70  Label(v, lblSkip
d9c0: 49 6e 76 65 72 73 65 29 3b 0a 20 20 7d 0a 20 20  Inverse);.  }.  
d9d0: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
d9e0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
d9f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
da00: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
da10: 49 66 50 6f 73 31 29 3b 0a 20 20 7d 0a 20 20 73  IfPos1);.  }.  s
da20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
da30: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
da40: 61 64 64 72 54 6f 70 29 3b 0a 0a 20 20 2f 2a 20  addrTop);..  /* 
da50: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
da60: 64 6f 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c 69 74  done: */.  sqlit
da70: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
da80: 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 44 6f  el(v, lblFlushDo
da90: 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ne);.  sqlite3Vd
daa0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
dab0: 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69  esetSorter, pMWi
dac0: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73  n->iEphCsr);.  s
dad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
dae0: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
daf0: 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20  egFlushPart);.. 
db00: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
db10: 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c   to skip over fl
db20: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f  ush_partition */
db30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
db40: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
db50: 74 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  to);.}../*.** Th
db60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
db70: 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 71 6c   the work of sql
db80: 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
db90: 65 70 28 29 20 66 6f 72 20 63 61 73 65 73 20 74  ep() for cases t
dba0: 68 61 74 0a 2a 2a 20 77 6f 75 6c 64 20 6e 6f 72  hat.** would nor
dbb0: 6d 61 6c 6c 79 20 62 65 20 68 61 6e 64 6c 65 64  mally be handled
dbc0: 20 62 79 20 77 69 6e 64 6f 77 43 6f 64 65 44 65   by windowCodeDe
dbd0: 66 61 75 6c 74 53 74 65 70 28 29 20 77 68 65 6e  faultStep() when
dbe0: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 6e   there are.** on
dbf0: 65 20 6f 72 20 6d 6f 72 65 20 62 75 69 6c 74 2d  e or more built-
dc00: 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69  in window-functi
dc10: 6f 6e 73 20 74 68 61 74 20 72 65 71 75 69 72 65  ons that require
dc20: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 74   the entire part
dc30: 69 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 63  ition.** to be c
dc40: 61 63 68 65 64 20 69 6e 20 61 20 74 65 6d 70 20  ached in a temp 
dc50: 74 61 62 6c 65 20 62 65 66 6f 72 65 20 61 6e 79  table before any
dc60: 20 72 6f 77 73 20 63 61 6e 20 62 65 20 72 65 74   rows can be ret
dc70: 75 72 6e 65 64 2e 20 41 64 64 69 74 69 6f 6e 61  urned. Additiona
dc80: 6c 6c 79 2e 0a 2a 2a 20 22 52 41 4e 47 45 20 42  lly..** "RANGE B
dc90: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
dca0: 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  OW AND UNBOUNDED
dcb0: 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 69 73 20 61   FOLLOWING" is a
dcc0: 6c 77 61 79 73 20 68 61 6e 64 6c 65 64 20 62 79  lways handled by
dcd0: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
dce0: 6e 2e 0a 2a 2a 0a 2a 2a 20 50 73 65 75 64 6f 2d  n..**.** Pseudo-
dcf0: 63 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  code correspondi
dd00: 6e 67 20 74 6f 20 74 68 65 20 56 4d 20 63 6f 64  ng to the VM cod
dd10: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
dd20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
dd30: 66 6f 72 20 65 61 63 68 20 74 79 70 65 20 6f 66  for each type of
dd40: 20 77 69 6e 64 6f 77 20 66 6f 6c 6c 6f 77 73 2e   window follows.
dd50: 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
dd60: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
dd70: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
dd80: 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20  RENT ROW.**.**  
dd90: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
dda0: 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a  :.**     Once {.
ddb0: 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70  **       OpenDup
ddc0: 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72   (iEphCsr -> csr
ddd0: 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a  Lead).**     }.*
dde0: 2a 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74  *     Integer ct
ddf0: 72 20 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61  r 0.**     forea
de00: 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29  ch row (csrLead)
de10: 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  {.**       if( n
de20: 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20  ew peer ){.**   
de30: 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28        AggFinal (
de40: 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20  xValue).**      
de50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74     for(i=0; i<ct
de60: 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20  r; i++){.**     
de70: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
de80: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20  Gosub.**        
de90: 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a     Next iEphCsr.
dea0: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
deb0: 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
dec0: 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d  ctr 0.**       }
ded0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65  .**       AggSte
dee0: 70 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  p (csrLead).**  
def0: 20 20 20 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a       Incr ctr.**
df00: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20       }.**.**    
df10: 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61   AggFinal (xFina
df20: 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72  lize).**     for
df30: 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b  (i=0; i<ctr; i++
df40: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  ){.**       Gosu
df50: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
df60: 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73       Next iEphCs
df70: 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a  r.**     }.**.**
df80: 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72       ResetSorter
df90: 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65   (csr).**     Re
dfa0: 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20  turn.**.** ROWS 
dfb0: 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
dfc0: 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
dfd0: 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a  CURRENT ROW.**.*
dfe0: 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78  *   As above, ex
dff0: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 22 69  cept that the "i
e000: 66 28 20 6e 65 77 20 70 65 65 72 20 29 22 20 62  f( new peer )" b
e010: 72 61 6e 63 68 20 69 73 20 61 6c 77 61 79 73 20  ranch is always 
e020: 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e  taken..**.** RAN
e030: 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  GE BETWEEN CURRE
e040: 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45  NT ROW AND CURRE
e050: 4e 54 20 52 4f 57 20 0a 2a 2a 0a 2a 2a 20 20 20  NT ROW .**.**   
e060: 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  As above, except
e070: 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68   that each of th
e080: 65 20 66 6f 72 28 29 20 6c 6f 6f 70 73 20 62 65  e for() loops be
e090: 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  comes:.**.**    
e0a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e0b0: 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20  ctr; i++){.**   
e0c0: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64          Gosub ad
e0d0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
e0e0: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20       AggInverse 
e0f0: 28 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20  (iEphCsr).**    
e100: 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68         Next iEph
e110: 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  Csr.**         }
e120: 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
e130: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
e140: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42  RECEDING AND UNB
e150: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
e160: 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70  .**.**   flush_p
e170: 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20  artition:.**    
e180: 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20   Once {.**      
e190: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
e1a0: 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a  r -> csrLead).**
e1b0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f       }.**     fo
e1c0: 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65  reach row (csrLe
e1d0: 61 64 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 41  ad) {.**       A
e1e0: 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29  ggStep (csrLead)
e1f0: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
e200: 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 69 45   foreach row (iE
e210: 70 68 43 73 72 29 20 7b 0a 2a 2a 20 20 20 20 20  phCsr) {.**     
e220: 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
e230: 62 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 0a 2a  b.**     }.** .*
e240: 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
e250: 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
e260: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
e270: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73  ING.**.**   flus
e280: 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20  h_partition:.** 
e290: 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20      Once {.**   
e2a0: 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70      OpenDup (iEp
e2b0: 68 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29  hCsr -> csrLead)
e2c0: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
e2d0: 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73   foreach row (cs
e2e0: 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20  rLead){.**      
e2f0: 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61   AggStep (csrLea
e300: 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  d).**     }.**  
e310: 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 4c 65     Rewind (csrLe
e320: 61 64 29 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67  ad).**     Integ
e330: 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20  er ctr 0.**     
e340: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72  foreach row (csr
e350: 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20  Lead){.**       
e360: 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a  if( new peer ){.
e370: 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69  **         AggFi
e380: 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20  nal (xValue).** 
e390: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e3a0: 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a   i<ctr; i++){.**
e3b0: 20 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62             Gosub
e3c0: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
e3d0: 20 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72          AggInver
e3e0: 73 65 20 28 69 45 70 68 43 73 72 29 0a 2a 2a 20  se (iEphCsr).** 
e3f0: 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20 69            Next i
e400: 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20  EphCsr.**       
e410: 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 49    }.**         I
e420: 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20  nteger ctr 0.** 
e430: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
e440: 20 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20 20   Incr ctr.**    
e450: 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67 67   }.**.**     Agg
e460: 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65  Final (xFinalize
e470: 29 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d 30  ).**     for(i=0
e480: 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a  ; i<ctr; i++){.*
e490: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
e4a0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
e4b0: 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a   Next iEphCsr.**
e4c0: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20       }.**.**    
e4d0: 20 52 65 73 65 74 53 6f 72 74 65 72 20 28 63 73   ResetSorter (cs
e4e0: 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e  r).**     Return
e4f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e500: 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53  windowCodeCacheS
e510: 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tep(.  Parse *pP
e520: 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20  arse, .  Select 
e530: 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  *p,.  WhereInfo 
e540: 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72  *pWInfo,.  int r
e550: 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20  egGosub, .  int 
e560: 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57  addrGosub.){.  W
e570: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
e580: 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a  ->pWin;.  Vdbe *
e590: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
e5a0: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
e5b0: 74 20 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  t k;.  int addr;
e5c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61  .  ExprList *pPa
e5d0: 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
e5e0: 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69  tition;.  ExprLi
e5f0: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
e600: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  MWin->pOrderBy;.
e610: 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 70 4f    int nPeer = pO
e620: 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42  rderBy ? pOrderB
e630: 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20  y->nExpr : 0;.  
e640: 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 3b 0a  int regNewPeer;.
e650: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b  .  int addrGoto;
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
e680: 20 47 6f 74 6f 20 75 73 65 64 20 74 6f 20 6a 75   Goto used to ju
e690: 6d 70 20 66 6c 75 73 68 5f 70 61 72 2e 2e 20 2a  mp flush_par.. *
e6a0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74  /.  int addrNext
e6b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e6c0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
e6d0: 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
e6e0: 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  ion of loop */. 
e6f0: 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72   int regFlushPar
e700: 74 3b 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73  t;.  int lblFlus
e710: 68 50 61 72 74 3b 0a 20 20 69 6e 74 20 63 73 72  hPart;.  int csr
e720: 4c 65 61 64 3b 0a 20 20 69 6e 74 20 72 65 67 43  Lead;.  int regC
e730: 74 72 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67  tr;.  int regArg
e740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e750: 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
e760: 72 20 61 72 72 61 79 20 74 6f 20 6d 61 72 74 69  r array to marti
e770: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 73  al function args
e780: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 69 7a   */.  int regSiz
e790: 65 3b 0a 20 20 69 6e 74 20 6c 62 6c 45 6d 70 74  e;.  int lblEmpt
e7a0: 79 3b 0a 20 20 69 6e 74 20 62 52 65 76 65 72 73  y;.  int bRevers
e7b0: 65 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  e = pMWin->pOrde
e7c0: 72 42 79 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53  rBy && pMWin->eS
e7d0: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
e7e0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70   .          && p
e7f0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
e800: 4e 42 4f 55 4e 44 45 44 3b 0a 0a 20 20 61 73 73  NBOUNDED;..  ass
e810: 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74  ert( (pMWin->eSt
e820: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
e830: 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
e840: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20  ==TK_CURRENT) . 
e850: 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d        || (pMWin-
e860: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
e870: 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e  UNDED && pMWin->
e880: 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
e890: 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  ED) .       || (
e8a0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
e8b0: 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57  K_CURRENT && pMW
e8c0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
e8d0: 52 45 4e 54 29 20 0a 20 20 20 20 20 20 20 7c 7c  RENT) .       ||
e8e0: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
e8f0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70  =TK_CURRENT && p
e900: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
e910: 4e 42 4f 55 4e 44 45 44 29 20 0a 20 20 29 3b 0a  NBOUNDED) .  );.
e920: 0a 20 20 6c 62 6c 45 6d 70 74 79 20 3d 20 73 71  .  lblEmpty = sq
e930: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e940: 65 6c 28 76 29 3b 0a 20 20 72 65 67 4e 65 77 50  el(v);.  regNewP
e950: 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  eer = pParse->nM
e960: 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e  em+1;.  pParse->
e970: 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a  nMem += nPeer;..
e980: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
e990: 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c  gister and label
e9a0: 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f   for the "flush_
e9b0: 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72  partition" sub-r
e9c0: 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67  outine. */.  reg
e9d0: 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50  FlushPart = ++pP
e9e0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62  arse->nMem;.  lb
e9f0: 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c  lFlushPart = sql
ea00: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ea10: 6c 28 76 29 3b 0a 0a 20 20 63 73 72 4c 65 61 64  l(v);..  csrLead
ea20: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
ea30: 2b 3b 0a 20 20 72 65 67 43 74 72 20 3d 20 2b 2b  +;.  regCtr = ++
ea40: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
ea50: 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e   windowPartition
ea60: 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 2c  Cache(pParse, p,
ea70: 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75 73   pWInfo, regFlus
ea80: 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50  hPart, lblFlushP
ea90: 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29 3b 0a  art, &regSize);.
eaa0: 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c    addrGoto = sql
eab0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
eac0: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f  , OP_Goto);..  /
ead0: 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c 75 73  * Start of "flus
eae0: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a  h_partition" */.
eaf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
eb00: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
eb10: 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 73 71  FlushPart);.  sq
eb20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
eb30: 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20 73  v, OP_Once, 0, s
eb40: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
eb50: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56  tAddr(v)+2);.  V
eb60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
eb70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eb80: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
eb90: 70 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d 57 69  p, csrLead, pMWi
eba0: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20  n->iEphCsr);..  
ebb0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
ebc0: 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
ebd0: 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20  gister for each 
ebe0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
ebf0: 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67  to NULL */.  reg
ec00: 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74  Arg = windowInit
ec10: 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d  Accum(pParse, pM
ec20: 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Win);..  sqlite3
ec30: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ec40: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
ec50: 43 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Ctr);.  sqlite3V
ec60: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ec70: 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 2c  Rewind, csrLead,
ec80: 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64   lblEmpty);.  Vd
ec90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
eca0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ecb0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
ecc0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
ecd0: 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64   lblEmpty);.  Vd
ece0: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
ecf0: 61 6b 65 6e 28 76 29 3b 0a 0a 20 20 69 66 28 20  aken(v);..  if( 
ed00: 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20 20 20  bReverse ){.    
ed10: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
ed20: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
ed30: 72 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  r(v);.    window
ed40: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
ed50: 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20  pMWin, csrLead, 
ed60: 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69  0, regArg, regSi
ed70: 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ze);.    sqlite3
ed80: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ed90: 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61 64 2c 20  _Next, csrLead, 
eda0: 61 64 64 72 29 3b 0a 20 20 20 20 56 64 62 65 43  addr);.    VdbeC
edb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
edc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
edd0: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
ede0: 63 73 72 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74  csrLead, lblEmpt
edf0: 79 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  y);.    VdbeCove
ee00: 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
ee10: 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 4e 65 78  );.  }.  addrNex
ee20: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
ee30: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
ee40: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
ee50: 26 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  & (pMWin->eEnd==
ee60: 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 70 4d  TK_CURRENT || pM
ee70: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
ee80: 43 55 52 52 45 4e 54 29 20 29 7b 0a 20 20 20 20  CURRENT) ){.    
ee90: 69 6e 74 20 62 43 75 72 72 65 6e 74 20 3d 20 28  int bCurrent = (
eea0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
eeb0: 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20  K_CURRENT);.    
eec0: 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30  int addrJump = 0
eed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
eee0: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4a   Address of OP_J
eef0: 75 6d 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ump below */.   
ef00: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
ef10: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
ef20: 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
ef30: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
ef40: 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61  l + (pPart ? pPa
ef50: 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
ef60: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 65 65        int regPee
ef70: 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  r = pMWin->regPa
ef80: 72 74 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50  rt + (pPart ? pP
ef90: 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  art->nExpr : 0);
efa0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
efb0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
efc0: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
efd0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
efe0: 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
eff0: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
f000: 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nPeer; k++){.   
f010: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f020: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
f030: 75 6d 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69 4f  umn, csrLead, iO
f040: 66 66 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65 72  ff+k, regNewPeer
f050: 2b 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +k);.      }.   
f060: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
f070: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f080: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
f090: 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20  wPeer, regPeer, 
f0a0: 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71  nPeer);.      sq
f0b0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
f0c0: 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
f0d0: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
f0e0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d  );.      addrJum
f0f0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
f100: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
f110: 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64  , addr+2, 0, add
f120: 72 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  r+2);.      Vdbe
f130: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f150: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
f160: 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67   regNewPeer, reg
f170: 50 65 65 72 2c 20 6e 50 65 65 72 2d 31 29 3b 0a  Peer, nPeer-1);.
f180: 20 20 20 20 7d 0a 0a 20 20 20 20 77 69 6e 64 6f      }..    windo
f190: 77 52 65 74 75 72 6e 52 6f 77 73 28 70 50 61 72  wReturnRows(pPar
f1a0: 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43 74  se, pMWin, regCt
f1b0: 72 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  r, regGosub, add
f1c0: 72 47 6f 73 75 62 2c 20 0a 20 20 20 20 20 20 20  rGosub, .       
f1d0: 20 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65 67   (bCurrent ? reg
f1e0: 41 72 67 20 3a 20 30 29 2c 20 28 62 43 75 72 72  Arg : 0), (bCurr
f1f0: 65 6e 74 20 3f 20 72 65 67 53 69 7a 65 20 3a 20  ent ? regSize : 
f200: 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  0).    );.    if
f210: 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c  ( addrJump ) sql
f220: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
f230: 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20  (v, addrJump);. 
f240: 20 7d 0a 0a 20 20 69 66 28 20 62 52 65 76 65 72   }..  if( bRever
f250: 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e  se==0 ){.    win
f260: 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
f270: 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61  e, pMWin, csrLea
f280: 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65  d, 0, regArg, re
f290: 67 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71  gSize);.  }.  sq
f2a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f2b0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65  v, OP_AddImm, re
f2c0: 67 43 74 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69  gCtr, 1);.  sqli
f2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f2e0: 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61   OP_Next, csrLea
f2f0: 64 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  d, addrNext);.  
f300: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
f310: 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e  ..  windowReturn
f320: 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57  Rows(pParse, pMW
f330: 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67 47  in, regCtr, regG
f340: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 2c  osub, addrGosub,
f350: 20 30 2c 20 30 29 3b 0a 0a 20 20 73 71 6c 69 74   0, 0);..  sqlit
f360: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
f370: 65 6c 28 76 2c 20 6c 62 6c 45 6d 70 74 79 29 3b  el(v, lblEmpty);
f380: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f390: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
f3a0: 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69  Sorter, pMWin->i
f3b0: 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74  EphCsr);.  sqlit
f3c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f3d0: 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c  OP_Return, regFl
f3e0: 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a 20  ushPart);..  /* 
f3f0: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f 20  Jump to here to 
f400: 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68 5f  skip over flush_
f410: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73  partition */.  s
f420: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
f430: 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b  re(v, addrGoto);
f440: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47 45  .}.../*.** RANGE
f450: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
f460: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
f470: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a   CURRENT ROW.**.
f480: 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20  **   ....**     
f490: 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
f4a0: 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  n ){.**       Ag
f4b0: 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a  gFinal (xFinaliz
f4c0: 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  e).**       Gosu
f4d0: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
f4e0: 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72       ResetSorter
f4f0: 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20 20   eph-table.**   
f500: 20 20 7d 0a 2a 2a 20 20 20 20 20 65 6c 73 65 20    }.**     else 
f510: 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a  if( new peer ){.
f520: 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61  **       AggFina
f530: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
f540: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
f550: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65 73  sub.**       Res
f560: 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61 62  etSorter eph-tab
f570: 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  le.**     }.**  
f580: 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20 20     AggStep.**   
f590: 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64    Insert (record
f5a0: 20 69 6e 74 6f 20 65 70 68 2d 74 61 62 6c 65 29   into eph-table)
f5b0: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 68 65  .**   sqlite3Whe
f5c0: 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 41 67 67  reEnd().**   Agg
f5d0: 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65  Final (xFinalize
f5e0: 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20 61 64 64  ).**   Gosub add
f5f0: 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52 41 4e  rGosub.**.** RAN
f600: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
f610: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
f620: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
f630: 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41  LOWING.**.**   A
f640: 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
f650: 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e 20 66  take no action f
f660: 6f 72 20 61 20 22 6e 65 77 20 70 65 65 72 22 2e  or a "new peer".
f670: 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74 68 65   Invoke.**   the
f680: 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f 6e 63   sub-routine onc
f690: 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63 68 20  e only for each 
f6a0: 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  partition..**.**
f6b0: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
f6c0: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43  URRENT ROW AND C
f6d0: 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a  URRENT ROW.**.**
f6e0: 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
f6f0: 65 70 74 20 74 68 61 74 20 74 68 65 20 22 6e 65  ept that the "ne
f700: 77 20 70 65 65 72 22 20 63 6f 6e 64 69 74 69 6f  w peer" conditio
f710: 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  n is handled in 
f720: 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20 77 61  the.**   same wa
f730: 79 20 61 73 20 22 6e 65 77 20 70 61 72 74 69 74  y as "new partit
f740: 69 6f 6e 22 20 28 73 6f 20 74 68 65 72 65 20 69  ion" (so there i
f750: 73 20 6e 6f 20 22 65 6c 73 65 20 69 66 22 20 62  s no "else if" b
f760: 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57  lock)..**.** ROW
f770: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
f780: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
f790: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
f7a0: 20 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c   .**   As above,
f7b0: 20 65 78 63 65 70 74 20 61 73 73 75 6d 65 20 65   except assume e
f7c0: 76 65 72 79 20 72 6f 77 20 69 73 20 61 20 22 6e  very row is a "n
f7d0: 65 77 20 70 65 65 72 22 2e 0a 2a 2f 0a 73 74 61  ew peer"..*/.sta
f7e0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
f7f0: 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 0a  odeDefaultStep(.
f800: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f810: 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20   .  Select *p,. 
f820: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
f830: 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73  fo,.  int regGos
f840: 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47  ub, .  int addrG
f850: 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  osub.){.  Window
f860: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
f870: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  n;.  Vdbe *v = s
f880: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
f890: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a  arse);.  int k;.
f8a0: 20 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20    int iSubCsr = 
f8b0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  p->pSrc->a[0].iC
f8c0: 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75  ursor;.  int nSu
f8d0: 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
f8e0: 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  ].pTab->nCol;.  
f8f0: 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73 65  int reg = pParse
f900: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20  ->nMem+1;.  int 
f910: 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b  regRecord = reg+
f920: 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52  nSub;.  int regR
f930: 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64  owid = regRecord
f940: 2b 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  +1;.  int addr;.
f950: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
f960: 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
f970: 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73  ition;.  ExprLis
f980: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d  t *pOrderBy = pM
f990: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  Win->pOrderBy;..
f9a0: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
f9b0: 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45  >eType==TK_RANGE
f9c0: 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69   .      || (pMWi
f9d0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
f9e0: 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
f9f0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
fa00: 4e 54 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  NT).  );..  asse
fa10: 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61  rt( (pMWin->eSta
fa20: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
fa30: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
fa40: 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 20  =TK_CURRENT).   
fa50: 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
fa60: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
fa70: 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
fa80: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
fa90: 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57  ).       || (pMW
faa0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43  in->eStart==TK_C
fab0: 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d  URRENT && pMWin-
fac0: 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e  >eEnd==TK_CURREN
fad0: 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  T).       || (pM
fae0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
faf0: 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
fb00: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
fb10: 4e 44 45 44 20 26 26 20 21 70 4f 72 64 65 72 42  NDED && !pOrderB
fb20: 79 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  y).  );..  if( p
fb30: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
fb40: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
fb50: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
fb60: 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  }..  pParse->nMe
fb70: 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a  m += nSub + 2;..
fb80: 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65    /* Martial the
fb90: 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79   row returned by
fba0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
fbb0: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
fbc0: 20 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73   .  ** registers
fbd0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  . */.  for(k=0; 
fbe0: 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20  k<nSub; k++){.  
fbf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fc00: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
fc10: 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65  , iSubCsr, k, re
fc20: 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  g+k);.  }..  /* 
fc30: 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
fc40: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
fc50: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 6f 72  new partition or
fc60: 20 70 65 65 72 20 67 72 6f 75 70 2e 20 2a 2f 0a   peer group. */.
fc70: 20 20 69 66 28 20 70 50 61 72 74 20 7c 7c 20 70    if( pPart || p
fc80: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
fc90: 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 50 61 72  nt nPart = (pPar
fca0: 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72  t ? pPart->nExpr
fcb0: 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 61   : 0);.    int a
fcc0: 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 20  ddrGoto = 0;.   
fcd0: 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20   int addrJump = 
fce0: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65 72  0;.    int nPeer
fcf0: 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70   = (pOrderBy ? p
fd00: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a  OrderBy->nExpr :
fd10: 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50   0);..    if( pP
fd20: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  art ){.      int
fd30: 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65   regNewPart = re
fd40: 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  g + pMWin->nBuff
fd50: 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20 4b 65 79  erCol;.      Key
fd60: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
fd70: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
fd80: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
fd90: 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29  se, pPart, 0, 0)
fda0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
fdb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fdc0: 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
fdd0: 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
fde0: 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72 74  n->regPart,nPart
fdf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
fe00: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
fe10: 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
fe20: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
fe30: 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73      addrJump = s
fe40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fe50: 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
fe60: 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b  r+2, 0, addr+2);
fe70: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
fe80: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 77 69  age(v);.      wi
fe90: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
fea0: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a  rse, pMWin, 1);.
feb0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
fec0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  By ){.        ad
fed0: 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
fee0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
fef0: 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  _Goto);.      }.
ff00: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
ff10: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
ff20: 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20   int regNewPeer 
ff30: 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e  = reg + pMWin->n
ff40: 42 75 66 66 65 72 43 6f 6c 20 2b 20 6e 50 61 72  BufferCol + nPar
ff50: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  t;.      int reg
ff60: 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65  Peer = pMWin->re
ff70: 67 50 61 72 74 20 2b 20 6e 50 61 72 74 3b 0a 0a  gPart + nPart;..
ff80: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4a 75        if( addrJu
ff90: 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  mp ) sqlite3Vdbe
ffa0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
ffb0: 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28  Jump);.      if(
ffc0: 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   pMWin->eType==T
ffd0: 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
ffe0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
fff0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
10000 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
10010 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
10020 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  By, 0, 0);.     
10030 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10040 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10050 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
10060 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20  wPeer, regPeer, 
10070 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 20 20  nPeer);.        
10080 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
10090 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
100a0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
100b0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  FO);.        add
100c0 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  rJump = sqlite3V
100d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
100e0 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c  Jump, addr+2, 0,
100f0 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
10100 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
10110 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10120 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70          addrJump
10130 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
10140 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e      windowAggFin
10150 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  al(pParse, pMWin
10160 2c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  , pMWin->eStart=
10170 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20  =TK_CURRENT);.  
10180 20 20 20 20 69 66 28 20 61 64 64 72 47 6f 74 6f      if( addrGoto
10190 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
101a0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
101b0 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  to);.    }..    
101c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
101d0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
101e0 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73  pMWin->iEphCsr,s
101f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
10200 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
10210 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10220 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
10240 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  sub, regGosub, a
10250 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 73  ddrGosub);.    s
10260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10270 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57  (v, OP_Next, pMW
10280 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c  in->iEphCsr, sql
10290 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
102a0 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 20 20 56  ddr(v)-1);.    V
102b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
102c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
102d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
102e0 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d  etSorter, pMWin-
102f0 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 73  >iEphCsr);.    s
10300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10310 28 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f  (.        v, OP_
10320 43 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e 2d  Copy, reg+pMWin-
10330 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d 57  >nBufferCol, pMW
10340 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61  in->regPart, nPa
10350 72 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20 29  rt+nPeer-1.    )
10360 3b 0a 0a 20 20 20 20 69 66 28 20 61 64 64 72 4a  ;..    if( addrJ
10370 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62  ump ) sqlite3Vdb
10380 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10390 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rJump);.  }..  /
103a0 2a 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66 75  * Invoke step fu
103b0 6e 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64 6f  nction for windo
103c0 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  w functions */. 
103d0 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
103e0 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 2d 31  Parse, pMWin, -1
103f0 2c 20 30 2c 20 72 65 67 2c 20 30 29 3b 0a 0a 20  , 0, reg, 0);.. 
10400 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63   /* Buffer the c
10410 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68  urrent row in th
10420 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
10430 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  e. */.  if( pMWi
10440 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30 20  n->nBufferCol>0 
10450 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
10460 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
10470 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20  akeRecord, reg, 
10480 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
10490 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
104a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
104b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
104c0 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65 67   OP_Blob, 0, reg
104d0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c  Record);.    sql
104e0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
104f0 28 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20 30  (v, (void*)"", 0
10500 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
10510 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10520 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e  _NewRowid, pMWin
10530 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f  ->iEphCsr, regRo
10540 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
10550 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10560 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69  Insert, pMWin->i
10570 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72  EphCsr, regRecor
10580 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  d, regRowid);.. 
10590 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
105a0 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 20  base scan loop. 
105b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
105c0 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
105d0 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
105e0 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31  pParse, pMWin, 1
105f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10600 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
10610 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ind, pMWin->iEph
10620 43 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43  Csr,sqlite3VdbeC
10630 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
10640 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
10650 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
10660 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
10670 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20  osub, regGosub, 
10680 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71  addrGosub);.  sq
10690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
106a0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69  v, OP_Next, pMWi
106b0 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69  n->iEphCsr, sqli
106c0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
106d0 64 72 28 76 29 2d 31 29 3b 0a 20 20 56 64 62 65  dr(v)-1);.  Vdbe
106e0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 7d 0a 0a  Coverage(v);.}..
106f0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
10700 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c  nd return a dupl
10710 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e  icate of the Win
10720 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63  dow object indic
10730 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74  ated by the.** t
10740 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53  hird argument. S
10750 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f  et the Window.pO
10760 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68  wner field of th
10770 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a  e new object to.
10780 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69  ** pOwner..*/.Wi
10790 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e  ndow *sqlite3Win
107a0 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a  dowDup(sqlite3 *
107b0 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72  db, Expr *pOwner
107c0 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20  , Window *p){.  
107d0 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30  Window *pNew = 0
107e0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
107f0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
10800 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
10810 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b  sizeof(Window));
10820 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
10830 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  .      pNew->zNa
10840 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
10850 72 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d  rDup(db, p->zNam
10860 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  e);.      pNew->
10870 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65  pFilter = sqlite
10880 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
10890 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20  pFilter, 0);.   
108a0 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 74 69 74     pNew->pPartit
108b0 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ion = sqlite3Exp
108c0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
108d0 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
108e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64        pNew->pOrd
108f0 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
10900 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
10910 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  >pOrderBy, 0);. 
10920 20 20 20 20 20 70 4e 65 77 2d 3e 65 54 79 70 65       pNew->eType
10930 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20   = p->eType;.   
10940 20 20 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20     pNew->eEnd = 
10950 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70  p->eEnd;.      p
10960 4e 65 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d  New->eStart = p-
10970 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70  >eStart;.      p
10980 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71  New->pStart = sq
10990 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
109a0 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a   p->pStart, 0);.
109b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64        pNew->pEnd
109c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
109d0 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30  p(db, p->pEnd, 0
109e0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
109f0 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a  Owner = pOwner;.
10a00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10a10 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
10a20 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20  * Return a copy 
10a30 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  of the linked li
10a40 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a  st of Window obj
10a50 65 63 74 73 20 70 61 73 73 65 64 20 61 73 20 74  ects passed as t
10a60 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67  he.** second arg
10a70 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77  ument..*/.Window
10a80 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c   *sqlite3WindowL
10a90 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
10aa0 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
10ab0 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
10ac0 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d    Window *pRet =
10ad0 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70   0;.  Window **p
10ae0 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f  p = &pRet;..  fo
10af0 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20  r(pWin=p; pWin; 
10b00 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
10b10 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20  Win){.    *pp = 
10b20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70  sqlite3WindowDup
10b30 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20  (db, 0, pWin);. 
10b40 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20     if( *pp==0 ) 
10b50 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20  break;.    pp = 
10b60 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69  &((*pp)->pNextWi
10b70 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
10b80 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
10b90 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
10ba0 69 6e 28 29 20 68 61 73 20 61 6c 72 65 61 64 79  in() has already
10bb0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72   been called for
10bc0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
10bd0 65 6d 65 6e 74 20 0a 2a 2a 20 70 61 73 73 65 64  ement .** passed
10be0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
10bf0 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 69  rgument when thi
10c00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
10c10 76 6f 6b 65 64 2e 20 49 74 20 67 65 6e 65 72 61  voked. It genera
10c20 74 65 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 70  tes.** code to p
10c30 6f 70 75 6c 61 74 65 20 74 68 65 20 57 69 6e 64  opulate the Wind
10c40 6f 77 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67  ow.regResult reg
10c50 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
10c60 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61  indow function a
10c70 6e 64 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  nd.** invoke the
10c80 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20   sub-routine at 
10c90 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
10ca0 47 6f 73 75 62 20 6f 6e 63 65 20 66 6f 72 20 65  Gosub once for e
10cb0 61 63 68 20 72 6f 77 2e 0a 2a 2a 20 54 68 69 73  ach row..** This
10cc0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
10cd0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
10ce0 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
10cf0 6e 67 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ng. .*/.void sql
10d00 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
10d10 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
10d20 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
10d30 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
10d40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
10d50 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
10d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d70 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20  ewritten SELECT 
10d80 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57  statement */.  W
10d90 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
10da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10db0 2a 20 43 6f 6e 74 65 78 74 20 72 65 74 75 72 6e  * Context return
10dc0 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
10dd0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  reBegin() */.  i
10de0 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20  nt regGosub,    
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e00 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 4f  * Register for O
10e10 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74  P_Gosub */.  int
10e20 20 61 64 64 72 47 6f 73 75 62 20 20 20 20 20 20   addrGosub      
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e40 4f 50 5f 47 6f 73 75 62 20 68 65 72 65 20 74 6f  OP_Gosub here to
10e50 20 72 65 74 75 72 6e 20 65 61 63 68 20 72 6f 77   return each row
10e60 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20   */.){.  Window 
10e70 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
10e80 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 61 72  ;..  /* There ar
10e90 65 20 74 68 72 65 65 20 64 69 66 66 65 72 65 6e  e three differen
10ea0 74 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  t functions that
10eb0 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
10ec0 64 6f 20 74 68 65 20 77 6f 72 6b 0a 20 20 2a 2a  do the work.  **
10ed0 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 64 65   of this one, de
10ee0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 77  pending on the w
10ef0 69 6e 64 6f 77 20 66 72 61 6d 65 20 61 6e 64 20  indow frame and 
10f00 74 68 65 20 73 70 65 63 69 66 69 63 20 62 75 69  the specific bui
10f10 6c 74 2d 69 6e 0a 20 20 2a 2a 20 77 69 6e 64 6f  lt-in.  ** windo
10f20 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  w functions used
10f30 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 2a 2a 0a   (if any)..  **.
10f40 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65 52    ** windowCodeR
10f50 6f 77 45 78 70 72 53 74 65 70 28 29 20 68 61 6e  owExprStep() han
10f60 64 6c 65 73 20 61 6c 6c 20 22 52 4f 57 53 22 20  dles all "ROWS" 
10f70 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20 65  window frames, e
10f80 78 63 65 70 74 20 66 6f 72 3a 0a 20 20 2a 2a 0a  xcept for:.  **.
10f90 20 20 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57    **   ROWS BETW
10fa0 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
10fb0 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
10fc0 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a  ENT ROW.  **.  *
10fd0 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  * The exception 
10fe0 69 73 20 62 65 63 61 75 73 65 20 77 69 6e 64 6f  is because windo
10ff0 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70  wCodeRowExprStep
11000 28 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6c  () implements al
11010 6c 20 77 69 6e 64 6f 77 0a 20 20 2a 2a 20 66 72  l window.  ** fr
11020 61 6d 65 20 74 79 70 65 73 20 62 79 20 63 61 63  ame types by cac
11030 68 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20  hing the entire 
11040 70 61 72 74 69 74 69 6f 6e 20 69 6e 20 61 20 74  partition in a t
11050 65 6d 70 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20  emp table, and. 
11060 20 2a 2a 20 22 52 4f 57 53 20 42 45 54 57 45 45   ** "ROWS BETWEE
11070 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
11080 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
11090 54 20 52 4f 57 22 20 69 73 20 65 61 73 79 20 65  T ROW" is easy e
110a0 6e 6f 75 67 68 20 74 6f 0a 20 20 2a 2a 20 69 6d  nough to.  ** im
110b0 70 6c 65 6d 65 6e 74 20 77 69 74 68 6f 75 74 20  plement without 
110c0 73 75 63 68 20 61 20 63 61 63 68 65 2e 0a 20 20  such a cache..  
110d0 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f  **.  ** windowCo
110e0 64 65 43 61 63 68 65 53 74 65 70 28 29 20 69 73  deCacheStep() is
110f0 20 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a   used for:.  **.
11100 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54    **   RANGE BET
11110 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
11120 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
11130 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20  OLLOWING.  **.  
11140 2a 2a 20 49 74 20 69 73 20 61 6c 73 6f 20 75 73  ** It is also us
11150 65 64 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 20  ed for anything 
11160 6e 6f 74 20 68 61 6e 64 6c 65 64 20 62 79 20 77  not handled by w
11170 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72  indowCodeRowExpr
11180 53 74 65 70 28 29 20 0a 20 20 2a 2a 20 74 68 61  Step() .  ** tha
11190 74 20 69 6e 76 6f 6b 65 73 20 61 20 62 75 69 6c  t invokes a buil
111a0 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
111b0 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72  tion that requir
111c0 65 73 20 74 68 65 20 65 6e 74 69 72 65 20 0a 20  es the entire . 
111d0 20 2a 2a 20 70 61 72 74 69 74 69 6f 6e 20 74 6f   ** partition to
111e0 20 62 65 20 63 61 63 68 65 64 20 69 6e 20 61 20   be cached in a 
111f0 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72  temp table befor
11200 65 20 61 6e 79 20 72 6f 77 73 20 61 72 65 20 72  e any rows are r
11210 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 28 65 2e  eturned.  ** (e.
11220 67 2e 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 6f  g. nth_value() o
11230 72 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28 29  r percent_rank()
11240 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 6e  )..  **.  ** Fin
11250 61 6c 6c 79 2c 20 61 73 73 75 6d 69 6e 67 20 74  ally, assuming t
11260 68 65 72 65 20 69 73 20 6e 6f 20 62 75 69 6c 74  here is no built
11270 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
11280 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65  ion that require
11290 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 74 69  s.  ** the parti
112a0 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 63 68 65  tion to be cache
112b0 64 2c 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  d, windowCodeDef
112c0 61 75 6c 74 53 74 65 70 28 29 20 69 73 20 75 73  aultStep() is us
112d0 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a  ed for:.  **.  *
112e0 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45  *   RANGE BETWEE
112f0 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
11300 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
11310 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52 41  T ROW .  **   RA
11320 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
11330 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
11340 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
11350 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 52  LLOWING.  **   R
11360 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52  ANGE BETWEEN CUR
11370 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52  RENT ROW AND CUR
11380 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20  RENT ROW .  **  
11390 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
113a0 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
113b0 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
113c0 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64  W.  **.  ** wind
113d0 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
113e0 70 28 29 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  p() is the only 
113f0 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 65  one of the three
11400 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a   functions that.
11410 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 61    ** does not ca
11420 63 68 65 20 65 61 63 68 20 70 61 72 74 69 74 69  che each partiti
11430 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62  on in a temp tab
11440 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e  le before beginn
11450 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 72 65 74 75  ing to.  ** retu
11460 72 6e 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  rn rows..  */.  
11470 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  if( pMWin->eType
11480 3d 3d 54 4b 5f 52 4f 57 53 20 0a 20 20 20 26 26  ==TK_ROWS .   &&
11490 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21   (pMWin->eStart!
114a0 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c 7c 70  =TK_UNBOUNDED||p
114b0 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43  MWin->eEnd!=TK_C
114c0 55 52 52 45 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e  URRENT||!pMWin->
114d0 70 4f 72 64 65 72 42 79 29 0a 20 20 29 7b 0a 20  pOrderBy).  ){. 
114e0 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77     windowCodeRow
114f0 45 78 70 72 53 74 65 70 28 70 50 61 72 73 65 2c  ExprStep(pParse,
11500 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47   p, pWInfo, regG
11510 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
11520 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 57  ;.  }else{.    W
11530 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20  indow *pWin;.   
11540 20 69 6e 74 20 62 43 61 63 68 65 20 3d 20 30 3b   int bCache = 0;
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11560 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 43 61  * True to use Ca
11570 63 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a 20 20  cheStep() */..  
11580 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
11590 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
115a0 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
115b0 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a  TK_UNBOUNDED ){.
115c0 20 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31        bCache = 1
115d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
115e0 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69     for(pWin=pMWi
115f0 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
11600 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
11610 20 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a         FuncDef *
11620 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46  pFunc = pWin->pF
11630 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28  unc;.        if(
11640 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61   (pFunc->funcFla
11650 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
11660 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a 20 20  _WINDOW_SIZE).  
11670 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63         || (pFunc
11680 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f 76 61  ->xSFunc==nth_va
11690 6c 75 65 53 74 65 70 46 75 6e 63 29 0a 20 20 20  lueStepFunc).   
116a0 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d        || (pFunc-
116b0 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76  >xSFunc==first_v
116c0 61 6c 75 65 53 74 65 70 46 75 6e 63 29 0a 20 20  alueStepFunc).  
116d0 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63         || (pFunc
116e0 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74  ->xSFunc==leadSt
116f0 65 70 46 75 6e 63 29 0a 20 20 20 20 20 20 20 20  epFunc).        
11700 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 78 53 46 75   || (pFunc->xSFu
11710 6e 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e 63 29  nc==lagStepFunc)
11720 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
11730 20 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31        bCache = 1
11740 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
11750 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11760 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11770 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 63 61  /* Otherwise, ca
11780 6c 6c 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  ll windowCodeDef
11790 61 75 6c 74 53 74 65 70 28 29 2e 20 20 2a 2f 0a  aultStep().  */.
117a0 20 20 20 20 69 66 28 20 62 43 61 63 68 65 20 29      if( bCache )
117b0 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f  {.      windowCo
117c0 64 65 43 61 63 68 65 53 74 65 70 28 70 50 61 72  deCacheStep(pPar
117d0 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72  se, p, pWInfo, r
117e0 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
117f0 75 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ub);.    }else{.
11800 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65        windowCode
11810 44 65 66 61 75 6c 74 53 74 65 70 28 70 50 61 72  DefaultStep(pPar
11820 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72  se, p, pWInfo, r
11830 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
11840 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ub);.    }.  }.}
11850 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
11860 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
11870 4e 43 20 2a 2f 0a                                NC */.