/ Hex Artifact Content
Login

Artifact a3f2de2ff893e0f972d0fbc5addc5a5ab97ab900946001ce652aaded9e15eb65:


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 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  rValueFunc(sqlit
1700: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
1710: 29 7b 0a 20 20 69 36 34 20 2a 70 20 3d 20 28 69  ){.  i64 *p = (i
1720: 36 34 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  64*)sqlite3_aggr
1730: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1740: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1750: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
1760: 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 28 70  t_int64(pCtx, (p
1770: 20 3f 20 2a 70 20 3a 20 30 29 29 3b 0a 7d 0a 0a   ? *p : 0));.}..
1780: 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62  /*.** Context ob
1790: 6a 65 63 74 20 74 79 70 65 20 75 73 65 64 20 62  ject type used b
17a0: 79 20 72 61 6e 6b 28 29 2c 20 64 65 6e 73 65 5f  y rank(), dense_
17b0: 72 61 6e 6b 28 29 2c 20 70 65 72 63 65 6e 74 5f  rank(), percent_
17c0: 72 61 6e 6b 28 29 20 61 6e 64 0a 2a 2a 20 63 75  rank() and.** cu
17d0: 6d 65 5f 64 69 73 74 28 29 2e 0a 2a 2f 0a 73 74  me_dist()..*/.st
17e0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 7b  ruct CallCount {
17f0: 0a 20 20 69 36 34 20 6e 56 61 6c 75 65 3b 0a 20  .  i64 nValue;. 
1800: 20 69 36 34 20 6e 53 74 65 70 3b 0a 20 20 69 36   i64 nStep;.  i6
1810: 34 20 6e 54 6f 74 61 6c 3b 0a 7d 3b 0a 0a 2f 2a  4 nTotal;.};../*
1820: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
1830: 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77  on of built-in w
1840: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 64  indow function d
1850: 65 6e 73 65 5f 72 61 6e 6b 28 29 2e 20 41 73 73  ense_rank(). Ass
1860: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  umes that.** the
1870: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
1880: 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a  s been set to:.*
1890: 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54  *.**   RANGE BET
18a0: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
18b0: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
18c0: 52 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61  RENT ROW .*/.sta
18d0: 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65 5f 72  tic void dense_r
18e0: 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20 20 73  ankStepFunc(.  s
18f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1900: 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
1910: 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
1920: 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20  ue **apArg.){.  
1930: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
1940: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
1950: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71  ct CallCount*)sq
1960: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
1970: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
1980: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
1990: 20 70 20 29 20 70 2d 3e 6e 53 74 65 70 20 3d 20   p ) p->nStep = 
19a0: 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  1;.}.static void
19b0: 20 64 65 6e 73 65 5f 72 61 6e 6b 56 61 6c 75 65   dense_rankValue
19c0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
19d0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
19e0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
19f0: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
1a00: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
1a10: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1a20: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
1a30: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
1a40: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
1a50: 6e 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20 70  nStep ){.      p
1a60: 2d 3e 6e 56 61 6c 75 65 2b 2b 3b 0a 20 20 20 20  ->nValue++;.    
1a70: 20 20 70 2d 3e 6e 53 74 65 70 20 3d 20 30 3b 0a    p->nStep = 0;.
1a80: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a90: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
1aa0: 43 74 78 2c 20 70 2d 3e 6e 56 61 6c 75 65 29 3b  Ctx, p->nValue);
1ab0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  .  }.}../*.** Im
1ac0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1ad0: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
1ae0: 66 75 6e 63 74 69 6f 6e 20 72 61 6e 6b 28 29 2e  function rank().
1af0: 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a   Assumes that.**
1b00: 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
1b10: 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20 74  e has been set t
1b20: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45  o:.**.**   RANGE
1b30: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
1b40: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
1b50: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2f   CURRENT ROW .*/
1b60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e  .static void ran
1b70: 6b 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c  kStepFunc(.  sql
1b80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1b90: 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
1ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1bb0: 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74   **apArg.){.  st
1bc0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a  ruct CallCount *
1bd0: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
1be0: 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69   CallCount*)sqli
1bf0: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
1c00: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
1c10: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
1c20: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70   ){.    p->nStep
1c30: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ++;.    if( p->n
1c40: 56 61 6c 75 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Value==0 ){.    
1c50: 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20 70 2d    p->nValue = p-
1c60: 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 0a 20 20  >nStep;.    }.  
1c70: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1c80: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
1c90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1ca0: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
1cb0: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1cc0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1cd0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1ce0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1cf0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1d00: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1d10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1d20: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
1d30: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
1d40: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
1d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1d60: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1d70: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1d80: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
1d90: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
1da0: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
1db0: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
1dc0: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41  t to:.**.**   RA
1dd0: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
1de0: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
1df0: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
1e00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e10: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
1e20: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1e30: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1e40: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1e50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1e60: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
1e70: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1e80: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1e90: 29 3b 0a 0a 20 20 70 20 3d 20 28 73 74 72 75 63  );..  p = (struc
1ea0: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
1eb0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
1ec0: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
1ed0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
1ee0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
1ef0: 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  nTotal==0 ){.   
1f00: 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73     p->nTotal = s
1f10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1f20: 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20  64(apArg[0]);.  
1f30: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70    }.    p->nStep
1f40: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ++;.    if( p->n
1f50: 56 61 6c 75 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Value==0 ){.    
1f60: 20 20 70 2d 3e 6e 56 61 6c 75 65 20 3d 20 70 2d    p->nValue = p-
1f70: 3e 6e 53 74 65 70 3b 0a 20 20 20 20 7d 0a 20 20  >nStep;.    }.  
1f80: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1f90: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 56 61 6c 75  percent_rankValu
1fa0: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
1fb0: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
1fc0: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
1fd0: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
1fe0: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71  ct CallCount*)sq
1ff0: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
2000: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
2010: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
2020: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
2030: 3e 6e 54 6f 74 61 6c 3e 31 20 29 7b 0a 20 20 20  >nTotal>1 ){.   
2040: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 28 64     double r = (d
2050: 6f 75 62 6c 65 29 28 70 2d 3e 6e 56 61 6c 75 65  ouble)(p->nValue
2060: 2d 31 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  -1) / (double)(p
2070: 2d 3e 6e 54 6f 74 61 6c 2d 31 29 3b 0a 20 20 20  ->nTotal-1);.   
2080: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2090: 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72  t_double(pCtx, r
20a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
20b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
20c0: 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20  lt_double(pCtx, 
20d0: 30 2e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  0.0);.    }.    
20e0: 70 2d 3e 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20  p->nValue = 0;. 
20f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c   }.}../*.** Impl
2100: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75  ementation of bu
2110: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
2120: 6e 63 74 69 6f 6e 20 63 75 6d 65 5f 64 69 73 74  nction cume_dist
2130: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
2140: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
2150: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
2160: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41  t to:.**.**   RA
2170: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
2180: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
2190: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
21a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21b0: 63 75 6d 65 5f 64 69 73 74 53 74 65 70 46 75 6e  cume_distStepFun
21c0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
21d0: 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
21e0: 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
21f0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67  e3_value **apArg
2200: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c  .){.  struct Cal
2210: 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 61 73 73  lCount *p;.  ass
2220: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
2230: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43  .  p = (struct C
2240: 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65  allCount*)sqlite
2250: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2260: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2270: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
2280: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f  {.    if( p->nTo
2290: 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tal==0 ){.      
22a0: 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69  p->nTotal = sqli
22b0: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
22c0: 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d  apArg[0]);.    }
22d0: 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b  .    p->nStep++;
22e0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
22f0: 69 64 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75  id cume_distValu
2300: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
2310: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
2320: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
2330: 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75   *p;.  p = (stru
2340: 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71  ct CallCount*)sq
2350: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
2360: 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69  context(pCtx, si
2370: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28  zeof(*p));.  if(
2380: 20 70 20 26 26 20 70 2d 3e 6e 54 6f 74 61 6c 20   p && p->nTotal 
2390: 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20  ){.    double r 
23a0: 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53  = (double)(p->nS
23b0: 74 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28  tep) / (double)(
23c0: 70 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20  p->nTotal);.    
23d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
23e0: 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a  ouble(pCtx, r);.
23f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
2400: 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20  text object for 
2410: 6e 74 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66  ntile() window f
2420: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75  unction..*/.stru
2430: 63 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20  ct NtileCtx {.  
2440: 69 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20  i64 nTotal;     
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 2f 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e  /* Total rows in
2470: 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20   partition */.  
2480: 69 36 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20  i64 nParam;     
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 70 61 73  /* Parameter pas
24b0: 73 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20  sed to ntile(N) 
24c0: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20  */.  i64 iRow;  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
24f0: 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  row */.};../*.**
2500: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
2510: 6f 66 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73  of ntile(). This
2520: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
2530: 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68  e window frame h
2540: 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63  as.** been coerc
2550: 65 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  ed to:.**.**   R
2560: 4f 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  OWS UNBOUNDED PR
2570: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
2580: 45 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69  ENT ROW.*/.stati
2590: 63 20 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70  c void ntileStep
25a0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
25b0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
25c0: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
25d0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
25e0: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
25f0: 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61  NtileCtx *p;.  a
2600: 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
2610: 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20  ;.  p = (struct 
2620: 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65  NtileCtx*)sqlite
2630: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2640: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2650: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
2660: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f  {.    if( p->nTo
2670: 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tal==0 ){.      
2680: 70 2d 3e 6e 50 61 72 61 6d 20 3d 20 73 71 6c 69  p->nParam = sqli
2690: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
26a0: 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  apArg[0]);.     
26b0: 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c   p->nTotal = sql
26c0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
26d0: 28 61 70 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20  (apArg[1]);.    
26e0: 20 20 69 66 28 20 70 2d 3e 6e 50 61 72 61 6d 3c    if( p->nParam<
26f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2700: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2710: 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  or(.            
2720: 70 43 74 78 2c 20 22 61 72 67 75 6d 65 6e 74 20  pCtx, "argument 
2730: 6f 66 20 6e 74 69 6c 65 20 6d 75 73 74 20 62 65  of ntile must be
2740: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
2750: 67 65 72 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  ger", -1.       
2760: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
2770: 7d 0a 20 20 20 20 70 2d 3e 69 52 6f 77 2b 2b 3b  }.    p->iRow++;
2780: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
2790: 69 64 20 6e 74 69 6c 65 56 61 6c 75 65 46 75 6e  id ntileValueFun
27a0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
27b0: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
27c0: 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a  ct NtileCtx *p;.
27d0: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4e 74    p = (struct Nt
27e0: 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f  ileCtx*)sqlite3_
27f0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
2800: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
2810: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  p));.  if( p && 
2820: 70 2d 3e 6e 50 61 72 61 6d 3e 30 20 29 7b 0a 20  p->nParam>0 ){. 
2830: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 28     int nSize = (
2840: 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20 70 2d 3e 6e  p->nTotal / p->n
2850: 50 61 72 61 6d 29 3b 0a 20 20 20 20 69 66 28 20  Param);.    if( 
2860: 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
2870: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2880: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
2890: 69 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iRow);.    }else
28a0: 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 4c 61 72  {.      i64 nLar
28b0: 67 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c 20 2d  ge = p->nTotal -
28c0: 20 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69 7a 65   p->nParam*nSize
28d0: 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 6d 61  ;.      i64 iSma
28e0: 6c 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e 53 69  ll = nLarge*(nSi
28f0: 7a 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 36 34  ze+1);.      i64
2900: 20 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f 77 2d   iRow = p->iRow-
2910: 31 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  1;..      assert
2920: 28 20 28 6e 4c 61 72 67 65 2a 28 6e 53 69 7a 65  ( (nLarge*(nSize
2930: 2b 31 29 20 2b 20 28 70 2d 3e 6e 50 61 72 61 6d  +1) + (p->nParam
2940: 2d 6e 4c 61 72 67 65 29 2a 6e 53 69 7a 65 29 3d  -nLarge)*nSize)=
2950: 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29 3b 0a 0a 20  =p->nTotal );.. 
2960: 20 20 20 20 20 69 66 28 20 69 52 6f 77 3c 69 53       if( iRow<iS
2970: 6d 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  mall ){.        
2980: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2990: 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b 20 69  nt64(pCtx, 1 + i
29a0: 52 6f 77 2f 28 6e 53 69 7a 65 2b 31 29 29 3b 0a  Row/(nSize+1));.
29b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
29d0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
29e0: 31 20 2b 20 6e 4c 61 72 67 65 20 2b 20 28 69 52  1 + nLarge + (iR
29f0: 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e 53 69 7a 65  ow-iSmall)/nSize
2a00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
2a20: 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72  ntext object for
2a30: 20 6c 61 73 74 5f 76 61 6c 75 65 28 29 20 77 69   last_value() wi
2a40: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ndow function..*
2a50: 2f 0a 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c  /.struct LastVal
2a60: 75 65 43 74 78 20 7b 0a 20 20 73 71 6c 69 74 65  ueCtx {.  sqlite
2a70: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
2a80: 20 69 6e 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f   int nVal;.};../
2a90: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2aa0: 69 6f 6e 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75  ion of last_valu
2ab0: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
2ac0: 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 53 74  oid last_valueSt
2ad0: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
2ae0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2af0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2b00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2b10: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2b20: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2b30: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
2b40: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
2b50: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2b60: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2b70: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2b80: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
2b90: 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d  e3_value_free(p-
2ba0: 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70  >pVal);.    p->p
2bb0: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
2bc0: 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30 5d  lue_dup(apArg[0]
2bd0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 56  );.    if( p->pV
2be0: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
2bf0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2c00: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
2c10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c20: 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20 20    p->nVal++;.   
2c30: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2c40: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 49  void last_valueI
2c50: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
2c60: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2c70: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2c80: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2c90: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2ca0: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2cb0: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
2cc0: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
2cd0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2ce0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2cf0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2d00: 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a 20  ( ALWAYS(p) ){. 
2d10: 20 20 20 70 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20     p->nVal--;.  
2d20: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30    if( p->nVal==0
2d30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d40: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
2d50: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e  pVal);.      p->
2d60: 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pVal = 0;.    }.
2d70: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2d80: 64 20 6c 61 73 74 5f 76 61 6c 75 65 56 61 6c 75  d last_valueValu
2d90: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
2da0: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
2db0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2dc0: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
2dd0: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
2de0: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
2df0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
2e00: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
2e10: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70  .  if( p && p->p
2e20: 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Val ){.    sqlit
2e30: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
2e40: 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a  pCtx, p->pVal);.
2e50: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
2e60: 64 20 6c 61 73 74 5f 76 61 6c 75 65 46 69 6e 61  d last_valueFina
2e70: 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33  lizeFunc(sqlite3
2e80: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2e90: 0a 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61  .  struct LastVa
2ea0: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
2eb0: 20 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c   (struct LastVal
2ec0: 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61  ueCtx*)sqlite3_a
2ed0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
2ee0: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
2ef0: 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  ));.  if( p && p
2f00: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
2f10: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
2f20: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
2f30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
2f40: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
2f50: 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61 6c 20  l);.    p->pVal 
2f60: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
2f70: 2a 20 53 74 61 74 69 63 20 6e 61 6d 65 73 20 66  * Static names f
2f80: 6f 72 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  or the built-in 
2f90: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
2fa0: 6e 61 6d 65 73 2e 20 20 54 68 65 73 65 20 73 74  names.  These st
2fb0: 61 74 69 63 0a 2a 2a 20 6e 61 6d 65 73 20 61 72  atic.** names ar
2fc0: 65 20 75 73 65 64 2c 20 72 61 74 68 65 72 20 74  e used, rather t
2fd0: 68 61 6e 20 73 74 72 69 6e 67 20 6c 69 74 65 72  han string liter
2fe0: 61 6c 73 2c 20 73 6f 20 74 68 61 74 20 46 75 6e  als, so that Fun
2ff0: 63 44 65 66 20 6f 62 6a 65 63 74 73 0a 2a 2a 20  cDef objects.** 
3000: 63 61 6e 20 62 65 20 61 73 73 6f 63 69 61 74 65  can be associate
3010: 64 20 77 69 74 68 20 61 20 70 61 72 74 69 63 75  d with a particu
3020: 6c 61 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  lar window funct
3030: 69 6f 6e 20 62 79 20 64 69 72 65 63 74 0a 2a 2a  ion by direct.**
3040: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   comparison of t
3050: 68 65 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 65 72  he zName pointer
3060: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
3070: 2a 20 20 20 20 20 20 20 69 66 28 20 70 46 75 6e  *       if( pFun
3080: 63 44 65 66 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77  cDef->zName==row
3090: 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b 20 2e 2e  _valueName ){ ..
30a0: 2e 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  . }.*/.static co
30b0: 6e 73 74 20 63 68 61 72 20 72 6f 77 5f 6e 75 6d  nst char row_num
30c0: 62 65 72 4e 61 6d 65 5b 5d 20 3d 20 20 20 22 72  berName[] =   "r
30d0: 6f 77 5f 6e 75 6d 62 65 72 22 3b 0a 73 74 61 74  ow_number";.stat
30e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 64 65  ic const char de
30f0: 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d  nse_rankName[] =
3100: 20 20 20 22 64 65 6e 73 65 5f 72 61 6e 6b 22 3b     "dense_rank";
3110: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3120: 61 72 20 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20  ar rankName[] = 
3130: 20 20 20 20 20 20 20 20 22 72 61 6e 6b 22 3b 0a          "rank";.
3140: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3150: 72 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61  r percent_rankNa
3160: 6d 65 5b 5d 20 3d 20 22 70 65 72 63 65 6e 74 5f  me[] = "percent_
3170: 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f  rank";.static co
3180: 6e 73 74 20 63 68 61 72 20 63 75 6d 65 5f 64 69  nst char cume_di
3190: 73 74 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 22 63  stName[] =    "c
31a0: 75 6d 65 5f 64 69 73 74 22 3b 0a 73 74 61 74 69  ume_dist";.stati
31b0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 74 69  c const char nti
31c0: 6c 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20  leName[] =      
31d0: 20 20 22 6e 74 69 6c 65 22 3b 0a 73 74 61 74 69    "ntile";.stati
31e0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 61 73  c const char las
31f0: 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  t_valueName[] = 
3200: 20 20 22 6c 61 73 74 5f 76 61 6c 75 65 22 3b 0a    "last_value";.
3210: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3220: 72 20 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 5b  r nth_valueName[
3230: 5d 20 3d 20 20 20 20 22 6e 74 68 5f 76 61 6c 75  ] =    "nth_valu
3240: 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  e";.static const
3250: 20 63 68 61 72 20 66 69 72 73 74 5f 76 61 6c 75   char first_valu
3260: 65 4e 61 6d 65 5b 5d 20 3d 20 20 22 66 69 72 73  eName[] =  "firs
3270: 74 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  t_value";.static
3280: 20 63 6f 6e 73 74 20 63 68 61 72 20 6c 65 61 64   const char lead
3290: 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20 20  Name[] =        
32a0: 20 22 6c 65 61 64 22 3b 0a 73 74 61 74 69 63 20   "lead";.static 
32b0: 63 6f 6e 73 74 20 63 68 61 72 20 6c 61 67 4e 61  const char lagNa
32c0: 6d 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 20  me[] =          
32d0: 22 6c 61 67 22 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  "lag";../*.** No
32e0: 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  -op implementati
32f0: 6f 6e 73 20 6f 66 20 78 53 74 65 70 28 29 20 61  ons of xStep() a
3300: 6e 64 20 78 46 69 6e 61 6c 69 7a 65 28 29 2e 20  nd xFinalize(). 
3310: 20 55 73 65 64 20 61 73 20 70 6c 61 63 65 2d 68   Used as place-h
3320: 6f 6c 64 65 72 73 0a 2a 2a 20 66 6f 72 20 62 75  olders.** for bu
3330: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
3340: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 6e 65 76  nctions that nev
3350: 65 72 20 63 61 6c 6c 20 74 68 6f 73 65 20 69 6e  er call those in
3360: 74 65 72 66 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  terfaces..**.** 
3370: 54 68 65 20 6e 6f 6f 70 56 61 6c 75 65 46 75 6e  The noopValueFun
3380: 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62 75  c() is called bu
3390: 74 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f  t is expected to
33a0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 54 68   do nothing.  Th
33b0: 65 0a 2a 2a 20 6e 6f 6f 70 53 74 65 70 46 75 6e  e.** noopStepFun
33c0: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
33d0: 6c 65 64 2c 20 61 6e 64 20 73 6f 20 69 74 20 69  led, and so it i
33e0: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 4e 4f  s marked with NO
33f0: 5f 54 45 53 54 20 74 6f 0a 2a 2a 20 6c 65 74 20  _TEST to.** let 
3400: 74 68 65 20 74 65 73 74 20 63 6f 76 65 72 61 67  the test coverag
3410: 65 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 20 6e  e routine know n
3420: 6f 74 20 74 6f 20 65 78 70 65 63 74 20 74 68 69  ot to expect thi
3430: 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  s function to be
3440: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a  .** invoked..*/.
3450: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70  static void noop
3460: 53 74 65 70 46 75 6e 63 28 20 20 20 20 2f 2a 4e  StepFunc(    /*N
3470: 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71 6c 69 74  O_TEST*/.  sqlit
3480: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 20  e3_context *p,  
3490: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
34a0: 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34c0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 73 71 6c  *NO_TEST*/.  sql
34d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 20 20  ite3_value **a  
34e0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
34f0: 54 2a 2f 0a 29 7b 20 20 20 20 20 20 20 20 20 20  T*/.){          
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3510: 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 61   /*NO_TEST*/.  a
3520: 73 73 65 72 74 28 30 29 3b 20 20 20 20 20 20 20  ssert(0);       
3530: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
3540: 45 53 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20 20  EST*/.}         
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3560: 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 73     /*NO_TEST*/.s
3570: 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70 56  tatic void noopV
3580: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
3590: 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 20 2f 2a  _context *p){ /*
35a0: 6e 6f 2d 6f 70 2a 2f 3b 20 7d 0a 0a 2f 2a 20 57  no-op*/; }../* W
35b0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
35c0: 74 68 61 74 20 75 73 65 20 61 6c 6c 20 77 69 6e  that use all win
35d0: 64 6f 77 20 69 6e 74 65 72 66 61 63 65 73 3a 20  dow interfaces: 
35e0: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 0a 2a  xStep, xFinal,.*
35f0: 2a 20 78 56 61 6c 75 65 2c 20 61 6e 64 20 78 49  * xValue, and xI
3600: 6e 76 65 72 73 65 20 2a 2f 0a 23 64 65 66 69 6e  nverse */.#defin
3610: 65 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28  e WINDOWFUNCALL(
3620: 6e 61 6d 65 2c 6e 41 72 67 2c 65 78 74 72 61 29  name,nArg,extra)
3630: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 20 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28       \.  nArg, (
3660: 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49  SQLITE_UTF8|SQLI
3670: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65  TE_FUNC_WINDOW|e
3680: 78 74 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20  xtra), 0, 0,    
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20 53 74    \.  name ## St
36b0: 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  epFunc, name ## 
36c0: 46 69 6e 61 6c 69 7a 65 46 75 6e 63 2c 20 6e 61  FinalizeFunc, na
36d0: 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c  me ## ValueFunc,
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
36f0: 0a 20 20 6e 61 6d 65 20 23 23 20 49 6e 76 46 75  .  name ## InvFu
3700: 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d 65  nc, name ## Name
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
3740: 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74  ./* Window funct
3750: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6d  ions that are im
3760: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
3770: 62 79 74 65 63 6f 64 65 20 61 6e 64 20 74 68 75  bytecode and thu
3780: 73 20 68 61 76 65 0a 2a 2a 20 6e 6f 2d 6f 70 20  s have.** no-op 
3790: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65  routines for the
37a0: 69 72 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 64  ir methods */.#d
37b0: 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e 43  efine WINDOWFUNC
37c0: 4e 4f 4f 50 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  NOOP(name,nArg,e
37d0: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41 72           \.  nAr
3800: 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38 7c  g, (SQLITE_UTF8|
3810: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
3820: 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30 2c  OW|extra), 0, 0,
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74        \.  noopSt
3850: 65 70 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c 75  epFunc, noopValu
3860: 65 46 75 6e 63 2c 20 6e 6f 6f 70 56 61 6c 75 65  eFunc, noopValue
3870: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 5c 0a 20 20 6e 6f 6f 70 53 74 65 70 46     \.  noopStepF
38a0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 4e 61 6d  unc, name ## Nam
38b0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20 66  \.}../* Window f
38f0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73  unctions that us
3900: 65 20 61 6c 6c 20 77 69 6e 64 6f 77 20 69 6e 74  e all window int
3910: 65 72 66 61 63 65 73 3a 20 78 53 74 65 70 2c 20  erfaces: xStep, 
3920: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 72 6f 75 74  the.** same rout
3930: 69 6e 65 20 66 6f 72 20 78 46 69 6e 61 6c 69 7a  ine for xFinaliz
3940: 65 20 61 6e 64 20 78 56 61 6c 75 65 20 61 6e 64  e and xValue and
3950: 20 77 68 69 63 68 20 6e 65 76 65 72 20 63 61 6c   which never cal
3960: 6c 0a 2a 2a 20 78 49 6e 76 65 72 73 65 2e 20 2a  l.** xInverse. *
3970: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f 57  /.#define WINDOW
3980: 46 55 4e 43 58 28 6e 61 6d 65 2c 6e 41 72 67 2c  FUNCX(name,nArg,
3990: 65 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20  extra) {        
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
39c0: 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f 55   nArg, (SQLITE_U
39d0: 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  TF8|SQLITE_FUNC_
39e0: 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20 30  WINDOW|extra), 0
39f0: 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  , 0,            
3a00: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
3a10: 6d 65 20 23 23 20 53 74 65 70 46 75 6e 63 2c 20  me ## StepFunc, 
3a20: 6e 61 6d 65 20 23 23 20 56 61 6c 75 65 46 75 6e  name ## ValueFun
3a30: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
3a40: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
3a50: 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70 53         \.  noopS
3a60: 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  tepFunc, name ##
3a70: 20 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   Name           
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20      \.}.../*.** 
3ab0: 52 65 67 69 73 74 65 72 20 74 68 6f 73 65 20 62  Register those b
3ac0: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
3ad0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72  unctions that ar
3ae0: 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67 72 65  e not also aggre
3af0: 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  gates..*/.void s
3b00: 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75 6e 63  qlite3WindowFunc
3b10: 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20 73  tions(void){.  s
3b20: 74 61 74 69 63 20 46 75 6e 63 44 65 66 20 61 57  tatic FuncDef aW
3b30: 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d 20 7b  indowFuncs[] = {
3b40: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58  .    WINDOWFUNCX
3b50: 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30 2c 20  (row_number, 0, 
3b60: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
3b70: 4e 43 58 28 64 65 6e 73 65 5f 72 61 6e 6b 2c 20  NCX(dense_rank, 
3b80: 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f  0, 0),.    WINDO
3b90: 57 46 55 4e 43 58 28 72 61 6e 6b 2c 20 30 2c 20  WFUNCX(rank, 0, 
3ba0: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
3bb0: 4e 43 58 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b  NCX(percent_rank
3bc0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  , 0, SQLITE_FUNC
3bd0: 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20  _WINDOW_SIZE),. 
3be0: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 58 28 63     WINDOWFUNCX(c
3bf0: 75 6d 65 5f 64 69 73 74 2c 20 30 2c 20 53 51 4c  ume_dist, 0, SQL
3c00: 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f  ITE_FUNC_WINDOW_
3c10: 53 49 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f  SIZE),.    WINDO
3c20: 57 46 55 4e 43 58 28 6e 74 69 6c 65 2c 20 31 2c  WFUNCX(ntile, 1,
3c30: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
3c40: 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20 57  DOW_SIZE),.    W
3c50: 49 4e 44 4f 57 46 55 4e 43 41 4c 4c 28 6c 61 73  INDOWFUNCALL(las
3c60: 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a  t_value, 1, 0),.
3c70: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
3c80: 4f 50 28 6e 74 68 5f 76 61 6c 75 65 2c 20 32 2c  OP(nth_value, 2,
3c90: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
3ca0: 55 4e 43 4e 4f 4f 50 28 66 69 72 73 74 5f 76 61  UNCNOOP(first_va
3cb0: 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20  lue, 1, 0),.    
3cc0: 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c  WINDOWFUNCNOOP(l
3cd0: 65 61 64 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20  ead, 1, 0),.    
3ce0: 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c  WINDOWFUNCNOOP(l
3cf0: 65 61 64 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20  ead, 2, 0),.    
3d00: 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c  WINDOWFUNCNOOP(l
3d10: 65 61 64 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20  ead, 3, 0),.    
3d20: 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c  WINDOWFUNCNOOP(l
3d30: 61 67 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57  ag, 1, 0),.    W
3d40: 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61  INDOWFUNCNOOP(la
3d50: 67 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  g, 2, 0),.    WI
3d60: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 6c 61 67  NDOWFUNCNOOP(lag
3d70: 2c 20 33 2c 20 30 29 2c 0a 20 20 7d 3b 0a 20 20  , 3, 0),.  };.  
3d80: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 42 75 69  sqlite3InsertBui
3d90: 6c 74 69 6e 46 75 6e 63 73 28 61 57 69 6e 64 6f  ltinFuncs(aWindo
3da0: 77 46 75 6e 63 73 2c 20 41 72 72 61 79 53 69 7a  wFuncs, ArraySiz
3db0: 65 28 61 57 69 6e 64 6f 77 46 75 6e 63 73 29 29  e(aWindowFuncs))
3dc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3dd0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
3de0: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
3df0: 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67 20 74  fter resolving t
3e00: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
3e10: 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e 64 6f 77  .** for a window
3e20: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 69 6e   function within
3e30: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
3e40: 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c  ent. Argument pL
3e50: 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c 69 6e 6b  ist is a.** link
3e60: 65 64 20 6c 69 73 74 20 6f 66 20 57 49 4e 44 4f  ed list of WINDO
3e70: 57 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 66 6f  W definitions fo
3e80: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45  r the current SE
3e90: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
3ea0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 46 75 6e  ** Argument pFun
3eb0: 63 20 69 73 20 74 68 65 20 66 75 6e 63 74 69 6f  c is the functio
3ec0: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6a 75 73  n definition jus
3ed0: 74 20 72 65 73 6f 6c 76 65 64 20 61 6e 64 20 70  t resolved and p
3ee0: 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65 20 57 69  Win.** is the Wi
3ef0: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72 65 70 72  ndow object repr
3f00: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 61 73 73  esenting the ass
3f10: 6f 63 69 61 74 65 64 20 4f 56 45 52 20 63 6c 61  ociated OVER cla
3f20: 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  use. This.** fun
3f30: 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68  ction updates th
3f40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 57  e contents of pW
3f50: 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  in as follows:.*
3f60: 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
3f70: 4f 56 45 52 20 63 6c 61 75 73 65 20 72 65 66 65  OVER clause refe
3f80: 72 65 64 20 74 6f 20 61 20 6e 61 6d 65 64 20 77  red to a named w
3f90: 69 6e 64 6f 77 20 28 61 73 20 69 6e 20 22 6d 61  indow (as in "ma
3fa0: 78 28 78 29 20 4f 56 45 52 20 77 69 6e 22 29 2c  x(x) OVER win"),
3fb0: 0a 2a 2a 20 20 20 20 20 73 65 61 72 63 68 20 6c  .**     search l
3fc0: 69 73 74 20 70 4c 69 73 74 20 66 6f 72 20 61 20  ist pList for a 
3fd0: 6d 61 74 63 68 69 6e 67 20 57 49 4e 44 4f 57 20  matching WINDOW 
3fe0: 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61 6e 64 20  definition, and 
3ff0: 75 70 64 61 74 65 20 70 57 69 6e 0a 2a 2a 20 20  update pWin.**  
4000: 20 20 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20     accordingly. 
4010: 49 66 20 6e 6f 20 73 75 63 68 20 57 49 4e 44 4f  If no such WINDO
4020: 57 20 63 6c 61 75 73 65 20 63 61 6e 20 62 65 20  W clause can be 
4030: 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20 61 6e 20  found, leave an 
4040: 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20 69 6e 20  error.**     in 
4050: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  pParse..**.**   
4060: 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f  * If the functio
4070: 6e 20 69 73 20 61 20 62 75 69 6c 74 2d 69 6e 20  n is a built-in 
4080: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
4090: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
40a0: 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f 77 20  e.**     window 
40b0: 74 6f 20 62 65 20 63 6f 65 72 63 65 64 20 28 73  to be coerced (s
40c0: 65 65 20 22 42 55 49 4c 54 2d 49 4e 20 57 49 4e  ee "BUILT-IN WIN
40d0: 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53 22 20 61  DOW FUNCTIONS" a
40e0: 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20 20 20 20  t the top.**    
40f0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 29 2c 20   of this file), 
4100: 70 57 69 6e 20 69 73 20 75 70 64 61 74 65 64 20  pWin is updated 
4110: 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  here..*/.void sq
4120: 6c 69 74 65 33 57 69 6e 64 6f 77 55 70 64 61 74  lite3WindowUpdat
4130: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4140: 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se, .  Window *p
4150: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
4160: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4170: 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77 73 20  f named windows 
4180: 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
4190: 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  */.  Window *pWi
41a0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
41b0: 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 66       /* Window f
41c0: 72 61 6d 65 20 74 6f 20 75 70 64 61 74 65 20 2a  rame to update *
41d0: 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75  /.  FuncDef *pFu
41e0: 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
41f0: 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 66 75      /* Window fu
4200: 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
4210: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 57  n */.){.  if( pW
4220: 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20 70 57 69  in->zName && pWi
4230: 6e 2d 3e 65 54 79 70 65 3d 3d 30 20 29 7b 0a 20  n->eType==0 ){. 
4240: 20 20 20 57 69 6e 64 6f 77 20 2a 70 3b 0a 20 20     Window *p;.  
4250: 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
4260: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57 69 6e 29  ; p=p->pNextWin)
4270: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
4280: 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a 4e  te3StrICmp(p->zN
4290: 61 6d 65 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65  ame, pWin->zName
42a0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
42b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 3d 3d 30    }.    if( p==0
42c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
42d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
42e0: 2c 20 22 6e 6f 20 73 75 63 68 20 77 69 6e 64 6f  , "no such windo
42f0: 77 3a 20 25 73 22 2c 20 70 57 69 6e 2d 3e 7a 4e  w: %s", pWin->zN
4300: 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
4310: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  rn;.    }.    pW
4320: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 3d  in->pPartition =
4330: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4340: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
4350: 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30  p->pPartition, 0
4360: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 4f 72  );.    pWin->pOr
4370: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
4380: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
4390: 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
43a0: 42 79 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e  By, 0);.    pWin
43b0: 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
43c0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
43d0: 2d 3e 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c  ->db, p->pStart,
43e0: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70   0);.    pWin->p
43f0: 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70  End = sqlite3Exp
4400: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
4410: 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a 20 20   p->pEnd, 0);.  
4420: 20 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d    pWin->eStart =
4430: 20 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20   p->eStart;.    
4440: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e  pWin->eEnd = p->
4450: 65 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  eEnd;.    pWin->
4460: 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79 70 65  eType = p->eType
4470: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 75 6e  ;.  }.  if( pFun
4480: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
4490: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
44a0: 57 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  W ){.    sqlite3
44b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
44c0: 62 3b 0a 20 20 20 20 69 66 28 20 70 57 69 6e 2d  b;.    if( pWin-
44d0: 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20  >pFilter ){.    
44e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
44f0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
4500: 20 20 20 20 20 22 46 49 4c 54 45 52 20 63 6c 61       "FILTER cla
4510: 75 73 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  use may only be 
4520: 75 73 65 64 20 77 69 74 68 20 61 67 67 72 65 67  used with aggreg
4530: 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ate window funct
4540: 69 6f 6e 73 22 0a 20 20 20 20 20 20 29 3b 0a 20  ions".      );. 
4550: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 69 66 28     }else.    if(
4560: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 72   pFunc->zName==r
4570: 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d 65 20 7c 7c  ow_numberName ||
4580: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e   pFunc->zName==n
4590: 74 69 6c 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20  tileName ){.    
45a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
45b0: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53  ete(db, pWin->pS
45c0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
45d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
45e0: 62 2c 20 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a  b, pWin->pEnd);.
45f0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61        pWin->pSta
4600: 72 74 20 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20  rt = pWin->pEnd 
4610: 3d 20 30 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  = 0;.      pWin-
4620: 3e 65 54 79 70 65 20 3d 20 54 4b 5f 52 4f 57 53  >eType = TK_ROWS
4630: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 53  ;.      pWin->eS
4640: 74 61 72 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e  tart = TK_UNBOUN
4650: 44 45 44 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  DED;.      pWin-
4660: 3e 65 45 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45  >eEnd = TK_CURRE
4670: 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20  NT;.    }else.. 
4680: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e     if( pFunc->zN
4690: 61 6d 65 3d 3d 64 65 6e 73 65 5f 72 61 6e 6b 4e  ame==dense_rankN
46a0: 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e  ame || pFunc->zN
46b0: 61 6d 65 3d 3d 72 61 6e 6b 4e 61 6d 65 0a 20 20  ame==rankName.  
46c0: 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61     || pFunc->zNa
46d0: 6d 65 3d 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b  me==percent_rank
46e0: 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a  Name || pFunc->z
46f0: 4e 61 6d 65 3d 3d 63 75 6d 65 5f 64 69 73 74 4e  Name==cume_distN
4700: 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ame.    ){.     
4710: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4720: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74  te(db, pWin->pSt
4730: 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
4740: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4750: 2c 20 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20  , pWin->pEnd);. 
4760: 20 20 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72       pWin->pStar
4770: 74 20 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d  t = pWin->pEnd =
4780: 20 30 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e   0;.      pWin->
4790: 65 54 79 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45  eType = TK_RANGE
47a0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 53  ;.      pWin->eS
47b0: 74 61 72 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e  tart = TK_UNBOUN
47c0: 44 45 44 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  DED;.      pWin-
47d0: 3e 65 45 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45  >eEnd = TK_CURRE
47e0: 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  NT;.    }.  }.  
47f0: 70 57 69 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46  pWin->pFunc = pF
4800: 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  unc;.}../*.** Co
4810: 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 70 61 73  ntext object pas
4820: 73 65 64 20 74 68 72 6f 75 67 68 20 73 71 6c 69  sed through sqli
4830: 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
4840: 29 20 74 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69  ) to.** selectWi
4850: 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43  ndowRewriteExprC
4860: 62 28 29 20 62 79 20 73 65 6c 65 63 74 57 69 6e  b() by selectWin
4870: 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28  dowRewriteEList(
4880: 29 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  )..*/.typedef st
4890: 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69  ruct WindowRewri
48a0: 74 65 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te WindowRewrite
48b0: 3b 0a 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52  ;.struct WindowR
48c0: 65 77 72 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f  ewrite {.  Windo
48d0: 77 20 2a 70 57 69 6e 3b 0a 20 20 45 78 70 72 4c  w *pWin;.  ExprL
48e0: 69 73 74 20 2a 70 53 75 62 3b 0a 7d 3b 0a 0a 2f  ist *pSub;.};../
48f0: 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75  *.** Callback fu
4900: 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20 73  nction used by s
4910: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
4920: 74 65 45 4c 69 73 74 28 29 2e 20 49 66 20 6e 65  teEList(). If ne
4930: 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74 68 69 73  cessary,.** this
4940: 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
4950: 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  s to the output 
4960: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
4970: 61 6e 64 20 75 70 64 61 74 65 73 20 0a 2a 2a 20  and updates .** 
4980: 65 78 70 72 65 73 73 69 6f 6e 20 28 2a 70 70 45  expression (*ppE
4990: 78 70 72 29 20 69 6e 20 70 6c 61 63 65 2e 0a 2a  xpr) in place..*
49a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
49b0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
49c0: 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70  ExprCb(Walker *p
49d0: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
49e0: 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74 20 57  xpr){.  struct W
49f0: 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a 70 20  indowRewrite *p 
4a00: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65  = pWalker->u.pRe
4a10: 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65 20 2a  write;.  Parse *
4a20: 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
4a30: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 73 77 69  ->pParse;..  swi
4a40: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
4a50: 7b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  {..    case TK_F
4a60: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69  UNCTION:.      i
4a70: 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d 3d  f( pExpr->pWin==
4a80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
4a90: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
4aa0: 0a 20 20 20 20 20 20 20 20 57 69 6e 64 6f 77 20  .        Window 
4ab0: 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 20 20 66  *pWin;.        f
4ac0: 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b  or(pWin=p->pWin;
4ad0: 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
4ae0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
4af0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
4b00: 2d 3e 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a  ->pWin==pWin ){.
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
4b20: 72 74 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  rt( pWin->pOwner
4b30: 3d 3d 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20  ==pExpr );.     
4b40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
4b50: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20  C_Prune;.       
4b60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
4b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
4b80: 46 61 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a  Fall through.  *
4b90: 2f 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  /..    case TK_A
4ba0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
4bb0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
4bc0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
4bd0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
4be0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
4bf0: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
4c00: 20 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69    p->pSub = sqli
4c10: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
4c20: 64 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75  d(pParse, p->pSu
4c30: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
4c40: 69 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20  if( p->pSub ){. 
4c50: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45         assert( E
4c60: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4c70: 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
4c80: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ==0 );.        E
4c90: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
4ca0: 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
4cb0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
4cc0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
4cd0: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
4ce0: 20 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61          ExprClea
4cf0: 72 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  rProperty(pExpr,
4d00: 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20   EP_Static);.   
4d10: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70       memset(pExp
4d20: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  r, 0, sizeof(Exp
4d30: 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45  r));..        pE
4d40: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
4d50: 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78  UMN;.        pEx
4d60: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d  pr->iColumn = p-
4d70: 3e 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a  >pSub->nExpr-1;.
4d80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4d90: 54 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d  Table = p->pWin-
4da0: 3e 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20  >iEphCsr;.      
4db0: 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
4dc0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75      }..    defau
4dd0: 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  lt: /* no-op */.
4de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
4df0: 0a 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ..  return WRC_C
4e00: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69  ontinue;.}.stati
4e10: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4e20: 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43  owRewriteSelectC
4e30: 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  b(Walker *pWalke
4e40: 72 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  r, Select *pSele
4e50: 63 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 57 52  ct){.  return WR
4e60: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  C_Prune;.}.../*.
4e70: 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  ** Iterate throu
4e80: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
4e90: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
4ea0: 2d 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f  -list pEList. Fo
4eb0: 72 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  r each:.**.**   
4ec0: 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20  * TK_COLUMN,.** 
4ed0: 20 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75    * aggregate fu
4ee0: 6e 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20  nction, or.**   
4ef0: 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
4f00: 6e 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20  n with a Window 
4f10: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e  object that is n
4f20: 6f 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74  ot a member of t
4f30: 68 65 20 0a 2a 2a 20 20 20 20 20 6c 69 6e 6b 65  he .**     linke
4f40: 64 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  d list passed as
4f50: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
4f60: 6d 65 6e 74 20 28 70 57 69 6e 29 0a 2a 2a 0a 2a  ment (pWin).**.*
4f70: 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64  * Append the nod
4f80: 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70 72  e to output expr
4f90: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70 70  ession-list (*pp
4fa0: 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61 63  Sub). And replac
4fb0: 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20 54  e it.** with a T
4fc0: 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65  K_COLUMN that re
4fd0: 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68 20  ads the (N-1)th 
4fe0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c 65  element of table
4ff0: 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68 43   .** pWin->iEphC
5000: 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  sr, where N is t
5010: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
5020: 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75 62  ments in (*ppSub
5030: 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65 6e  ) after.** appen
5040: 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65  ding the new one
5050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5060: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
5070: 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72  riteEList(.  Par
5080: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57  se *pParse, .  W
5090: 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 45  indow *pWin,.  E
50a0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
50c0: 2a 20 52 65 77 72 69 74 65 20 65 78 70 72 65 73  * Rewrite expres
50d0: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c 69  sions in this li
50e0: 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  st */.  ExprList
50f0: 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20 20   **ppSub        
5100: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
5110: 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65 78  T: Sub-select ex
5120: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f  pression-list */
5130: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  .){.  Walker sWa
5140: 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65  lker;.  WindowRe
5150: 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b 0a  write sRewrite;.
5160: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
5170: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61  er, 0, sizeof(Wa
5180: 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  lker));.  memset
5190: 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73  (&sRewrite, 0, s
51a0: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72  izeof(WindowRewr
51b0: 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69  ite));..  sRewri
51c0: 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62  te.pSub = *ppSub
51d0: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69  ;.  sRewrite.pWi
51e0: 6e 20 3d 20 70 57 69 6e 3b 0a 0a 20 20 73 57 61  n = pWin;..  sWa
51f0: 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
5200: 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
5210: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
5220: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5230: 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  iteExprCb;.  sWa
5240: 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
5250: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e  back = selectWin
5260: 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74  dowRewriteSelect
5270: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
5280: 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77  pRewrite = &sRew
5290: 72 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73  rite;..  (void)s
52a0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
52b0: 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c  st(&sWalker, pEL
52c0: 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20  ist);..  *ppSub 
52d0: 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b  = sRewrite.pSub;
52e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
52f0: 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
5300: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78  expression in ex
5310: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41  pression-list pA
5320: 70 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72  ppend to.** expr
5330: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
5340: 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  t. Return a poin
5350: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ter to the resul
5360: 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
5370: 63 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72  c ExprList *expr
5380: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a  ListAppendList(.
5390: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
53a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
53b0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
53c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
53d0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
53e0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
53f0: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
5400: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
5410: 74 20 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20  t *pAppend      
5420: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
5430: 65 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  es to append. Mi
5440: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
5450: 7b 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64 20  {.  if( pAppend 
5460: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5470: 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c    int nInit = pL
5480: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
5490: 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  pr : 0;.    for(
54a0: 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e  i=0; i<pAppend->
54b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
54c0: 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20     Expr *pDup = 
54d0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
54e0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65  Parse->db, pAppe
54f0: 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  nd->a[i].pExpr, 
5500: 30 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  0);.      pList 
5510: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5520: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
5530: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
5540: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
5550: 70 4c 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69  pList->a[nInit+i
5560: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41  ].sortOrder = pA
5570: 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74  ppend->a[i].sort
5580: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
5590: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
55a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
55b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
55c0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
55d0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
55e0: 64 6f 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a  does not invoke.
55f0: 2a 2a 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f  ** any SQL windo
5600: 77 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69  w functions, thi
5610: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
5620: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
5630: 2c 20 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65  , it .** rewrite
5640: 73 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  s the SELECT sta
5650: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
5660: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78  indow function x
5670: 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  Step functions.*
5680: 2a 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e  * are invoked in
5690: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
56a0: 65 72 20 61 73 20 64 65 73 63 72 69 62 65 64 20  er as described 
56b0: 75 6e 64 65 72 20 22 53 45 4c 45 43 54 20 52 45  under "SELECT RE
56c0: 57 52 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74  WRITING".** at t
56d0: 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
56e0: 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ile..*/.int sqli
56f0: 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te3WindowRewrite
5700: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5710: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5720: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5730: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  ;.  if( p->pWin 
5740: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
5750: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5760: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
5770: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5780: 65 2d 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63  e->db;.    Selec
5790: 74 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  t *pSub = 0;    
57a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
57b0: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
57c0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
57d0: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70  p->pSrc;.    Exp
57e0: 72 20 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  r *pWhere = p->p
57f0: 57 68 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c  Where;.    ExprL
5800: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20  ist *pGroupBy = 
5810: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
5820: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d   Expr *pHaving =
5830: 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
5840: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74   ExprList *pSort
5850: 20 3d 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c   = 0;..    ExprL
5860: 69 73 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20  ist *pSublist = 
5870: 30 3b 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  0;       /* Expr
5880: 65 73 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  ession list for 
5890: 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20  sub-query */.   
58a0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
58b0: 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f   p->pWin;      /
58c0: 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20  * Master window 
58d0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69  object */.    Wi
58e0: 6e 64 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20  ndow *pWin;     
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
5900: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65  indow object ite
5910: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d  rator */..    p-
5920: 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
5930: 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
5940: 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
5950: 30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  0;.    p->pHavin
5960: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  g = 0;..    /* C
5970: 72 65 61 74 65 20 74 68 65 20 4f 52 44 45 52 20  reate the ORDER 
5980: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
5990: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68  e sub-select. Th
59a0: 69 73 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74  is is the concat
59b0: 65 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f  enation.    ** o
59c0: 66 20 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52  f the window PAR
59d0: 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52  TITION and ORDER
59e0: 20 42 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65   BY clauses. The
59f0: 6e 2c 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73  n, if this makes
5a00: 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e   it.    ** redun
5a10: 64 61 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  dant, remove the
5a20: 20 4f 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74   ORDER BY from t
5a30: 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
5a40: 2e 20 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20  .  */.    pSort 
5a50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5a60: 74 44 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e  tDup(db, pMWin->
5a70: 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
5a80: 20 20 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72      pSort = expr
5a90: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
5aa0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d  Parse, pSort, pM
5ab0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  Win->pOrderBy);.
5ac0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26 26      if( pSort &&
5ad0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
5ae0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5af0: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
5b00: 28 70 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65  (pSort, p->pOrde
5b10: 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
5b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5b30: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
5b40: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
5b50: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
5b60: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
5b70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73      }..    /* As
5b80: 73 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75  sign a cursor nu
5b90: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 65 70 68  mber for the eph
5ba0: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
5bb0: 64 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73  d to buffer rows
5bc0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65  ..    ** The Ope
5bd0: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
5be0: 75 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20  uction is coded 
5bf0: 6c 61 74 65 72 2c 20 61 66 74 65 72 20 69 74 20  later, after it 
5c00: 69 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20  is known how.   
5c10: 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   ** many columns
5c20: 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20   the table will 
5c30: 68 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d  have.  */.    pM
5c40: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70  Win->iEphCsr = p
5c50: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a  Parse->nTab++;..
5c60: 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77      selectWindow
5c70: 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61  RewriteEList(pPa
5c80: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70  rse, pMWin, p->p
5c90: 45 4c 69 73 74 2c 20 26 70 53 75 62 6c 69 73 74  EList, &pSublist
5ca0: 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e  );.    selectWin
5cb0: 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28  dowRewriteEList(
5cc0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70  pParse, pMWin, p
5cd0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53 75  ->pOrderBy, &pSu
5ce0: 62 6c 69 73 74 29 3b 0a 20 20 20 20 70 4d 57 69  blist);.    pMWi
5cf0: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20  n->nBufferCol = 
5d00: 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62  (pSublist ? pSub
5d10: 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  list->nExpr : 0)
5d20: 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  ;..    /* Append
5d30: 20 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20 42   the PARTITION B
5d40: 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65  Y and ORDER BY e
5d50: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 74 68  xpressions to th
5d60: 65 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  e to the .    **
5d70: 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72   sub-select expr
5d80: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65  ession list. The
5d90: 79 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  y are required t
5da0: 6f 20 66 69 67 75 72 65 20 6f 75 74 20 77 68 65  o figure out whe
5db0: 72 65 20 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64  re .    ** bound
5dc0: 61 72 69 65 73 20 66 6f 72 20 70 61 72 74 69 74  aries for partit
5dd0: 69 6f 6e 73 20 61 6e 64 20 73 65 74 73 20 6f 66  ions and sets of
5de0: 20 70 65 65 72 20 72 6f 77 73 20 6c 69 65 2e 20   peer rows lie. 
5df0: 20 2a 2f 0a 20 20 20 20 70 53 75 62 6c 69 73 74   */.    pSublist
5e00: 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e   = exprListAppen
5e10: 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  dList(pParse, pS
5e20: 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70  ublist, pMWin->p
5e30: 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20  Partition);.    
5e40: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
5e50: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
5e60: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
5e70: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29  pMWin->pOrderBy)
5e80: 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  ;..    /* Append
5e90: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70   the arguments p
5ea0: 61 73 73 65 64 20 74 6f 20 65 61 63 68 20 77 69  assed to each wi
5eb0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ndow function to
5ec0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d   the.    ** sub-
5ed0: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
5ee0: 6e 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c  n list. Also all
5ef0: 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73 74  ocate two regist
5f00: 65 72 73 20 66 6f 72 20 65 61 63 68 0a 20 20 20  ers for each.   
5f10: 20 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   ** window funct
5f20: 69 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68  ion - one for th
5f30: 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61  e accumulator, a
5f40: 6e 6f 74 68 65 72 20 66 6f 72 20 69 6e 74 65 72  nother for inter
5f50: 69 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74  im.    ** result
5f60: 73 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  s.  */.    for(p
5f70: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
5f80: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
5f90: 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 70 57 69  tWin){.      pWi
5fa0: 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28 70 53  n->iArgCol = (pS
5fb0: 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73  ublist ? pSublis
5fc0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
5fd0: 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20       pSublist = 
5fe0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
5ff0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
6000: 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  ist, pWin->pOwne
6010: 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
6020: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69     if( pWin->pFi
6030: 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
6040: 45 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d 20  Expr *pFilter = 
6050: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
6060: 62 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  b, pWin->pFilter
6070: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 53  , 0);.        pS
6080: 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ublist = sqlite3
6090: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
60a0: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
60b0: 20 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 20   pFilter);.     
60c0: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72   }.      pWin->r
60d0: 65 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72  egAccum = ++pPar
60e0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
60f0: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20  pWin->regResult 
6100: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
6110: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6120: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6130: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
6140: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a  egAccum);.    }.
6150: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
6160: 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
6170: 6f 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20  or PARTITION BY 
6180: 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20  clause, and the 
6190: 77 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75  window.    ** fu
61a0: 6e 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20 7a  nction accepts z
61b0: 65 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 61  ero arguments, a
61c0: 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
61d0: 6f 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20  other columns.  
61e0: 20 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28 65    ** selected (e
61f0: 2e 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77 5f  .g. "SELECT row_
6200: 6e 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28 29  number() OVER ()
6210: 20 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20 69   FROM t1"), it i
6220: 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a  s possible.    *
6230: 2a 20 74 68 61 74 20 70 53 75 62 6c 69 73 74 20  * that pSublist 
6240: 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65  is still NULL he
6250: 72 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74 61  re. Add a consta
6260: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68 65  nt expression he
6270: 72 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65  re to .    ** ke
6280: 65 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c 65  ep everything le
6290: 67 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65  gal in this case
62a0: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
62b0: 28 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b  ( pSublist==0 ){
62c0: 0a 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20  .      pSublist 
62d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
62e0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
62f0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  0, .          sq
6300: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
6310: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26  b, TK_INTEGER, &
6320: 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73  sqlite3IntTokens
6330: 5b 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29 3b  [0], 0).      );
6340: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75 62  .    }..    pSub
6350: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
6360: 4e 65 77 28 0a 20 20 20 20 20 20 20 20 70 50 61  New(.        pPa
6370: 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70  rse, pSublist, p
6380: 53 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47 72  Src, pWhere, pGr
6390: 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20  oupBy, pHaving, 
63a0: 70 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20 20  pSort, 0, 0.    
63b0: 29 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  );.    p->pSrc =
63c0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
63d0: 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
63e0: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
63f0: 70 2d 3e 70 53 72 63 20 7c 7c 20 64 62 2d 3e 6d  p->pSrc || db->m
6400: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6410: 20 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29     if( p->pSrc )
6420: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 2d  {.      p->pSrc-
6430: 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20  >a[0].pSelect = 
6440: 70 53 75 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  pSub;.      sqli
6450: 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
6460: 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
6470: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20  p->pSrc);.      
6480: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e  if( sqlite3Expan
6490: 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  dSubquery(pParse
64a0: 2c 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  , &p->pSrc->a[0]
64b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
64c0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
64d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
64e0: 20 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c       pSub->selFl
64f0: 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
6500: 65 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  ed;.        p->s
6510: 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41  elFlags &= ~SF_A
6520: 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20  ggregate;.      
6530: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
6540: 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 75 62  rep(pParse, pSub
6550: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 0);.      }.. 
6560: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6570: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
6580: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4d 57 69  nEphemeral, pMWi
6590: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 53 75 62  n->iEphCsr, pSub
65a0: 6c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  list->nExpr);.  
65b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
65c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
65d0: 74 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20  te(db, pSub);.  
65e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
65f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
6600: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6610: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
6620: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  rc;.}../*.** Fre
6630: 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a  e the Window obj
6640: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
6650: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6660: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6670: 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 73  e3WindowDelete(s
6680: 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64  qlite3 *db, Wind
6690: 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  ow *p){.  if( p 
66a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
66b0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
66c0: 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 73 71  pFilter);.    sq
66d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
66e0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74  ete(db, p->pPart
66f0: 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ition);.    sqli
6700: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
6710: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
6720: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
6730: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
6740: 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69  >pEnd);.    sqli
6750: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6760: 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20  , p->pStart);.  
6770: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6780: 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  db, p->zName);. 
6790: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
67a0: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, p);.  }.}..
67b0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 6c  /*.** Free the l
67c0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69  inked list of Wi
67d0: 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 73 74 61  ndow objects sta
67e0: 72 74 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  rting at the sec
67f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
6800: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
6810: 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 73 71  dowListDelete(sq
6820: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f  lite3 *db, Windo
6830: 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  w *p){.  while( 
6840: 70 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20  p ){.    Window 
6850: 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  *pNext = p->pNex
6860: 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  tWin;.    sqlite
6870: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64 62  3WindowDelete(db
6880: 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e  , p);.    p = pN
6890: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
68a0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 65  * The argument e
68b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20  xpression is an 
68c0: 50 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c  PRECEDING or FOL
68d0: 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74 2e 20 20  LOWING offset.  
68e0: 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 68 6f  The.** value sho
68f0: 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67  uld be a non-neg
6900: 61 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20 20  ative integer.  
6910: 49 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  If the value is 
6920: 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73 74 61 6e  not a.** constan
6930: 74 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f 20  t, change it to 
6940: 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61 63 74 20  NULL.  The fact 
6950: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 6e 20  that it is then 
6960: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 0a 2a  a non-negative.*
6970: 2a 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62  * integer will b
6980: 65 20 63 61 75 67 68 74 20 6c 61 74 65 72 2e 20  e caught later. 
6990: 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
69a0: 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c 65 61 76  tant not to leav
69b0: 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 76 61  e.** variable va
69c0: 6c 75 65 73 20 69 6e 20 74 68 65 20 65 78 70 72  lues in the expr
69d0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a  ession tree..*/.
69e0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 71 6c  static Expr *sql
69f0: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
6a00: 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72  Expr(Parse *pPar
6a10: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
6a20: 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  {.  if( 0==sqlit
6a30: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
6a40: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73  (pExpr) ){.    s
6a50: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6a60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
6a70: 70 72 29 3b 0a 20 20 20 20 70 45 78 70 72 20 3d  pr);.    pExpr =
6a80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
6a90: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  c(pParse->db, TK
6aa0: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20 20  _NULL, 0, 0);.  
6ab0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
6ac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
6ad0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
6ae0: 20 6e 65 77 20 57 69 6e 64 6f 77 20 6f 62 6a 65   new Window obje
6af0: 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 61 20  ct describing a 
6b00: 57 69 6e 64 6f 77 20 44 65 66 69 6e 69 74 69 6f  Window Definitio
6b10: 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71  n..*/.Window *sq
6b20: 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63  lite3WindowAlloc
6b30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6b40: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
6b50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
6b60: 74 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  t eType,        
6b70: 2f 2a 20 46 72 61 6d 65 20 74 79 70 65 2e 20 54  /* Frame type. T
6b80: 4b 5f 52 41 4e 47 45 20 6f 72 20 54 4b 5f 52 4f  K_RANGE or TK_RO
6b90: 57 53 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61  WS */.  int eSta
6ba0: 72 74 2c 20 20 20 20 20 20 20 2f 2a 20 53 74 61  rt,       /* Sta
6bb0: 72 74 20 74 79 70 65 3a 20 43 55 52 52 45 4e 54  rt type: CURRENT
6bc0: 2c 20 50 52 45 43 45 44 49 4e 47 2c 20 46 4f 4c  , PRECEDING, FOL
6bd0: 4c 4f 57 49 4e 47 2c 20 55 4e 42 4f 55 4e 44 45  LOWING, UNBOUNDE
6be0: 44 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  D */.  Expr *pSt
6bf0: 61 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72  art,     /* Star
6c00: 74 20 77 69 6e 64 6f 77 20 73 69 7a 65 20 69 66  t window size if
6c10: 20 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 6f 72   TK_PRECEDING or
6c20: 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20   FOLLOWING */.  
6c30: 69 6e 74 20 65 45 6e 64 2c 20 20 20 20 20 20 20  int eEnd,       
6c40: 20 20 2f 2a 20 45 6e 64 20 74 79 70 65 3a 20 43    /* End type: C
6c50: 55 52 52 45 4e 54 2c 20 46 4f 4c 4c 4f 57 49 4e  URRENT, FOLLOWIN
6c60: 47 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c  G, TK_UNBOUNDED,
6c70: 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20   PRECEDING */.  
6c80: 45 78 70 72 20 2a 70 45 6e 64 20 20 20 20 20 20  Expr *pEnd      
6c90: 20 20 2f 2a 20 45 6e 64 20 77 69 6e 64 6f 77 20    /* End window 
6ca0: 73 69 7a 65 20 69 66 20 54 4b 5f 46 4f 4c 4c 4f  size if TK_FOLLO
6cb0: 57 49 4e 47 20 6f 72 20 50 52 45 43 45 44 49 4e  WING or PRECEDIN
6cc0: 47 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  G */.){.  Window
6cd0: 20 2a 70 57 69 6e 20 3d 20 30 3b 0a 0a 20 20 2f   *pWin = 0;..  /
6ce0: 2a 20 50 61 72 73 65 72 20 61 73 73 75 72 65 73  * Parser assures
6cf0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20   the following: 
6d00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
6d10: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 7c 7c 20  pe==TK_RANGE || 
6d20: 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 29  eType==TK_ROWS )
6d30: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 53 74 61  ;.  assert( eSta
6d40: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c  rt==TK_CURRENT |
6d50: 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45  | eStart==TK_PRE
6d60: 43 45 44 49 4e 47 0a 20 20 20 20 20 20 20 20 20  CEDING.         
6d70: 20 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f    || eStart==TK_
6d80: 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65 53 74  UNBOUNDED || eSt
6d90: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
6da0: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  G );.  assert( e
6db0: 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  End==TK_CURRENT 
6dc0: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  || eEnd==TK_FOLL
6dd0: 4f 57 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20  OWING.          
6de0: 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42   || eEnd==TK_UNB
6df0: 4f 55 4e 44 45 44 20 7c 7c 20 65 45 6e 64 3d 3d  OUNDED || eEnd==
6e00: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 3b 0a  TK_PRECEDING );.
6e10: 20 20 61 73 73 65 72 74 28 20 28 65 53 74 61 72    assert( (eStar
6e20: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
6e30: 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  || eStart==TK_FO
6e40: 4c 4c 4f 57 49 4e 47 29 3d 3d 28 70 53 74 61 72  LLOWING)==(pStar
6e50: 74 21 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  t!=0) );.  asser
6e60: 74 28 20 28 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  t( (eEnd==TK_FOL
6e70: 4c 4f 57 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d  LOWING || eEnd==
6e80: 54 4b 5f 50 52 45 43 45 44 49 4e 47 29 3d 3d 28  TK_PRECEDING)==(
6e90: 70 45 6e 64 21 3d 30 29 20 29 3b 0a 0a 0a 20 20  pEnd!=0) );...  
6ea0: 2f 2a 20 49 66 20 61 20 66 72 61 6d 65 20 69 73  /* If a frame is
6eb0: 20 64 65 63 6c 61 72 65 64 20 22 52 41 4e 47 45   declared "RANGE
6ec0: 22 20 28 6e 6f 74 20 22 52 4f 57 53 22 29 2c 20  " (not "ROWS"), 
6ed0: 74 68 65 6e 20 69 74 20 6d 61 79 20 6e 6f 74 20  then it may not 
6ee0: 75 73 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  use.  ** either 
6ef0: 22 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e  "<expr> PRECEDIN
6f00: 47 22 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f  G" or "<expr> FO
6f10: 4c 4c 4f 57 49 4e 47 22 2e 0a 20 20 2a 2f 0a 20  LLOWING"..  */. 
6f20: 20 69 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52   if( eType==TK_R
6f30: 41 4e 47 45 20 26 26 20 28 70 53 74 61 72 74 21  ANGE && (pStart!
6f40: 3d 30 20 7c 7c 20 70 45 6e 64 21 3d 30 29 20 29  =0 || pEnd!=0) )
6f50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6f60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 52  orMsg(pParse, "R
6f70: 41 4e 47 45 20 6d 75 73 74 20 75 73 65 20 6f 6e  ANGE must use on
6f80: 6c 79 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20  ly UNBOUNDED or 
6f90: 43 55 52 52 45 4e 54 20 52 4f 57 22 29 3b 0a 20  CURRENT ROW");. 
6fa0: 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c     goto windowAl
6fb0: 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f  locErr;.  }..  /
6fc0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
6fd0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e  the.  ** startin
6fe0: 67 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20  g boundary type 
6ff0: 6d 61 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61  may not occur ea
7000: 72 6c 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c  rlier in the fol
7010: 6c 6f 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e  lowing list than
7020: 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67  .  ** the ending
7030: 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a   boundary type:.
7040: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f    **.  **   UNBO
7050: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a  UNDED PRECEDING.
7060: 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52    **   <expr> PR
7070: 45 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43  ECEDING.  **   C
7080: 55 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20  URRENT ROW.  ** 
7090: 20 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49    <expr> FOLLOWI
70a0: 4e 47 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e  NG.  **   UNBOUN
70b0: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20  DED FOLLOWING.  
70c0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73  **.  ** The pars
70d0: 65 72 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  er ensures that 
70e0: 22 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45  "UNBOUNDED PRECE
70f0: 44 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20  DING" cannot be 
7100: 75 73 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e  used as an endin
7110: 67 0a 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c  g.  ** boundary,
7120: 20 61 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55   and than "UNBOU
7130: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20  NDED FOLLOWING" 
7140: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61  cannot be used a
7150: 73 20 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  s a starting.  *
7160: 2a 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79  * frame boundary
7170: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53  ..  */.  if( (eS
7180: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
7190: 20 26 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45   && eEnd==TK_PRE
71a0: 43 45 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65  CEDING).   || (e
71b0: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
71c0: 49 4e 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b  ING && (eEnd==TK
71d0: 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45  _PRECEDING || eE
71e0: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29  nd==TK_CURRENT))
71f0: 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
7200: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7210: 2c 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66  , "unsupported f
7220: 72 61 6d 65 20 64 65 6c 69 6d 69 74 65 72 20 66  rame delimiter f
7230: 6f 72 20 52 4f 57 53 22 29 3b 0a 20 20 20 20 67  or ROWS");.    g
7240: 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45  oto windowAllocE
7250: 72 72 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e 20  rr;.  }..  pWin 
7260: 3d 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74  = (Window*)sqlit
7270: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
7280: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
7290: 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66  f(Window));.  if
72a0: 28 20 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74 6f  ( pWin==0 ) goto
72b0: 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b   windowAllocErr;
72c0: 0a 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d  .  pWin->eType =
72d0: 20 65 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e   eType;.  pWin->
72e0: 65 53 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b  eStart = eStart;
72f0: 0a 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20  .  pWin->eEnd = 
7300: 65 45 6e 64 3b 0a 20 20 70 57 69 6e 2d 3e 70 45  eEnd;.  pWin->pE
7310: 6e 64 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  nd = sqlite3Wind
7320: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61  owOffsetExpr(pPa
7330: 72 73 65 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57  rse, pEnd);.  pW
7340: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c  in->pStart = sql
7350: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
7360: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 53 74  Expr(pParse, pSt
7370: 61 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  art);.  return p
7380: 57 69 6e 3b 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f  Win;..windowAllo
7390: 63 45 72 72 3a 0a 20 20 73 71 6c 69 74 65 33 45  cErr:.  sqlite3E
73a0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
73b0: 2d 3e 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 73  ->db, pEnd);.  s
73c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
73d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74  (pParse->db, pSt
73e0: 61 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  art);.  return 0
73f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63  ;.}../*.** Attac
7400: 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  h window object 
7410: 70 57 69 6e 20 74 6f 20 65 78 70 72 65 73 73 69  pWin to expressi
7420: 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  on p..*/.void sq
7430: 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61 63  lite3WindowAttac
7440: 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
7450: 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f 77   Expr *p, Window
7460: 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20 70   *pWin){.  if( p
7470: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 57 69 6e   ){.    if( pWin
7480: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 69   ){.      p->pWi
7490: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20  n = pWin;.      
74a0: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70  pWin->pOwner = p
74b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
74c0: 6c 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e  lags & EP_Distin
74d0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
74e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
74f0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
7500: 20 22 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f   "DISTINCT is no
7510: 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  t supported for 
7520: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
7530: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
7540: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
7550: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
7560: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
7570: 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Win);.  }.}../*.
7580: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  ** Return 0 if t
7590: 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62  he two window ob
75a0: 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69  jects are identi
75b0: 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cal, or non-zero
75c0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49   otherwise..** I
75d0: 64 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20  dentical window 
75e0: 6f 62 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70  objects can be p
75f0: 72 6f 63 65 73 73 65 64 20 69 6e 20 61 20 73 69  rocessed in a si
7600: 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e  ngle scan..*/.in
7610: 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  t sqlite3WindowC
7620: 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50  ompare(Parse *pP
7630: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31  arse, Window *p1
7640: 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20  , Window *p2){. 
7650: 20 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d   if( p1->eType!=
7660: 70 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75  p2->eType ) retu
7670: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e  rn 1;.  if( p1->
7680: 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61  eStart!=p2->eSta
7690: 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rt ) return 1;. 
76a0: 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70   if( p1->eEnd!=p
76b0: 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e  2->eEnd ) return
76c0: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
76d0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
76e0: 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c  rse, p1->pStart,
76f0: 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29   p2->pStart, -1)
7700: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7710: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
7720: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
7730: 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64  ->pEnd, p2->pEnd
7740: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
7750: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
7760: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
7770: 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70  1->pPartition, p
7780: 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d  2->pPartition, -
7790: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
77a0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
77b0: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e  ListCompare(p1->
77c0: 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f  pOrderBy, p2->pO
77d0: 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65  rderBy, -1) ) re
77e0: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
77f0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   0;.}.../*.** Th
7800: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  is is called by 
7810: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
7820: 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73   before it calls
7830: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
7840: 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e  in().** to begin
7850: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
7860: 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  gh the sub-query
7870: 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20   results. It is 
7880: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
7890: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
78a0: 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ze registers and
78b0: 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62 79   cursors used by
78c0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
78d0: 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  deStep()..*/.voi
78e0: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  d sqlite3WindowC
78f0: 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70  odeInit(Parse *p
7900: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
7910: 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20  MWin){.  Window 
7920: 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  *pWin;.  Vdbe *v
7930: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
7940: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
7950: 20 6e 50 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d   nPart = (pMWin-
7960: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d  >pPartition ? pM
7970: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d  Win->pPartition-
7980: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e  >nExpr : 0);.  n
7990: 50 61 72 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e  Part += (pMWin->
79a0: 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e  pOrderBy ? pMWin
79b0: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
79c0: 72 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 50  r : 0);.  if( nP
79d0: 61 72 74 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e  art ){.    pMWin
79e0: 2d 3e 72 65 67 50 61 72 74 20 3d 20 70 50 61 72  ->regPart = pPar
79f0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7a00: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
7a10: 6e 50 61 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  nPart;.    sqlit
7a20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7a30: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69  OP_Null, 0, pMWi
7a40: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69  n->regPart, pMWi
7a50: 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61 72 74  n->regPart+nPart
7a60: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  -1);.  }..  for(
7a70: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
7a80: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
7a90: 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63  xtWin){.    Func
7aa0: 44 65 66 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70  Def *p = pWin->p
7ab0: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 28 70  Func;.    if( (p
7ac0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
7ad0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
7ae0: 29 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72  ) && pWin->eStar
7af0: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
7b00: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
7b10: 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f 6e 73 20  inline versions 
7b20: 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  of min() and max
7b30: 28 29 20 72 65 71 75 69 72 65 20 61 20 73 69 6e  () require a sin
7b40: 67 6c 65 20 65 70 68 65 6d 65 72 61 6c 0a 20 20  gle ephemeral.  
7b50: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
7b60: 20 33 20 72 65 67 69 73 74 65 72 73 2e 20 54 68   3 registers. Th
7b70: 65 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  e registers are 
7b80: 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  used as follows:
7b90: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
7ba0: 2a 2a 20 20 20 72 65 67 41 70 70 2b 30 3a 20 73  **   regApp+0: s
7bb0: 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28  lot to copy min(
7bc0: 29 2f 6d 61 78 28 29 20 61 72 67 75 6d 65 6e 74  )/max() argument
7bd0: 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f   to for MakeReco
7be0: 72 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  rd.      **   re
7bf0: 67 41 70 70 2b 31 3a 20 69 6e 74 65 67 65 72 20  gApp+1: integer 
7c00: 76 61 6c 75 65 20 75 73 65 64 20 74 6f 20 65 6e  value used to en
7c10: 73 75 72 65 20 6b 65 79 73 20 61 72 65 20 75 6e  sure keys are un
7c20: 69 71 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20  ique.      **   
7c30: 72 65 67 41 70 70 2b 32 3a 20 6f 75 74 70 75 74  regApp+2: output
7c40: 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20   of MakeRecord. 
7c50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
7c60: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
7c70: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
7c80: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 4b 65 79  pList;.      Key
7c90: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
7ca0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
7cb0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
7cc0: 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c 20 30 29  se, pList, 0, 0)
7cd0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73  ;.      pWin->cs
7ce0: 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rApp = pParse->n
7cf0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69  Tab++;.      pWi
7d00: 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72  n->regApp = pPar
7d10: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7d20: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
7d30: 3d 20 33 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 3;.      if( p
7d40: 4b 65 79 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d  KeyInfo && pWin-
7d50: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d  >pFunc->zName[1]
7d60: 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 20  =='i' ){.       
7d70: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
7d80: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  o->aSortOrder[0]
7d90: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
7da0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
7db0: 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20  der[0] = 1;.    
7dc0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7dd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7de0: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
7df0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32   pWin->csrApp, 2
7e00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7e10: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
7e20: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
7e30: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c  INFO);.      sql
7e40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7e50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
7e60: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29   pWin->regApp+1)
7e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
7e80: 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e   if( p->zName==n
7e90: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20  th_valueName || 
7ea0: 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f  p->zName==first_
7eb0: 76 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20  valueName ){.   
7ec0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74     /* Allocate t
7ed0: 77 6f 20 72 65 67 69 73 74 65 72 73 20 61 74 20  wo registers at 
7ee0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2e 20 54 68  pWin->regApp. Th
7ef0: 65 73 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ese will be used
7f00: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f   to.      ** sto
7f10: 72 65 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  re the start and
7f20: 20 65 6e 64 20 69 6e 64 65 78 20 6f 66 20 74 68   end index of th
7f30: 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e  e current frame.
7f40: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
7f50: 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t( pMWin->iEphCs
7f60: 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  r );.      pWin-
7f70: 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72 73 65  >regApp = pParse
7f80: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
7f90: 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70  pWin->csrApp = p
7fa0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
7fb0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
7fc0: 6d 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  m += 2;.      sq
7fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7fe0: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70  v, OP_OpenDup, p
7ff0: 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57  Win->csrApp, pMW
8000: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
8010: 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28    }.    else if(
8020: 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e   p->zName==leadN
8030: 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d  ame || p->zName=
8040: 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20  =lagName ){.    
8050: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
8060: 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20  >iEphCsr );.    
8070: 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d    pWin->csrApp =
8080: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
8090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
80a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
80b0: 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73  penDup, pWin->cs
80c0: 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rApp, pMWin->iEp
80d0: 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hCsr);.    }.  }
80e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45  .}../*.** A "PRE
80f0: 43 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28  CEDING <expr>" (
8100: 65 43 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f  eCond==0) or "FO
8110: 4c 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20  LLOWING <expr>" 
8120: 28 65 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68  (eCond==1) or th
8130: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
8140: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8150: 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29  t to nth_value()
8160: 20 28 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20   (eCond==2) has 
8170: 6a 75 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61  just been.** eva
8180: 6c 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72  luated and the r
8190: 65 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65  esult left in re
81a0: 67 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73  gister reg. This
81b0: 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61   function genera
81c0: 74 65 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74  tes VM.** code t
81d0: 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
81e0: 20 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d   value is a non-
81f0: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
8200: 20 61 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a   and throws an.*
8210: 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69  * exception if i
8220: 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  t is not..*/.sta
8230: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
8240: 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 50 61 72  heckIntValue(Par
8250: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
8260: 72 65 67 2c 20 69 6e 74 20 65 43 6f 6e 64 29 7b  reg, int eCond){
8270: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
8280: 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20  char *azErr[] = 
8290: 7b 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61  {.    "frame sta
82a0: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73  rting offset mus
82b0: 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  t be a non-negat
82c0: 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20  ive integer",.  
82d0: 20 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20    "frame ending 
82e0: 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61  offset must be a
82f0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
8300: 74 65 67 65 72 22 2c 0a 20 20 20 20 22 73 65 63  teger",.    "sec
8310: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
8320: 6e 74 68 5f 76 61 6c 75 65 20 6d 75 73 74 20 62  nth_value must b
8330: 65 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74  e a positive int
8340: 65 67 65 72 22 0a 20 20 7d 3b 0a 20 20 73 74 61  eger".  };.  sta
8350: 74 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d 20  tic int aOp[] = 
8360: 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c 20  { OP_Ge, OP_Ge, 
8370: 4f 50 5f 47 74 20 7d 3b 0a 20 20 56 64 62 65 20  OP_Gt };.  Vdbe 
8380: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
8390: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
83a0: 6e 74 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c  nt regZero = sql
83b0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
83c0: 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
83d0: 28 20 65 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43  ( eCond==0 || eC
83e0: 6f 6e 64 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d  ond==1 || eCond=
83f0: 3d 32 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =2 );.  sqlite3V
8400: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8410: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 5a  Integer, 0, regZ
8420: 65 72 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ero);.  sqlite3V
8430: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8440: 4d 75 73 74 42 65 49 6e 74 2c 20 72 65 67 2c 20  MustBeInt, reg, 
8450: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
8460: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
8470: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8480: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
8490: 64 4f 70 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e  dOp3(v, aOp[eCon
84a0: 64 5d 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c  d], regZero, sql
84b0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
84c0: 64 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a  ddr(v)+2, reg);.
84d0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
84e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
84f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c  AddOp2(v, OP_Hal
8500: 74 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  t, SQLITE_ERROR,
8510: 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71   OE_Abort);.  sq
8520: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
8530: 34 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72  4(v, (void*)azEr
8540: 72 5b 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41  r[eCond], P4_STA
8550: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  TIC);.  sqlite3R
8560: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
8570: 61 72 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a  arse, regZero);.
8580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8590: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  the number of ar
85a0: 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
85b0: 6f 20 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e  o the window-fun
85c0: 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ction associated
85d0: 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a  .** with the obj
85e0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
85f0: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  e only argument 
8600: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
8610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8620: 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57  windowArgCount(W
8630: 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20  indow *pWin){.  
8640: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
8650: 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  = pWin->pOwner->
8660: 78 2e 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72  x.pList;.  retur
8670: 6e 20 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  n (pList ? pList
8680: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a  ->nExpr : 0);.}.
8690: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
86a0: 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b  VM code to invok
86b0: 65 20 65 69 74 68 65 72 20 78 53 74 65 70 28 29  e either xStep()
86c0: 20 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73   (if bInverse is
86d0: 20 30 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65   0) or .** xInve
86e0: 72 73 65 20 28 69 66 20 62 49 6e 76 65 72 73 65  rse (if bInverse
86f0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f   is non-zero) fo
8700: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
8710: 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a  nction in the .*
8720: 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  * linked list st
8730: 61 72 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e  arting at pMWin.
8740: 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69   Or, for built-i
8750: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
8760: 6e 73 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f  ns.** that do no
8770: 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61  t use the standa
8780: 72 64 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c  rd function API,
8790: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65   generate the re
87a0: 71 75 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65  quired.** inline
87b0: 20 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20   VM code..**.** 
87c0: 49 66 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20  If argument csr 
87d0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
87e0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74  or equal to 0, t
87f0: 68 65 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67  hen argument reg
8800: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
8810: 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20   register in an 
8820: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
8830: 72 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  rs guaranteed to
8840: 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
8850: 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
8860: 61 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  array of argumen
8870: 74 73 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63  ts for each func
8880: 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
8890: 73 65 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  se.** the argume
88a0: 6e 74 73 20 61 72 65 20 65 78 74 72 61 63 74 65  nts are extracte
88b0: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
88c0: 6e 74 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e  nt row of csr in
88d0: 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  to the.** array 
88e0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 62 65 66  of registers bef
88f0: 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f  ore invoking OP_
8900: 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67  AggStep or OP_Ag
8910: 67 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f  gInverse.**.** O
8920: 72 2c 20 69 66 20 63 73 72 20 69 73 20 6c 65 73  r, if csr is les
8930: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
8940: 6e 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72  n the array of r
8950: 65 67 69 73 74 65 72 73 20 61 74 20 72 65 67 20  egisters at reg 
8960: 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f  is.** already po
8970: 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c  pulated with all
8980: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68   columns from th
8990: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
89a0: 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
89b0: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
89c0: 74 20 72 65 67 50 61 72 74 53 69 7a 65 20 69 73  t regPartSize is
89d0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
89e0: 69 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72  it is a register
89f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a   containing the.
8a00: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
8a10: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
8a20: 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73   partition..*/.s
8a30: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
8a40: 77 41 67 67 53 74 65 70 28 0a 20 20 50 61 72 73  wAggStep(.  Pars
8a50: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69  e *pParse, .  Wi
8a60: 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20  ndow *pMWin,    
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a80: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
8a90: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
8aa0: 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20   */.  int csr,  
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72        /* Read ar
8ad0: 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69  guments from thi
8ae0: 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e  s cursor */.  in
8af0: 74 20 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20  t bInverse,     
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b10: 20 54 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20   True to invoke 
8b20: 78 49 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64  xInverse instead
8b30: 20 6f 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69   of xStep */.  i
8b40: 6e 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20  nt reg,         
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b60: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73  * Array of regis
8b70: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ters */.  int re
8b80: 67 50 61 72 74 53 69 7a 65 20 20 20 20 20 20 20  gPartSize       
8b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
8ba0: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
8bb0: 20 73 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69   size of partiti
8bc0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  on */.){.  Vdbe 
8bd0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
8be0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
8bf0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
8c00: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
8c10: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
8c20: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69  pNextWin){.    i
8c30: 6e 74 20 66 6c 61 67 73 20 3d 20 70 57 69 6e 2d  nt flags = pWin-
8c40: 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
8c50: 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 72  s;.    int regAr
8c60: 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20  g;.    int nArg 
8c70: 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  = windowArgCount
8c80: 28 70 57 69 6e 29 3b 0a 0a 20 20 20 20 69 66 28  (pWin);..    if(
8c90: 20 63 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20   csr>=0 ){.     
8ca0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
8cb0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
8cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
8cd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8ce0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72  , OP_Column, csr
8cf0: 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b  , pWin->iArgCol+
8d00: 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20  i, reg+i);.     
8d10: 20 7d 0a 20 20 20 20 20 20 72 65 67 41 72 67 20   }.      regArg 
8d20: 3d 20 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28  = reg;.      if(
8d30: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
8d40: 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45  FUNC_WINDOW_SIZE
8d50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
8d60: 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nArg==0 ){.     
8d70: 20 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65       regArg = re
8d80: 67 50 61 72 74 53 69 7a 65 3b 0a 20 20 20 20 20  gPartSize;.     
8d90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8da0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8db0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
8dc0: 79 2c 20 72 65 67 50 61 72 74 53 69 7a 65 2c 20  y, regPartSize, 
8dd0: 72 65 67 2b 6e 41 72 67 29 3b 0a 20 20 20 20 20  reg+nArg);.     
8de0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 72     }.        nAr
8df0: 67 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g++;.      }.   
8e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
8e10: 73 65 72 74 28 20 21 28 66 6c 61 67 73 20 26 20  sert( !(flags & 
8e20: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
8e30: 4f 57 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20  OW_SIZE) );.    
8e40: 20 20 72 65 67 41 72 67 20 3d 20 72 65 67 20 2b    regArg = reg +
8e50: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a   pWin->iArgCol;.
8e60: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
8e70: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
8e80: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
8e90: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20  FUNC_MINMAX) .  
8ea0: 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74      && pWin->eSt
8eb0: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
8ec0: 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  D .    ){.      
8ed0: 69 6e 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d  int addrIsNull =
8ee0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ef0: 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
8f00: 20 72 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20   regArg);.      
8f10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
8f20: 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 76 65  .      if( bInve
8f30: 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rse==0 ){.      
8f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8f50: 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  Op2(v, OP_AddImm
8f60: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31  , pWin->regApp+1
8f70: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
8f80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8f90: 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67  v, OP_SCopy, reg
8fa0: 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Arg, pWin->regAp
8fb0: 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
8fc0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8fd0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8fe0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c  pWin->regApp, 2,
8ff0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29   pWin->regApp+2)
9000: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9010: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9020: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69  P_IdxInsert, pWi
9030: 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d  n->csrApp, pWin-
9040: 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20  >regApp+2);.    
9050: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9070: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b  p4Int(v, OP_Seek
9080: 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  GE, pWin->csrApp
9090: 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b  , 0, regArg, 1);
90a0: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
90b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
90c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
90d0: 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
90e0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b  , pWin->csrApp);
90f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9100: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
9110: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9120: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
9130: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
9140: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9150: 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a  v, addrIsNull);.
9160: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
9170: 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20  in->regApp ){.  
9180: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
9190: 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ->pFunc->zName==
91a0: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  nth_valueName.  
91b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69 6e           || pWin
91c0: 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ->pFunc->zName==
91d0: 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a  first_valueName.
91e0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
91f0: 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d  ssert( bInverse=
9200: 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d  =0 || bInverse==
9210: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
9220: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9230: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d  OP_AddImm, pWin-
9240: 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72  >regApp+1-bInver
9250: 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  se, 1);.    }els
9260: 65 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e  e if( pWin->pFun
9270: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61  c->zName==leadNa
9280: 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  me.           ||
9290: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e   pWin->pFunc->zN
92a0: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a 20 20 20  ame==lagName.   
92b0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d   ){.      /* no-
92c0: 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  op */.    }else{
92d0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
92e0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  f = 0;.      if(
92f0: 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29   pWin->pFilter )
9300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
9310: 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  gTmp;.        as
9320: 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c  sert( nArg==0 ||
9330: 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77   nArg==pWin->pOw
9340: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  ner->x.pList->nE
9350: 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61  xpr );.        a
9360: 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20 70  ssert( nArg || p
9370: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
9380: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
9390: 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a     if( csr>0 ){.
93a0: 20 20 20 20 20 20 20 20 20 20 72 65 67 54 6d 70            regTmp
93b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
93c0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
93d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
93e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
93f0: 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69  Column, csr, pWi
9400: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72 67 2c  n->iArgCol+nArg,
9410: 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20  regTmp);.       
9420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9430: 20 20 72 65 67 54 6d 70 20 3d 20 72 65 67 41 72    regTmp = regAr
9440: 67 20 2b 20 6e 41 72 67 3b 0a 20 20 20 20 20 20  g + nArg;.      
9450: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72    }.        addr
9460: 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  If = sqlite3Vdbe
9470: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e  AddOp3(v, OP_IfN
9480: 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20 31  ot, regTmp, 0, 1
9490: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
94a0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
94b0: 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b      if( csr>0 ){
94c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
94d0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
94e0: 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70 29  (pParse, regTmp)
94f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9500: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57    }.      if( pW
9510: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
9520: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
9530: 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
9540: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
9550: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61  pColl;.        a
9560: 73 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29 3b  ssert( nArg>0 );
9570: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
9580: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f   sqlite3ExprNNCo
9590: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 57  llSeq(pParse, pW
95a0: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
95b0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
95c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
95d0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
95e0: 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30  P_CollSeq, 0,0,0
95f0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
9600: 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
9610: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9630: 70 33 28 76 2c 20 62 49 6e 76 65 72 73 65 3f 20  p3(v, bInverse? 
9640: 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 20 3a 20  OP_AggInverse : 
9650: 4f 50 5f 41 67 67 53 74 65 70 2c 20 0a 20 20 20  OP_AggStep, .   
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 20 20 20 62 49 6e 76 65 72 73 65 2c 20 72       bInverse, r
9680: 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67  egArg, pWin->reg
9690: 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73 71  Accum);.      sq
96a0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
96b0: 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63  4(v, pWin->pFunc
96c0: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
96d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
96e0: 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
96f0: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28  nArg);.      if(
9700: 20 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65   addrIf ) sqlite
9710: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
9720: 20 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a   addrIf);.    }.
9730: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
9740: 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f  erate VM code to
9750: 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78   invoke either x
9760: 56 61 6c 75 65 28 29 20 28 62 46 69 6e 61 6c 3d  Value() (bFinal=
9770: 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c 69 7a 65  =0) or xFinalize
9780: 28 29 0a 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d 31  ().** (bFinal==1
9790: 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  ) for each windo
97a0: 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68  w function in th
97b0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
97c0: 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70 4d 57  arting at.** pMW
97d0: 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c  in. Or, for buil
97e0: 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63  t-in window-func
97f0: 74 69 6f 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f  tions that do no
9800: 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61  t use the standa
9810: 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e 65 72  rd.** API, gener
9820: 61 74 65 20 74 68 65 20 65 71 75 69 76 61 6c 65  ate the equivale
9830: 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a 73  nt VM code..*/.s
9840: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
9850: 77 41 67 67 46 69 6e 61 6c 28 50 61 72 73 65 20  wAggFinal(Parse 
9860: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
9870: 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46 69 6e  *pMWin, int bFin
9880: 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  al){.  Vdbe *v =
9890: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
98a0: 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f  pParse);.  Windo
98b0: 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28  w *pWin;..  for(
98c0: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
98d0: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
98e0: 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20  xtWin){.    if( 
98f0: 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75  (pWin->pFunc->fu
9900: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
9910: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20  _FUNC_MINMAX) . 
9920: 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74      && pWin->eSt
9930: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
9940: 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  D .    ){.      
9950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9960: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
9970: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
9980: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9990: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
99a0: 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72  _Last, pWin->csr
99b0: 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65  App);.      Vdbe
99c0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
99d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
99e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
99f0: 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  n, pWin->csrApp,
9a00: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
9a10: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
9a20: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9a30: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
9a40: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b  rrentAddr(v)-2);
9a50: 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61  .      if( bFina
9a60: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
9a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
9a80: 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
9a90: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b  , pWin->csrApp);
9aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
9ab0: 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67  se if( pWin->reg
9ac0: 41 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c 73 65  App ){.    }else
9ad0: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e  {.      if( bFin
9ae0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
9af0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9b00: 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20  v, OP_AggFinal, 
9b10: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20  pWin->regAccum, 
9b20: 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70  windowArgCount(p
9b30: 57 69 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 73  Win));.        s
9b40: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
9b50: 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e  P4(v, pWin->pFun
9b60: 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
9b70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9b80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9b90: 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41  Copy, pWin->regA
9ba0: 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52  ccum, pWin->regR
9bb0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
9bc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9bd0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
9be0: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29   pWin->regAccum)
9bf0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9c00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9c10: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
9c20: 67 67 56 61 6c 75 65 2c 20 70 57 69 6e 2d 3e 72  ggValue, pWin->r
9c30: 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41  egAccum, windowA
9c40: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 2c 0a 20  rgCount(pWin),. 
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 70 57 69 6e              pWin
9c70: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
9c80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9c90: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69  eAppendP4(v, pWi
9ca0: 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  n->pFunc, P4_FUN
9cb0: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  CDEF);.      }. 
9cc0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9cd0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9ce0: 67 65 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64  generates VM cod
9cf0: 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  e to invoke the 
9d00: 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 61  sub-routine at a
9d10: 64 64 72 65 73 73 0a 2a 2a 20 6c 62 6c 46 6c 75  ddress.** lblFlu
9d20: 73 68 50 61 72 74 20 6f 6e 63 65 20 66 6f 72 20  shPart once for 
9d30: 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 77  each partition w
9d40: 69 74 68 20 74 68 65 20 65 6e 74 69 72 65 20 70  ith the entire p
9d50: 61 72 74 69 74 69 6f 6e 20 63 61 63 68 65 64 20  artition cached 
9d60: 69 6e 0a 2a 2a 20 74 68 65 20 57 69 6e 64 6f 77  in.** the Window
9d70: 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20 74 61  .iEphCsr temp ta
9d80: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
9d90: 6f 69 64 20 77 69 6e 64 6f 77 50 61 72 74 69 74  oid windowPartit
9da0: 69 6f 6e 43 61 63 68 65 28 0a 20 20 50 61 72 73  ionCache(.  Pars
9db0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 65 6c  e *pParse,.  Sel
9dc0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9de0: 54 68 65 20 72 65 77 72 69 74 74 65 6e 20 53 45  The rewritten SE
9df0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
9e00: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
9e10: 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  WInfo,          
9e20: 20 20 20 20 2f 2a 20 57 68 65 72 65 49 6e 66 6f      /* WhereInfo
9e30: 20 74 6f 20 63 61 6c 6c 20 57 68 65 72 65 45 6e   to call WhereEn
9e40: 64 28 29 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  d() on */.  int 
9e50: 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 20 20  regFlushPart,   
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9e70: 65 67 69 73 74 65 72 20 74 6f 20 75 73 65 20 77  egister to use w
9e80: 69 74 68 20 47 6f 73 75 62 20 6c 62 6c 46 6c 75  ith Gosub lblFlu
9e90: 73 68 50 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20  shPart */.  int 
9ea0: 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 20 20  lblFlushPart,   
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9ec0: 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 47 6f 73  ubroutine to Gos
9ed0: 75 62 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a  ub to */.  int *
9ee0: 70 52 65 67 53 69 7a 65 20 20 20 20 20 20 20 20  pRegSize        
9ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
9f00: 54 3a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  T: Register cont
9f10: 61 69 6e 69 6e 67 20 70 61 72 74 69 74 69 6f 6e  aining partition
9f20: 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 57 69   size */.){.  Wi
9f30: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
9f40: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
9f50: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
9f60: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
9f70: 20 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53   iSubCsr = p->pS
9f80: 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  rc->a[0].iCursor
9f90: 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70  ;.  int nSub = p
9fa0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
9fb0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b  b->nCol;.  int k
9fc0: 3b 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70  ;..  int reg = p
9fd0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
9fe0: 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d   int regRecord =
9ff0: 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74   reg+nSub;.  int
a000: 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52   regRowid = regR
a010: 65 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70 52 65  ecord+1;..  *pRe
a020: 67 53 69 7a 65 20 3d 20 72 65 67 52 6f 77 69 64  gSize = regRowid
a030: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
a040: 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20   += nSub + 2;.. 
a050: 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20   /* Martial the 
a060: 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20  row returned by 
a070: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69  the sub-select i
a080: 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
a090: 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 2e  .  ** registers.
a0a0: 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
a0b0: 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20  <nSub; k++){.   
a0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a0d0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
a0e0: 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67   iSubCsr, k, reg
a0f0: 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  +k);.  }.  sqlit
a100: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a110: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
a120: 65 67 2c 20 6e 53 75 62 2c 20 72 65 67 52 65 63  eg, nSub, regRec
a130: 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ord);..  /* Chec
a140: 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  k if this is the
a150: 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20   start of a new 
a160: 70 61 72 74 69 74 69 6f 6e 2e 20 49 66 20 73 6f  partition. If so
a170: 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
a180: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20  flush_partition 
a190: 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 20 2a 2f  sub-routine.  */
a1a0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50  .  if( pMWin->pP
a1b0: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20  artition ){.    
a1c0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78  int addr;.    Ex
a1d0: 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20  prList *pPart = 
a1e0: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
a1f0: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74  n;.    int nPart
a200: 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b   = pPart->nExpr;
a210: 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50  .    int regNewP
a220: 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57 69  art = reg + pMWi
a230: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20  n->nBufferCol;. 
a240: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
a250: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
a260: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
a270: 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c  t(pParse, pPart,
a280: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61 64 64   0, 0);..    add
a290: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
a2a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
a2b0: 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c  are, regNewPart,
a2c0: 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c   pMWin->regPart,
a2d0: 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69  nPart);.    sqli
a2e0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
a2f0: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
a300: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
a310: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a320: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
a330: 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72 2b  p, addr+2, addr+
a340: 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  4, addr+2);.    
a350: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a370: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
a380: 79 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  y, regNewPart, p
a390: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e  MWin->regPart, n
a3a0: 50 61 72 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Part-1);.    sql
a3b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a3c0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46  , OP_Gosub, regF
a3d0: 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75  lushPart, lblFlu
a3e0: 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20  shPart);.  }..  
a3f0: 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63 75  /* Buffer the cu
a400: 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68 65  rrent row in the
a410: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
a420: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  . */.  sqlite3Vd
a430: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
a440: 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e  ewRowid, pMWin->
a450: 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f 77 69  iEphCsr, regRowi
a460: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
a470: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
a480: 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  sert, pMWin->iEp
a490: 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  hCsr, regRecord,
a4a0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f   regRowid);..  /
a4b0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 69 6e 70  * End of the inp
a4c0: 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c  ut loop */.  sql
a4d0: 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
a4e0: 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f  nfo);..  /* Invo
a4f0: 6b 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74  ke "flush_partit
a500: 69 6f 6e 22 20 74 6f 20 64 65 61 6c 20 77 69 74  ion" to deal wit
a510: 68 20 74 68 65 20 66 69 6e 61 6c 20 28 6f 72 20  h the final (or 
a520: 6f 6e 6c 79 29 20 70 61 72 74 69 74 69 6f 6e 20  only) partition 
a530: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
a540: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
a550: 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  ub, regFlushPart
a560: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
a570: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
a580: 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65   the sub-routine
a590: 20 61 74 20 72 65 67 47 6f 73 75 62 20 28 67 65   at regGosub (ge
a5a0: 6e 65 72 61 74 65 64 20 62 79 20 63 6f 64 65 20  nerated by code 
a5b0: 69 6e 20 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a  in select.c) to.
a5c0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  ** return the cu
a5d0: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e  rrent row of Win
a5e0: 64 6f 77 2e 69 45 70 68 43 73 72 2e 20 49 66 20  dow.iEphCsr. If 
a5f0: 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  all window funct
a600: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67 72  ions are.** aggr
a610: 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e  egate window fun
a620: 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20  ctions that use 
a630: 74 68 65 20 73 74 61 6e 64 61 72 64 20 41 50 49  the standard API
a640: 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50  , a single.** OP
a650: 5f 47 6f 73 75 62 20 69 6e 73 74 72 75 63 74 69  _Gosub instructi
a660: 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61 74 20 74  on is all that t
a670: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
a680: 72 61 74 65 73 2e 20 45 78 74 72 61 20 56 4d 20  rates. Extra VM 
a690: 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d  code.** for per-
a6a0: 72 6f 77 20 70 72 6f 63 65 73 73 69 6e 67 20 69  row processing i
a6b0: 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64  s only generated
a6c0: 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69   for the followi
a6d0: 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64  ng built-in wind
a6e0: 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  ow.** functions:
a6f0: 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c  .**.**   nth_val
a700: 75 65 28 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f  ue().**   first_
a710: 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67  value().**   lag
a720: 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a  ().**   lead().*
a730: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
a740: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
a750: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a760: 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  e,.  Window *pMW
a770: 69 6e 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73  in,.  int regGos
a780: 75 62 2c 0a 20 20 69 6e 74 20 61 64 64 72 47 6f  ub,.  int addrGo
a790: 73 75 62 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76  sub.){.  Vdbe *v
a7a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a7b0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
a7c0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72  dow *pWin;.  for
a7d0: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
a7e0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
a7f0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e  extWin){.    Fun
a800: 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57  cDef *pFunc = pW
a810: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69  in->pFunc;.    i
a820: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
a830: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  =nth_valueName. 
a840: 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e      || pFunc->zN
a850: 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  ame==first_value
a860: 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Name.    ){.    
a870: 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e    int csr = pWin
a880: 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20  ->csrApp;.      
a890: 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65  int lbl = sqlite
a8a0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a8b0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70  );.      int tmp
a8c0: 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
a8d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a8e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a8f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
a900: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
a910: 67 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20  gResult);..     
a920: 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d   if( pFunc->zNam
a930: 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
a940: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a950: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a960: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69   OP_Column, pMWi
a970: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 57 69 6e  n->iEphCsr, pWin
a980: 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52  ->iArgCol+1,tmpR
a990: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  eg);.        win
a9a0: 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65  dowCheckIntValue
a9b0: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 2c  (pParse, tmpReg,
a9c0: 20 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   2);.      }else
a9d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a9e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a9f0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d  P_Integer, 1, tm
aa00: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pReg);.      }. 
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 41 64 64  AddOp3(v, OP_Add
aa30: 2c 20 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e  , tmpReg, pWin->
aa40: 72 65 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b  regApp, tmpReg);
aa50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aa60: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47  beAddOp3(v, OP_G
aa70: 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  t, pWin->regApp+
aa80: 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b  1, lbl, tmpReg);
aa90: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
aaa0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
aab0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
aac0: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
aad0: 20 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65   csr, lbl, tmpRe
aae0: 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
aaf0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
ab00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab10: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
ab20: 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67   csr, pWin->iArg
ab30: 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  Col, pWin->regRe
ab40: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
ab50: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
ab60: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
ab70: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ab80: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
ab90: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d  , tmpReg);.    }
aba0: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 46  .    else if( pF
abb0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
abc0: 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a  Name || pFunc->z
abd0: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b  Name==lagName ){
abe0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20  .      int nArg 
abf0: 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  = pWin->pOwner->
ac00: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  x.pList->nExpr;.
ac10: 20 20 20 20 20 20 69 6e 74 20 69 45 70 68 20 3d        int iEph =
ac20: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b   pMWin->iEphCsr;
ac30: 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d  .      int csr =
ac40: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20   pWin->csrApp;. 
ac50: 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73       int lbl = s
ac60: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
ac70: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 6e  bel(v);.      in
ac80: 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74  t tmpReg = sqlit
ac90: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
aca0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  rse);..      if(
acb0: 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20 20 20   nArg<3 ){.     
acc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
acd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
ace0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
acf0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
ad00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
ad10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ad20: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c  OP_Column, iEph,
ad30: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32   pWin->iArgCol+2
ad40: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
ad50: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
ad60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ad70: 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
ad80: 20 69 45 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a   iEph, tmpReg);.
ad90: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
ada0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
adb0: 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e  val = (pFunc->zN
adc0: 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20  ame==leadName ? 
add0: 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  1 : -1);.       
ade0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
adf0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
ae00: 20 74 6d 70 52 65 67 2c 20 76 61 6c 29 3b 0a 20   tmpReg, val);. 
ae10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ae20: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28 70 46      int op = (pF
ae30: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
ae40: 4e 61 6d 65 20 3f 20 4f 50 5f 41 64 64 20 3a 20  Name ? OP_Add : 
ae50: 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a 20 20  OP_Subtract);.  
ae60: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67        int tmpReg
ae70: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
ae80: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
ae90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aea0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
aeb0: 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69  olumn, iEph, pWi
aec0: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d  n->iArgCol+1, tm
aed0: 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20 20 20  pReg2);.        
aee0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aef0: 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32  3(v, op, tmpReg2
af00: 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52 65 67  , tmpReg, tmpReg
af10: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
af20: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
af30: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 32  (pParse, tmpReg2
af40: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
af50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
af60: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f  Op3(v, OP_SeekRo
af70: 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74  wid, csr, lbl, t
af80: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64  mpReg);.      Vd
af90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
afa0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
afb0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
afc0: 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e  umn, csr, pWin->
afd0: 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72  iArgCol, pWin->r
afe0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
aff0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
b000: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29  lveLabel(v, lbl)
b010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
b020: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b030: 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20  arse, tmpReg);. 
b040: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
b050: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b060: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73  OP_Gosub, regGos
b070: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
b080: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
b090: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
b0a0: 65 64 20 62 79 20 77 69 6e 64 6f 77 52 65 74 75  ed by windowRetu
b0b0: 72 6e 4f 6e 65 52 6f 77 28 29 20 61 6e 64 2c 20  rnOneRow() and, 
b0c0: 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a  optionally, the.
b0d0: 2a 2a 20 78 49 6e 76 65 72 73 65 28 29 20 66 75  ** xInverse() fu
b0e0: 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  nction for each 
b0f0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2c  window function,
b100: 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   for one or more
b110: 20 72 6f 77 73 0a 2a 2a 20 66 72 6f 6d 20 74 68   rows.** from th
b120: 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72  e Window.iEphCsr
b130: 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 54 68 69   temp table. Thi
b140: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
b150: 74 65 73 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 73  tes VM code.** s
b160: 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a  imilar to:.**.**
b170: 20 20 20 77 68 69 6c 65 28 20 72 65 67 43 74 72     while( regCtr
b180: 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20 72 65 67  >0 ){.**     reg
b190: 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20 20 20 77 69  Ctr--;.**     wi
b1a0: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
b1b0: 28 29 0a 2a 2a 20 20 20 20 20 69 66 28 20 62 49  ().**     if( bI
b1c0: 6e 76 65 72 73 65 20 29 7b 0a 2a 2a 20 20 20 20  nverse ){.**    
b1d0: 20 20 20 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a     AggInverse.**
b1e0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 4e 65       }.**     Ne
b1f0: 78 74 20 28 57 69 6e 64 6f 77 2e 69 45 70 68 43  xt (Window.iEphC
b200: 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 73 74  sr).**   }.*/.st
b210: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
b220: 52 65 74 75 72 6e 52 6f 77 73 28 0a 20 20 50 61  ReturnRows(.  Pa
b230: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57  rse *pParse,.  W
b240: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20  indow *pMWin,   
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b260: 2a 20 4c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77  * List of window
b270: 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
b280: 69 6e 74 20 72 65 67 43 74 72 2c 20 20 20 20 20  int regCtr,     
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  /* Register cont
b2b0: 61 69 6e 69 6e 67 20 6e 75 6d 62 65 72 20 6f 66  aining number of
b2c0: 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 72   rows */.  int r
b2d0: 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20  egGosub,        
b2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b2f0: 67 69 73 74 65 72 20 66 6f 72 20 47 6f 73 75 62  gister for Gosub
b300: 20 61 64 64 72 47 6f 73 75 62 20 2a 2f 0a 20 20   addrGosub */.  
b310: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 2c 20 20  int addrGosub,  
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 73 75  /* Address of su
b340: 62 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20 52 65  b-routine for Re
b350: 74 75 72 6e 4f 6e 65 52 6f 77 20 2a 2f 0a 20 20  turnOneRow */.  
b360: 69 6e 74 20 72 65 67 49 6e 76 41 72 67 2c 20 20  int regInvArg,  
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65 67 69  /* Array of regi
b390: 73 74 65 72 73 20 66 6f 72 20 78 49 6e 76 65 72  sters for xInver
b3a0: 73 65 20 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74  se args */.  int
b3b0: 20 72 65 67 49 6e 76 53 69 7a 65 20 20 20 20 20   regInvSize     
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b3d0: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
b3e0: 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61 72 74  ing size of part
b3f0: 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ition */.){.  in
b400: 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65 20 2a  t addr;.  Vdbe *
b410: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
b420: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 77 69  be(pParse);.  wi
b430: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
b440: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a  rse, pMWin, 0);.
b450: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
b460: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b470: 5f 49 66 50 6f 73 2c 20 72 65 67 43 74 72 2c 20  _IfPos, regCtr, 
b480: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
b490: 6e 74 41 64 64 72 28 76 29 2b 32 20 2c 31 29 3b  ntAddr(v)+2 ,1);
b4a0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
b4b0: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
b4c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
b4d0: 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 77 69 6e  to, 0, 0);.  win
b4e0: 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28  dowReturnOneRow(
b4f0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72  pParse, pMWin, r
b500: 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
b510: 75 62 29 3b 0a 20 20 69 66 28 20 72 65 67 49 6e  ub);.  if( regIn
b520: 76 41 72 67 20 29 7b 0a 20 20 20 20 77 69 6e 64  vArg ){.    wind
b530: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
b540: 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e  , pMWin, pMWin->
b550: 69 45 70 68 43 73 72 2c 20 31 2c 20 72 65 67 49  iEphCsr, 1, regI
b560: 6e 76 41 72 67 2c 20 72 65 67 49 6e 76 53 69 7a  nvArg, regInvSiz
b570: 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
b580: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b590: 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69  P_Next, pMWin->i
b5a0: 45 70 68 43 73 72 2c 20 61 64 64 72 29 3b 0a 20  EphCsr, addr);. 
b5b0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b5c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
b5d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 2b  umpHere(v, addr+
b5e0: 31 29 3b 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f  1);   /* The OP_
b5f0: 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  Goto */.}../*.**
b600: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b610: 6f 20 73 65 74 20 74 68 65 20 61 63 63 75 6d 75  o set the accumu
b620: 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66  lator register f
b630: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
b640: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
b650: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 70 61  e linked list pa
b660: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
b670: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 4e  nd argument to N
b680: 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66 6f 72 6d  ULL. And perform
b690: 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76 61 6c 65  .** any equivale
b6a0: 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  nt initializatio
b6b0: 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 61 6e  n required by an
b6c0: 79 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  y built-in windo
b6d0: 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69  w functions.** i
b6e0: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
b6f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77  tatic int window
b700: 49 6e 69 74 41 63 63 75 6d 28 50 61 72 73 65 20  InitAccum(Parse 
b710: 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20  *pParse, Window 
b720: 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64 62 65 20  *pMWin){.  Vdbe 
b730: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
b740: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
b750: 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74  nt regArg;.  int
b760: 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 57 69 6e   nArg = 0;.  Win
b770: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72  dow *pWin;.  for
b780: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
b790: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
b7a0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e  extWin){.    Fun
b7b0: 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57  cDef *pFunc = pW
b7c0: 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 73  in->pFunc;.    s
b7d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b7e0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
b7f0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
b800: 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d 41 58 28  .    nArg = MAX(
b810: 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41 72 67 43  nArg, windowArgC
b820: 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20 20 20  ount(pWin));.   
b830: 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d   if( pFunc->zNam
b840: 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
b850: 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e  .     || pFunc->
b860: 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c  zName==first_val
b870: 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20  ueName.    ){.  
b880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b890: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
b8a0: 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ger, 0, pWin->re
b8b0: 67 41 70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  gApp);.      sql
b8c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b8d0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
b8e0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29   pWin->regApp+1)
b8f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
b900: 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61   (pFunc->funcFla
b910: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
b920: 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57 69 6e  _MINMAX) && pWin
b930: 2d 3e 63 73 72 41 70 70 20 29 7b 0a 20 20 20 20  ->csrApp ){.    
b940: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e    assert( pWin->
b950: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
b960: 4e 44 45 44 20 29 3b 0a 20 20 20 20 20 20 73 71  NDED );.      sq
b970: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
b980: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
b990: 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  r, pWin->csrApp)
b9a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b9b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b9c0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
b9d0: 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20  ->regApp+1);.   
b9e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 67 41 72 67 20   }.  }.  regArg 
b9f0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
ba00: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
ba10: 20 2b 3d 20 6e 41 72 67 3b 0a 20 20 72 65 74 75   += nArg;.  retu
ba20: 72 6e 20 72 65 67 41 72 67 3b 0a 7d 0a 0a 0a 2f  rn regArg;.}.../
ba30: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ba40: 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  on does the work
ba50: 20 6f 66 20 73 71 6c 69 74 65 33 57 69 6e 64 6f   of sqlite3Windo
ba60: 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f 72 20  wCodeStep() for 
ba70: 61 6c 6c 20 22 52 4f 57 53 22 0a 2a 2a 20 77 69  all "ROWS".** wi
ba80: 6e 64 6f 77 20 66 72 61 6d 65 20 74 79 70 65 73  ndow frame types
ba90: 20 65 78 63 65 70 74 20 66 6f 72 20 22 42 45 54   except for "BET
baa0: 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
bab0: 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
bac0: 52 45 4e 54 0a 2a 2a 20 52 4f 57 22 2e 20 50 73  RENT.** ROW". Ps
bad0: 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20 65 61  eudo-code for ea
bae0: 63 68 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a  ch follows..**.*
baf0: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
bb00: 65 78 70 72 31 3e 20 50 52 45 43 45 44 49 4e 47  expr1> PRECEDING
bb10: 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c   AND <expr2> FOL
bb20: 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  LOWING.**.**    
bb30: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66   ....**       if
bb40: 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
bb50: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f  ){.**         Go
bb60: 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74  sub flush_partit
bb70: 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ion.**       }.*
bb80: 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74 20 28  *       Insert (
bb90: 72 65 63 6f 72 64 20 69 6e 20 65 70 68 2d 74 61  record in eph-ta
bba0: 62 6c 65 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69  ble).**     sqli
bbb0: 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a  te3WhereEnd().**
bbc0: 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75 73 68       Gosub flush
bbd0: 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 0a  _partition.**  .
bbe0: 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69  **   flush_parti
bbf0: 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63  tion:.**     Onc
bc00: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65  e {.**       Ope
bc10: 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e  nDup (iEphCsr ->
bc20: 20 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20   csrStart).**   
bc30: 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70      OpenDup (iEp
bc40: 68 43 73 72 20 2d 3e 20 63 73 72 45 6e 64 29 0a  hCsr -> csrEnd).
bc50: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
bc60: 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78 70 72  regStart = <expr
bc70: 31 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1>              
bc80: 20 20 2f 2f 20 50 52 45 43 45 44 49 4e 47 20 65    // PRECEDING e
bc90: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20  xpression.**    
bca0: 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70 72 32   regEnd = <expr2
bcb0: 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
bcc0: 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20     // FOLLOWING 
bcd0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20  expression.**   
bce0: 20 20 69 66 28 20 72 65 67 53 74 61 72 74 3c 30    if( regStart<0
bcf0: 20 7c 7c 20 72 65 67 45 6e 64 3c 30 20 29 7b 20   || regEnd<0 ){ 
bd00: 65 72 72 6f 72 21 20 7d 0a 2a 2a 20 20 20 20 20  error! }.**     
bd10: 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53  Rewind (csr,csrS
bd20: 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 20  tart,csrEnd)    
bd30: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
bd40: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
bd50: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 4e  _done.**       N
bd60: 65 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20  ext(csrEnd)     
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd80: 2f 20 69 66 20 45 4f 46 20 73 6b 69 70 20 41 67  / if EOF skip Ag
bd90: 67 73 74 65 70 0a 2a 2a 20 20 20 20 20 20 20 41  gstep.**       A
bda0: 67 67 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a  ggstep (csrEnd).
bdb0: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65  **       if( (re
bdc0: 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a  gEnd--)<=0 ){.**
bdd0: 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e 61           AggFina
bde0: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
bdf0: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
be00: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20  Gosub.**        
be10: 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20   Next(csr)      
be20: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20            // if 
be30: 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70  EOF goto flush_p
be40: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a  artition_done.**
be50: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
be60: 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
be70: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 67 67  **           Agg
be80: 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61 72  Inverse (csrStar
be90: 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  t).**           
bea0: 4e 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a  Next(csrStart).*
beb0: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
bec0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73       }.**   flus
bed0: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
bee0: 3a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f  :.**     ResetSo
bef0: 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20  rter (csr).**   
bf00: 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52    Return.**.** R
bf10: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
bf20: 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20  r> PRECEDING    
bf30: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  AND CURRENT ROW.
bf40: 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20  ** ROWS BETWEEN 
bf50: 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20 20 20  CURRENT ROW     
bf60: 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46      AND <expr> F
bf70: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53  OLLOWING.** ROWS
bf80: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
bf90: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
bfa0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
bfb0: 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20  G.**.**   These 
bfc0: 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f 20 74  are similar to t
bfd0: 68 65 20 61 62 6f 76 65 2e 20 46 6f 72 20 22 43  he above. For "C
bfe0: 55 52 52 45 4e 54 20 52 4f 57 22 2c 20 69 6e 74  URRENT ROW", int
bff0: 69 61 6c 69 7a 65 20 74 68 65 0a 2a 2a 20 20 20  ialize the.**   
c000: 72 65 67 69 73 74 65 72 20 74 6f 20 30 2e 20 46  register to 0. F
c010: 6f 72 20 22 55 4e 42 4f 55 4e 44 45 44 20 50 52  or "UNBOUNDED PR
c020: 45 43 45 44 49 4e 47 22 20 74 6f 20 69 6e 66 69  ECEDING" to infi
c030: 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  nity..**.** ROWS
c040: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
c050: 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44  PRECEDING    AND
c060: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
c070: 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54  WING.** ROWS BET
c080: 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
c090: 20 20 20 20 20 20 20 20 20 41 4e 44 20 55 4e 42           AND UNB
c0a0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
c0b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e  .**.**     Rewin
c0c0: 64 20 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c  d (csr,csrStart,
c0d0: 63 73 72 45 6e 64 29 20 20 20 20 2f 2f 20 69 66  csrEnd)    // if
c0e0: 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f   EOF goto flush_
c0f0: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a  partition_done.*
c100: 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  *     while( 1 )
c110: 7b 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28  {.**       Next(
c120: 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20 20  csrEnd)         
c130: 20 20 20 20 20 20 20 20 20 2f 2f 20 45 78 69 74           // Exit
c140: 20 77 68 69 6c 65 28 31 29 20 61 74 20 45 4f 46   while(1) at EOF
c150: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73 74 65  .**       Aggste
c160: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
c170: 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65    }.**     while
c180: 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ( 1 ){.**       
c190: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
c1a0: 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62  ).**       Gosub
c1b0: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
c1c0: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
c1f0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
c200: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 69  _done.**       i
c210: 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c  f( (regStart--)<
c220: 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  =0 ){.**        
c230: 20 41 67 67 49 6e 76 65 72 73 65 20 28 63 73 72   AggInverse (csr
c240: 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20  Start).**       
c250: 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29    Next(csrStart)
c260: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
c270: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72     }.**.**   For
c280: 20 74 68 65 20 22 43 55 52 52 45 4e 54 20 52 4f   the "CURRENT RO
c290: 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
c2a0: 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 73 65 2c  FOLLOWING" case,
c2b0: 20 74 68 65 20 66 69 6e 61 6c 20 69 66 28 29 20   the final if() 
c2c0: 0a 2a 2a 20 20 20 63 6f 6e 64 69 74 69 6f 6e 20  .**   condition 
c2d0: 69 73 20 61 6c 77 61 79 73 20 74 72 75 65 20 28  is always true (
c2e0: 61 73 20 69 66 20 72 65 67 53 74 61 72 74 20 77  as if regStart w
c2f0: 65 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ere initialized 
c300: 74 6f 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e  to 0)..**.** RAN
c310: 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  GE BETWEEN CURRE
c320: 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
c330: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
c340: 2a 20 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20  * .**   This is 
c350: 74 68 65 20 6f 6e 6c 79 20 52 41 4e 47 45 20 63  the only RANGE c
c360: 61 73 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74  ase handled by t
c370: 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 49 74 20  his routine. It 
c380: 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 2a 2a 20  modifies the.** 
c390: 20 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 20    second while( 
c3a0: 31 20 29 20 6c 6f 6f 70 20 69 6e 20 22 52 4f 57  1 ) loop in "ROW
c3b0: 53 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  S BETWEEN CURREN
c3c0: 54 20 2e 2e 2e 20 55 4e 42 4f 55 4e 44 45 44 2e  T ... UNBOUNDED.
c3d0: 2e 2e 22 20 74 6f 0a 2a 2a 20 20 20 62 65 3a 0a  .." to.**   be:.
c3e0: 2a 2a 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28  **.**     while(
c3f0: 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41   1 ){.**       A
c400: 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29  ggFinal (xValue)
c410: 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
c420: 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20   1 ){.**        
c430: 20 72 65 67 50 65 65 72 2b 2b 0a 2a 2a 20 20 20   regPeer++.**   
c440: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
c450: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20  Gosub.**        
c460: 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20   Next(csr)      
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c480: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
c490: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c4a0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66  ne.**         if
c4b0: 28 20 6e 65 77 20 70 65 65 72 20 29 20 62 72 65  ( new peer ) bre
c4c0: 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  ak;.**       }.*
c4d0: 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  *       while( (
c4e0: 72 65 67 50 65 65 72 2d 2d 29 3e 30 20 29 7b 0a  regPeer--)>0 ){.
c4f0: 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 49 6e  **         AggIn
c500: 76 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29  verse (csrStart)
c510: 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74  .**         Next
c520: 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
c530: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a      }.**     }.*
c540: 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  *.** ROWS BETWEE
c550: 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  N <expr> FOLLOWI
c560: 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e  NG    AND <expr>
c570: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
c580: 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67 45     regEnd = regE
c590: 6e 64 20 2d 20 72 65 67 53 74 61 72 74 0a 2a 2a  nd - regStart.**
c5a0: 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63     Rewind (csr,c
c5b0: 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20  srStart,csrEnd) 
c5c0: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
c5d0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
c5e0: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 41 67 67  _done.**     Agg
c5f0: 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a  step (csrEnd).**
c600: 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64       Next(csrEnd
c610: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
c620: 20 20 2f 2f 20 69 66 20 45 4f 46 20 66 61 6c 6c    // if EOF fall
c630: 2d 74 68 72 6f 75 67 68 0a 2a 2a 20 20 20 20 20  -through.**     
c640: 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d  if( (regEnd--)<=
c650: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  0 ){.**       if
c660: 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
c670: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  0 ){.**         
c680: 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
c690: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73  ).**         Gos
c6a0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
c6b0: 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72          Next(csr
c6c0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
c6d0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
c6e0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c6f0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  ne.**       }.**
c700: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
c710: 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  e (csrStart).** 
c720: 20 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 53        Next (csrS
c730: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a  tart).**     }.*
c740: 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  *.** ROWS BETWEE
c750: 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49  N <expr> PRECEDI
c760: 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e  NG    AND <expr>
c770: 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a 0a 2a 2a   PRECEDING.**.**
c780: 20 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 62     Replace the b
c790: 69 74 20 61 66 74 65 72 20 22 52 65 77 69 6e 64  it after "Rewind
c7a0: 22 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 77  " in the above w
c7b0: 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69  ith:.**.**     i
c7c0: 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30  f( (regEnd--)<=0
c7d0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
c7e0: 53 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a  Step (csrEnd).**
c7f0: 20 20 20 20 20 20 20 4e 65 78 74 20 28 63 73 72         Next (csr
c800: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  End).**     }.**
c810: 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
c820: 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f  Value).**     Go
c830: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
c840: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66  // if EOF goto f
c870: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
c880: 6f 6e 65 0a 2a 2a 20 20 20 20 20 69 66 28 20 28  one.**     if( (
c890: 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29  regStart--)<=0 )
c8a0: 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 49 6e  {.**       AggIn
c8b0: 76 65 72 73 65 20 28 63 73 72 32 29 0a 2a 2a 20  verse (csr2).** 
c8c0: 20 20 20 20 20 20 4e 65 78 74 20 28 63 73 72 32        Next (csr2
c8d0: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f  ).**     }.**.*/
c8e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
c8f0: 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74  dowCodeRowExprSt
c900: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
c910: 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
c920: 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
c930: 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
c940: 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
c950: 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
c960: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
c970: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
c980: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
c990: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
c9a0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 3b 20 20   regFlushPart;  
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c9c0: 52 65 67 69 73 74 65 72 20 66 6f 72 20 22 47 6f  Register for "Go
c9d0: 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74  sub flush_partit
c9e0: 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62  ion" */.  int lb
c9f0: 6c 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  lFlushPart;     
ca00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62            /* Lab
ca10: 65 6c 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  el for "Gosub fl
ca20: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
ca30: 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  /.  int lblFlush
ca40: 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  Done;           
ca50: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
ca60: 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61   "Gosub flush_pa
ca70: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f  rtition_done" */
ca80: 0a 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a  ..  int regArg;.
ca90: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e    int addr;.  in
caa0: 74 20 63 73 72 53 74 61 72 74 20 3d 20 70 50 61  t csrStart = pPa
cab0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
cac0: 6e 74 20 63 73 72 45 6e 64 20 3d 20 70 50 61 72  nt csrEnd = pPar
cad0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e  se->nTab++;.  in
cae0: 74 20 72 65 67 53 74 61 72 74 3b 20 20 20 20 20  t regStart;     
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb00: 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
cb10: 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20  > PRECEDING */. 
cb20: 20 69 6e 74 20 72 65 67 45 6e 64 3b 20 20 20 20   int regEnd;    
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65    /* Value of <e
cb50: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a  xpr> FOLLOWING *
cb60: 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f  /.  int addrGoto
cb70: 3b 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  ;.  int addrTop;
cb80: 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50 6f 73  .  int addrIfPos
cb90: 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50  1;.  int addrIfP
cba0: 6f 73 32 3b 0a 20 20 69 6e 74 20 72 65 67 53 69  os2;.  int regSi
cbb0: 7a 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ze = 0;..  asser
cbc0: 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  t( pMWin->eStart
cbd0: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a  ==TK_PRECEDING .
cbe0: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
cbf0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
cc00: 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ENT .       || p
cc10: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
cc20: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20  _FOLLOWING .    
cc30: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
cc40: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
cc50: 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  D .  );.  assert
cc60: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
cc70: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20  K_FOLLOWING .   
cc80: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
cc90: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  nd==TK_CURRENT .
cca0: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
ccb0: 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
ccc0: 44 45 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  DED .       || p
ccd0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
cce0: 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b 0a 0a  RECEDING .  );..
ccf0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
cd00: 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c  gister and label
cd10: 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f   for the "flush_
cd20: 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72  partition" sub-r
cd30: 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67  outine. */.  reg
cd40: 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50  FlushPart = ++pP
cd50: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62  arse->nMem;.  lb
cd60: 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c  lFlushPart = sql
cd70: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
cd80: 6c 28 76 29 3b 0a 20 20 6c 62 6c 46 6c 75 73 68  l(v);.  lblFlush
cd90: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
cda0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
cdb0: 0a 20 20 72 65 67 53 74 61 72 74 20 3d 20 2b 2b  .  regStart = ++
cdc0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
cdd0: 72 65 67 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73  regEnd = ++pPars
cde0: 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64  e->nMem;..  wind
cdf0: 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68 65  owPartitionCache
ce00: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e  (pParse, p, pWIn
ce10: 66 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  fo, regFlushPart
ce20: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20  , lblFlushPart, 
ce30: 26 72 65 67 53 69 7a 65 29 3b 0a 0a 20 20 61 64  &regSize);..  ad
ce40: 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
ce50: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
ce60: 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74  _Goto);..  /* St
ce70: 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70 61  art of "flush_pa
ce80: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71  rtition" */.  sq
ce90: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
cea0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73  Label(v, lblFlus
ceb0: 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  hPart);.  sqlite
cec0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ced0: 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74  P_Once, 0, sqlit
cee0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
cef0: 72 28 76 29 2b 33 29 3b 0a 20 20 56 64 62 65 43  r(v)+3);.  VdbeC
cf00: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
cf10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cf20: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63  v, OP_OpenDup, c
cf30: 73 72 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  srStart, pMWin->
cf40: 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69  iEphCsr);.  sqli
cf50: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
cf60: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72   OP_OpenDup, csr
cf70: 45 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  End, pMWin->iEph
cf80: 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65  Csr);..  /* If e
cf90: 69 74 68 65 72 20 72 65 67 53 74 61 72 74 20 6f  ither regStart o
cfa0: 72 20 72 65 67 45 6e 64 20 61 72 65 20 6e 6f 74  r regEnd are not
cfb0: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e   non-negative in
cfc0: 74 65 67 65 72 73 2c 20 74 68 72 6f 77 20 0a 20  tegers, throw . 
cfd0: 20 2a 2a 20 61 6e 20 65 78 63 65 70 74 69 6f 6e   ** an exception
cfe0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  .  */.  if( pMWi
cff0: 6e 2d 3e 70 53 74 61 72 74 20 29 7b 0a 20 20 20  n->pStart ){.   
d000: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d010: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e  (pParse, pMWin->
d020: 70 53 74 61 72 74 2c 20 72 65 67 53 74 61 72 74  pStart, regStart
d030: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65  );.    windowChe
d040: 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73  ckIntValue(pPars
d050: 65 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b  e, regStart, 0);
d060: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e  .  }.  if( pMWin
d070: 2d 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71  ->pEnd ){.    sq
d080: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d090: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e  arse, pMWin->pEn
d0a0: 64 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20  d, regEnd);.    
d0b0: 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61  windowCheckIntVa
d0c0: 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67 45  lue(pParse, regE
d0d0: 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nd, 1);.  }..  /
d0e0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 22 52 4f  * If this is "RO
d0f0: 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f  WS <expr1> FOLLO
d100: 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c 65  WING AND ROWS <e
d110: 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22  xpr2> FOLLOWING"
d120: 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  , do:.  **.  ** 
d130: 20 20 69 66 28 20 72 65 67 45 6e 64 3c 72 65 67    if( regEnd<reg
d140: 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20 20  Start ){.  **   
d150: 20 20 2f 2f 20 54 68 65 20 66 72 61 6d 65 20 61    // The frame a
d160: 6c 77 61 79 73 20 63 6f 6e 73 69 73 74 73 20 6f  lways consists o
d170: 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20 20  f 0 rows.  **   
d180: 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65 67    regStart = reg
d190: 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20  Size;.  **   }. 
d1a0: 20 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72   **   regEnd = r
d1b0: 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74  egEnd - regStart
d1c0: 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  ;.  */.  if( pMW
d1d0: 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69  in->pEnd && pMWi
d1e0: 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57  n->pStart && pMW
d1f0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
d200: 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
d210: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
d220: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
d230: 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  G );.    sqlite3
d240: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d250: 5f 47 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73  _Ge, regStart, s
d260: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d270: 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 45  tAddr(v)+2, regE
d280: 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nd);.    VdbeCov
d290: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
d2a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
d2b0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
d2c0: 69 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  ize, regStart);.
d2d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d2e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74  ddOp3(v, OP_Subt
d2f0: 72 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20  ract, regStart, 
d300: 72 65 67 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b  regEnd, regEnd);
d310: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69  .  }..  if( pMWi
d320: 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69 6e  n->pEnd && pMWin
d330: 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57 69  ->pStart && pMWi
d340: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
d350: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73  EDING ){.    ass
d360: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61  ert( pMWin->eSta
d370: 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
d380: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
d390: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d3a0: 4c 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71  Le, regStart, sq
d3b0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
d3c0: 41 64 64 72 28 76 29 2b 33 2c 20 72 65 67 45 6e  Addr(v)+3, regEn
d3d0: 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  d);.    VdbeCove
d3e0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
d3f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d400: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69  , OP_Copy, regSi
d410: 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20  ze, regStart);. 
d420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d430: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
d440: 20 72 65 67 53 69 7a 65 2c 20 72 65 67 45 6e 64   regSize, regEnd
d450: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
d460: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 63 63 75  tialize the accu
d470: 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
d480: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
d490: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c   function to NUL
d4a0: 4c 20 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20  L */.  regArg = 
d4b0: 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28  windowInitAccum(
d4c0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a  pParse, pMWin);.
d4d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d4e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
d4f0: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
d500: 72 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29  r, lblFlushDone)
d510: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
d520: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
d530: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
d540: 65 77 69 6e 64 2c 20 63 73 72 53 74 61 72 74 2c  ewind, csrStart,
d550: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a   lblFlushDone);.
d560: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
d570: 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73  verTaken(v);.  s
d580: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
d590: 50 35 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c 69  P5(v, 1);.  sqli
d5a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d5b0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 45   OP_Rewind, csrE
d5c0: 6e 64 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65  nd, lblFlushDone
d5d0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
d5e0: 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a  eNeverTaken(v);.
d5f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
d600: 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 0a 20 20  ngeP5(v, 1);..  
d610: 2f 2a 20 49 6e 76 6f 6b 65 20 41 67 67 53 74 65  /* Invoke AggSte
d620: 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65  p function for e
d630: 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  ach window funct
d640: 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 72 6f  ion using the ro
d650: 77 20 74 68 61 74 0a 20 20 2a 2a 20 63 73 72 45  w that.  ** csrE
d660: 6e 64 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  nd currently poi
d670: 6e 74 73 20 74 6f 2e 20 4f 72 2c 20 69 66 20 63  nts to. Or, if c
d680: 73 72 45 6e 64 20 69 73 20 61 6c 72 65 61 64 79  srEnd is already
d690: 20 61 74 20 45 4f 46 2c 0a 20 20 2a 2a 20 64 6f   at EOF,.  ** do
d6a0: 20 6e 6f 74 68 69 6e 67 2e 20 20 2a 2f 0a 20 20   nothing.  */.  
d6b0: 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
d6c0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
d6d0: 28 76 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e  (v);.  if( pMWin
d6e0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
d6f0: 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72  DING ){.    addr
d700: 49 66 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33  IfPos1 = sqlite3
d710: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d720: 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20  _IfPos, regEnd, 
d730: 30 20 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  0 , 1);.    Vdbe
d740: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
d750: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d760: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
d770: 20 63 73 72 45 6e 64 2c 20 73 71 6c 69 74 65 33   csrEnd, sqlite3
d780: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d790: 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76  v)+2);.  VdbeCov
d7a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 61 64 64 72  erage(v);.  addr
d7b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d7c0: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
d7d0: 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65  ;.  windowAggSte
d7e0: 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  p(pParse, pMWin,
d7f0: 20 63 73 72 45 6e 64 2c 20 30 2c 20 72 65 67 41   csrEnd, 0, regA
d800: 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20  rg, regSize);.  
d810: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
d820: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b  =TK_UNBOUNDED ){
d830: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d840: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
d850: 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  o, 0, addrTop);.
d860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
d870: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
d880: 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  ;.    addrTop = 
d890: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d8a0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 65 6c  ntAddr(v);.  }el
d8b0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
d8c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d8d0: 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  ddr);.    if( pM
d8e0: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52  Win->eEnd==TK_PR
d8f0: 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20  ECEDING ){.     
d900: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
d910: 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 50 6f  Here(v, addrIfPo
d920: 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  s1);.    }.  }..
d930: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
d940: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
d950: 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73  ){.    addrIfPos
d960: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
d970: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp3(v, OP_IfPo
d980: 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31  s, regEnd, 0 , 1
d990: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
d9a0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66  age(v);.  }.  if
d9b0: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
d9c0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
d9d0: 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 32 20  .    addrIfPos2 
d9e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d9f0: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
da00: 20 72 65 67 53 74 61 72 74 2c 20 30 20 2c 20 31   regStart, 0 , 1
da10: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
da20: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 77 69  age(v);.  }.  wi
da30: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
da40: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a  rse, pMWin, 0);.
da50: 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e    windowReturnOn
da60: 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57  eRow(pParse, pMW
da70: 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  in, regGosub, ad
da80: 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69  drGosub);.  sqli
da90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
daa0: 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d   OP_Next, pMWin-
dab0: 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65  >iEphCsr, sqlite
dac0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
dad0: 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f  (v)+2);.  VdbeCo
dae0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
daf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
db00: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62  , OP_Goto, 0, lb
db10: 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 69  lFlushDone);.  i
db20: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
db30: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
db40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
db50: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
db60: 72 49 66 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a 20  rIfPos2);.  }.. 
db70: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
db80: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  rt==TK_CURRENT .
db90: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
dba0: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
dbb0: 47 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e  G .   || pMWin->
dbc0: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
dbd0: 57 49 4e 47 20 0a 20 20 29 7b 0a 20 20 20 20 69  WING .  ){.    i
dbe0: 6e 74 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73  nt lblSkipInvers
dbf0: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
dc00: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 3b 0a 20 20  akeLabel(v);;.  
dc10: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
dc20: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
dc30: 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  G ){.      sqlit
dc40: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
dc50: 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61  OP_IfPos, regSta
dc60: 72 74 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72  rt, lblSkipInver
dc70: 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64  se, 1);.      Vd
dc80: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
dc90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d 57     }.    if( pMW
dca0: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46  in->eStart==TK_F
dcb0: 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20  OLLOWING ){.    
dcc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
dcd0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
dce0: 63 73 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65  csrStart, sqlite
dcf0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
dd00: 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  (v)+2);.      Vd
dd10: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
dd20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dd30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
dd40: 6f 2c 20 30 2c 20 6c 62 6c 53 6b 69 70 49 6e 76  o, 0, lblSkipInv
dd50: 65 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  erse);.    }else
dd60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
dd70: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dd80: 4e 65 78 74 2c 20 63 73 72 53 74 61 72 74 2c 20  Next, csrStart, 
dd90: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
dda0: 6e 74 41 64 64 72 28 76 29 2b 31 29 3b 0a 20 20  ntAddr(v)+1);.  
ddb0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ddc0: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  (v);.    }.    w
ddd0: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
dde0: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 53  rse, pMWin, csrS
ddf0: 74 61 72 74 2c 20 31 2c 20 72 65 67 41 72 67 2c  tart, 1, regArg,
de00: 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 73   regSize);.    s
de10: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
de20: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 53 6b 69  eLabel(v, lblSki
de30: 70 49 6e 76 65 72 73 65 29 3b 0a 20 20 7d 0a 20  pInverse);.  }. 
de40: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
de50: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
de60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
de70: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
de80: 72 49 66 50 6f 73 31 29 3b 0a 20 20 7d 0a 20 20  rIfPos1);.  }.  
de90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dea0: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
deb0: 20 61 64 64 72 54 6f 70 29 3b 0a 0a 20 20 2f 2a   addrTop);..  /*
dec0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
ded0: 5f 64 6f 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c 69  _done: */.  sqli
dee0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
def0: 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 44  bel(v, lblFlushD
df00: 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  one);.  sqlite3V
df10: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
df20: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57  ResetSorter, pMW
df30: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
df40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
df50: 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
df60: 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a  regFlushPart);..
df70: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
df80: 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66  e to skip over f
df90: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a  lush_partition *
dfa0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
dfb0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
dfc0: 6f 74 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  oto);.}../*.** T
dfd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
dfe0: 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 71  s the work of sq
dff0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
e000: 74 65 70 28 29 20 66 6f 72 20 63 61 73 65 73 20  tep() for cases 
e010: 74 68 61 74 0a 2a 2a 20 77 6f 75 6c 64 20 6e 6f  that.** would no
e020: 72 6d 61 6c 6c 79 20 62 65 20 68 61 6e 64 6c 65  rmally be handle
e030: 64 20 62 79 20 77 69 6e 64 6f 77 43 6f 64 65 44  d by windowCodeD
e040: 65 66 61 75 6c 74 53 74 65 70 28 29 20 77 68 65  efaultStep() whe
e050: 6e 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  n there are.** o
e060: 6e 65 20 6f 72 20 6d 6f 72 65 20 62 75 69 6c 74  ne or more built
e070: 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  -in window-funct
e080: 69 6f 6e 73 20 74 68 61 74 20 72 65 71 75 69 72  ions that requir
e090: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72  e the entire par
e0a0: 74 69 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  tition.** to be 
e0b0: 63 61 63 68 65 64 20 69 6e 20 61 20 74 65 6d 70  cached in a temp
e0c0: 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 61 6e   table before an
e0d0: 79 20 72 6f 77 73 20 63 61 6e 20 62 65 20 72 65  y rows can be re
e0e0: 74 75 72 6e 65 64 2e 20 41 64 64 69 74 69 6f 6e  turned. Addition
e0f0: 61 6c 6c 79 2e 0a 2a 2a 20 22 52 41 4e 47 45 20  ally..** "RANGE 
e100: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
e110: 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
e120: 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 69 73 20  D FOLLOWING" is 
e130: 61 6c 77 61 79 73 20 68 61 6e 64 6c 65 64 20 62  always handled b
e140: 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  y.** this functi
e150: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 73 65 75 64 6f  on..**.** Pseudo
e160: 2d 63 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e 64  -code correspond
e170: 69 6e 67 20 74 6f 20 74 68 65 20 56 4d 20 63 6f  ing to the VM co
e180: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
e190: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
e1a0: 20 66 6f 72 20 65 61 63 68 20 74 79 70 65 20 6f   for each type o
e1b0: 66 20 77 69 6e 64 6f 77 20 66 6f 6c 6c 6f 77 73  f window follows
e1c0: 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45  ..**.** RANGE BE
e1d0: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
e1e0: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
e1f0: 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20  RRENT ROW.**.** 
e200: 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f    flush_partitio
e210: 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b  n:.**     Once {
e220: 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75  .**       OpenDu
e230: 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73  p (iEphCsr -> cs
e240: 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a  rLead).**     }.
e250: 2a 2a 20 20 20 20 20 49 6e 74 65 67 65 72 20 63  **     Integer c
e260: 74 72 20 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65  tr 0.**     fore
e270: 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64  ach row (csrLead
e280: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
e290: 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20  new peer ){.**  
e2a0: 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20         AggFinal 
e2b0: 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20  (xValue).**     
e2c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63      for(i=0; i<c
e2d0: 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20  tr; i++){.**    
e2e0: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
e2f0: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
e300: 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72      Next iEphCsr
e310: 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
e320: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
e330: 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 20 20   ctr 0.**       
e340: 7d 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74  }.**       AggSt
e350: 65 70 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20  ep (csrLead).** 
e360: 20 20 20 20 20 20 49 6e 63 72 20 63 74 72 0a 2a        Incr ctr.*
e370: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20  *     }.**.**   
e380: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e    AggFinal (xFin
e390: 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f  alize).**     fo
e3a0: 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b  r(i=0; i<ctr; i+
e3b0: 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  +){.**       Gos
e3c0: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
e3d0: 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43        Next iEphC
e3e0: 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a  sr.**     }.**.*
e3f0: 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65  *     ResetSorte
e400: 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52  r (csr).**     R
e410: 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  eturn.**.** ROWS
e420: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
e430: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
e440: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a   CURRENT ROW.**.
e450: 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65  **   As above, e
e460: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 22  xcept that the "
e470: 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 22 20  if( new peer )" 
e480: 62 72 61 6e 63 68 20 69 73 20 61 6c 77 61 79 73  branch is always
e490: 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41   taken..**.** RA
e4a0: 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52  NGE BETWEEN CURR
e4b0: 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52  ENT ROW AND CURR
e4c0: 45 4e 54 20 52 4f 57 20 0a 2a 2a 0a 2a 2a 20 20  ENT ROW .**.**  
e4d0: 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   As above, excep
e4e0: 74 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74  t that each of t
e4f0: 68 65 20 66 6f 72 28 29 20 6c 6f 6f 70 73 20 62  he for() loops b
e500: 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ecomes:.**.**   
e510: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e520: 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20  <ctr; i++){.**  
e530: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
e540: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
e550: 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65        AggInverse
e560: 20 28 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20   (iEphCsr).**   
e570: 20 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70          Next iEp
e580: 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  hCsr.**         
e590: 7d 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45  }.**.** RANGE BE
e5a0: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
e5b0: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e  PRECEDING AND UN
e5c0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
e5d0: 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f  G.**.**   flush_
e5e0: 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20  partition:.**   
e5f0: 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20    Once {.**     
e600: 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43    OpenDup (iEphC
e610: 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a  sr -> csrLead).*
e620: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66  *     }.**     f
e630: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
e640: 65 61 64 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20  ead) {.**       
e650: 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64  AggStep (csrLead
e660: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
e670: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 69    foreach row (i
e680: 45 70 68 43 73 72 29 20 7b 0a 2a 2a 20 20 20 20  EphCsr) {.**    
e690: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
e6a0: 75 62 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 0a  ub.**     }.** .
e6b0: 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e  ** RANGE BETWEEN
e6c0: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44   CURRENT ROW AND
e6d0: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
e6e0: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75  WING.**.**   flu
e6f0: 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a  sh_partition:.**
e700: 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20       Once {.**  
e710: 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45       OpenDup (iE
e720: 70 68 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64  phCsr -> csrLead
e730: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
e740: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63    foreach row (c
e750: 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20  srLead){.**     
e760: 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65    AggStep (csrLe
e770: 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ad).**     }.** 
e780: 20 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 4c      Rewind (csrL
e790: 65 61 64 29 0a 2a 2a 20 20 20 20 20 49 6e 74 65  ead).**     Inte
e7a0: 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20  ger ctr 0.**    
e7b0: 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73   foreach row (cs
e7c0: 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20  rLead){.**      
e7d0: 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b   if( new peer ){
e7e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46  .**         AggF
e7f0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
e800: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
e810: 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a  ; i<ctr; i++){.*
e820: 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  *           Gosu
e830: 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
e840: 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76 65           AggInve
e850: 72 73 65 20 28 69 45 70 68 43 73 72 29 0a 2a 2a  rse (iEphCsr).**
e860: 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 20             Next 
e870: 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20  iEphCsr.**      
e880: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
e890: 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a  Integer ctr 0.**
e8a0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
e8b0: 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20    Incr ctr.**   
e8c0: 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67    }.**.**     Ag
e8d0: 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a  gFinal (xFinaliz
e8e0: 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d  e).**     for(i=
e8f0: 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a  0; i<ctr; i++){.
e900: 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61  **       Gosub a
e910: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
e920: 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a    Next iEphCsr.*
e930: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20  *     }.**.**   
e940: 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 28 63    ResetSorter (c
e950: 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75 72  sr).**     Retur
e960: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
e970: 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68 65   windowCodeCache
e980: 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
e990: 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74  Parse, .  Select
e9a0: 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f   *p,.  WhereInfo
e9b0: 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20   *pWInfo,.  int 
e9c0: 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74  regGosub, .  int
e9d0: 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20   addrGosub.){.  
e9e0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
e9f0: 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20  p->pWin;.  Vdbe 
ea00: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
ea10: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
ea20: 6e 74 20 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72  nt k;.  int addr
ea30: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50  ;.  ExprList *pP
ea40: 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61  art = pMWin->pPa
ea50: 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c  rtition;.  ExprL
ea60: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
ea70: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b  pMWin->pOrderBy;
ea80: 0a 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 70  .  int nPeer = p
ea90: 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72  OrderBy ? pOrder
eaa0: 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  By->nExpr : 0;. 
eab0: 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 3b   int regNewPeer;
eac0: 0a 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f  ..  int addrGoto
ead0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
eae0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
eaf0: 66 20 47 6f 74 6f 20 75 73 65 64 20 74 6f 20 6a  f Goto used to j
eb00: 75 6d 70 20 66 6c 75 73 68 5f 70 61 72 2e 2e 20  ump flush_par.. 
eb10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78  */.  int addrNex
eb20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
eb30: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
eb40: 65 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61  e for next itera
eb50: 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a  tion of loop */.
eb60: 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61    int regFlushPa
eb70: 72 74 3b 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75  rt;.  int lblFlu
eb80: 73 68 50 61 72 74 3b 0a 20 20 69 6e 74 20 63 73  shPart;.  int cs
eb90: 72 4c 65 61 64 3b 0a 20 20 69 6e 74 20 72 65 67  rLead;.  int reg
eba0: 43 74 72 3b 0a 20 20 69 6e 74 20 72 65 67 41 72  Ctr;.  int regAr
ebb0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
ebc0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
ebd0: 65 72 20 61 72 72 61 79 20 74 6f 20 6d 61 72 74  er array to mart
ebe0: 69 61 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  ial function arg
ebf0: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 69  s */.  int regSi
ec00: 7a 65 3b 0a 20 20 69 6e 74 20 6c 62 6c 45 6d 70  ze;.  int lblEmp
ec10: 74 79 3b 0a 20 20 69 6e 74 20 62 52 65 76 65 72  ty;.  int bRever
ec20: 73 65 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  se = pMWin->pOrd
ec30: 65 72 42 79 20 26 26 20 70 4d 57 69 6e 2d 3e 65  erBy && pMWin->e
ec40: 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
ec50: 54 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  T .          && 
ec60: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
ec70: 55 4e 42 4f 55 4e 44 45 44 3b 0a 0a 20 20 61 73  UNBOUNDED;..  as
ec80: 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53  sert( (pMWin->eS
ec90: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
eca0: 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e  ED && pMWin->eEn
ecb0: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a  d==TK_CURRENT) .
ecc0: 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e         || (pMWin
ecd0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
ece0: 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d  OUNDED && pMWin-
ecf0: 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
ed00: 44 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  DED) .       || 
ed10: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
ed20: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
ed30: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
ed40: 52 52 45 4e 54 29 20 0a 20 20 20 20 20 20 20 7c  RRENT) .       |
ed50: 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  | (pMWin->eStart
ed60: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20  ==TK_CURRENT && 
ed70: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
ed80: 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20 20 29 3b  UNBOUNDED) .  );
ed90: 0a 0a 20 20 6c 62 6c 45 6d 70 74 79 20 3d 20 73  ..  lblEmpty = s
eda0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
edb0: 62 65 6c 28 76 29 3b 0a 20 20 72 65 67 4e 65 77  bel(v);.  regNew
edc0: 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Peer = pParse->n
edd0: 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d  Mem+1;.  pParse-
ede0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a  >nMem += nPeer;.
edf0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72  .  /* Allocate r
ee00: 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65  egister and labe
ee10: 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68  l for the "flush
ee20: 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d  _partition" sub-
ee30: 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65  routine. */.  re
ee40: 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70  gFlushPart = ++p
ee50: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c  Parse->nMem;.  l
ee60: 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71  blFlushPart = sq
ee70: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ee80: 65 6c 28 76 29 3b 0a 0a 20 20 63 73 72 4c 65 61  el(v);..  csrLea
ee90: 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  d = pParse->nTab
eea0: 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20 3d 20 2b  ++;.  regCtr = +
eeb0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
eec0: 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f    windowPartitio
eed0: 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70  nCache(pParse, p
eee0: 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75  , pWInfo, regFlu
eef0: 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68  shPart, lblFlush
ef00: 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29 3b  Part, &regSize);
ef10: 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71  .  addrGoto = sq
ef20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
ef30: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20  v, OP_Goto);..  
ef40: 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c 75  /* Start of "flu
ef50: 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f  sh_partition" */
ef60: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
ef70: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
ef80: 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 73  lFlushPart);.  s
ef90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
efa0: 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20  (v, OP_Once, 0, 
efb0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
efc0: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
efd0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
efe0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
eff0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
f000: 75 70 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d 57  up, csrLead, pMW
f010: 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20  in->iEphCsr);.. 
f020: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
f030: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
f040: 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68  egister for each
f050: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
f060: 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65   to NULL */.  re
f070: 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69  gArg = windowIni
f080: 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70  tAccum(pParse, p
f090: 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65  MWin);..  sqlite
f0a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f0b0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
f0c0: 67 43 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  gCtr);.  sqlite3
f0d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
f0e0: 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61 64  _Rewind, csrLead
f0f0: 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56  , lblEmpty);.  V
f100: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
f110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f120: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
f130: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
f140: 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56  , lblEmpty);.  V
f150: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
f160: 54 61 6b 65 6e 28 76 29 3b 0a 0a 20 20 69 66 28  Taken(v);..  if(
f170: 20 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20 20   bReverse ){.   
f180: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
f190: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f1a0: 64 72 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f  dr(v);.    windo
f1b0: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
f1c0: 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c   pMWin, csrLead,
f1d0: 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53   0, regArg, regS
f1e0: 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ize);.    sqlite
f1f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f200: 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61 64 2c  P_Next, csrLead,
f210: 20 61 64 64 72 29 3b 0a 20 20 20 20 56 64 62 65   addr);.    Vdbe
f220: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
f230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f240: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
f250: 20 63 73 72 4c 65 61 64 2c 20 6c 62 6c 45 6d 70   csrLead, lblEmp
f260: 74 79 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ty);.    VdbeCov
f270: 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28  erageNeverTaken(
f280: 76 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 4e 65  v);.  }.  addrNe
f290: 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
f2a0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
f2b0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
f2c0: 26 26 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  && (pMWin->eEnd=
f2d0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 70  =TK_CURRENT || p
f2e0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f2f0: 5f 43 55 52 52 45 4e 54 29 20 29 7b 0a 20 20 20  _CURRENT) ){.   
f300: 20 69 6e 74 20 62 43 75 72 72 65 6e 74 20 3d 20   int bCurrent = 
f310: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
f320: 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20 20  TK_CURRENT);.   
f330: 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20   int addrJump = 
f340: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
f350: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
f360: 4a 75 6d 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  Jump below */.  
f370: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79    if( pMWin->eTy
f380: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a  pe==TK_RANGE ){.
f390: 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
f3a0: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
f3b0: 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50  ol + (pPart ? pP
f3c0: 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  art->nExpr : 0);
f3d0: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 65  .      int regPe
f3e0: 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50  er = pMWin->regP
f3f0: 61 72 74 20 2b 20 28 70 50 61 72 74 20 3f 20 70  art + (pPart ? p
f400: 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  Part->nExpr : 0)
f410: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
f420: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
f430: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
f440: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
f450: 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a  OrderBy, 0, 0);.
f460: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
f470: 3c 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20  <nPeer; k++){.  
f480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f490: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
f4a0: 6c 75 6d 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69  lumn, csrLead, i
f4b0: 4f 66 66 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65  Off+k, regNewPee
f4c0: 72 2b 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r+k);.      }.  
f4d0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f4e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
f4f0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e  OP_Compare, regN
f500: 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c  ewPeer, regPeer,
f510: 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73   nPeer);.      s
f520: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
f530: 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65  P4(v, (void*)pKe
f540: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
f550: 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75  O);.      addrJu
f560: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
f570: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
f580: 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64  p, addr+2, 0, ad
f590: 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  dr+2);.      Vdb
f5a0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f5b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f5c0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
f5d0: 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65  , regNewPeer, re
f5e0: 67 50 65 65 72 2c 20 6e 50 65 65 72 2d 31 29 3b  gPeer, nPeer-1);
f5f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 69 6e 64  .    }..    wind
f600: 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 70 50 61  owReturnRows(pPa
f610: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43  rse, pMWin, regC
f620: 74 72 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  tr, regGosub, ad
f630: 64 72 47 6f 73 75 62 2c 20 0a 20 20 20 20 20 20  drGosub, .      
f640: 20 20 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65    (bCurrent ? re
f650: 67 41 72 67 20 3a 20 30 29 2c 20 28 62 43 75 72  gArg : 0), (bCur
f660: 72 65 6e 74 20 3f 20 72 65 67 53 69 7a 65 20 3a  rent ? regSize :
f670: 20 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   0).    );.    i
f680: 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71  f( addrJump ) sq
f690: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
f6a0: 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a  e(v, addrJump);.
f6b0: 20 20 7d 0a 0a 20 20 69 66 28 20 62 52 65 76 65    }..  if( bReve
f6c0: 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69  rse==0 ){.    wi
f6d0: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
f6e0: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65  se, pMWin, csrLe
f6f0: 61 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72  ad, 0, regArg, r
f700: 65 67 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73  egSize);.  }.  s
f710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f720: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72  (v, OP_AddImm, r
f730: 65 67 43 74 72 2c 20 31 29 3b 0a 20 20 73 71 6c  egCtr, 1);.  sql
f740: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f750: 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65  , OP_Next, csrLe
f760: 61 64 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  ad, addrNext);. 
f770: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f780: 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72  ;..  windowRetur
f790: 6e 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d  nRows(pParse, pM
f7a0: 57 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67  Win, regCtr, reg
f7b0: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
f7c0: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73 71 6c 69  , 0, 0);..  sqli
f7d0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f7e0: 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70 74 79 29  bel(v, lblEmpty)
f7f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f800: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
f810: 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e  tSorter, pMWin->
f820: 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69  iEphCsr);.  sqli
f830: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f840: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46   OP_Return, regF
f850: 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a  lushPart);..  /*
f860: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f   Jump to here to
f870: 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68   skip over flush
f880: 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20  _partition */.  
f890: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
f8a0: 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29  ere(v, addrGoto)
f8b0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47  ;.}.../*.** RANG
f8c0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
f8d0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
f8e0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
f8f0: 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20  .**   ....**    
f900: 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
f910: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  on ){.**       A
f920: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
f930: 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  ze).**       Gos
f940: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
f950: 20 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65        ResetSorte
f960: 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20  r eph-table.**  
f970: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65 6c 73 65     }.**     else
f980: 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b   if( new peer ){
f990: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e  .**       AggFin
f9a0: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
f9b0: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
f9c0: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65  osub.**       Re
f9d0: 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61  setSorter eph-ta
f9e0: 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ble.**     }.** 
f9f0: 20 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20      AggStep.**  
fa00: 20 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72     Insert (recor
fa10: 64 20 69 6e 74 6f 20 65 70 68 2d 74 61 62 6c 65  d into eph-table
fa20: 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 68  ).**   sqlite3Wh
fa30: 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 41 67  ereEnd().**   Ag
fa40: 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a  gFinal (xFinaliz
fa50: 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20 61 64  e).**   Gosub ad
fa60: 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52 41  drGosub.**.** RA
fa70: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
fa80: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
fa90: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
faa0: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
fab0: 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  As above, except
fac0: 20 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e 20   take no action 
fad0: 66 6f 72 20 61 20 22 6e 65 77 20 70 65 65 72 22  for a "new peer"
fae0: 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74 68  . Invoke.**   th
faf0: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f 6e  e sub-routine on
fb00: 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63 68  ce only for each
fb10: 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a   partition..**.*
fb20: 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
fb30: 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
fb40: 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a  CURRENT ROW.**.*
fb50: 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78  *   As above, ex
fb60: 63 65 70 74 20 74 68 61 74 20 74 68 65 20 22 6e  cept that the "n
fb70: 65 77 20 70 65 65 72 22 20 63 6f 6e 64 69 74 69  ew peer" conditi
fb80: 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  on is handled in
fb90: 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20 77   the.**   same w
fba0: 61 79 20 61 73 20 22 6e 65 77 20 70 61 72 74 69  ay as "new parti
fbb0: 74 69 6f 6e 22 20 28 73 6f 20 74 68 65 72 65 20  tion" (so there 
fbc0: 69 73 20 6e 6f 20 22 65 6c 73 65 20 69 66 22 20  is no "else if" 
fbd0: 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52 4f  block)..**.** RO
fbe0: 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  WS BETWEEN UNBOU
fbf0: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
fc00: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
fc10: 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  * .**   As above
fc20: 2c 20 65 78 63 65 70 74 20 61 73 73 75 6d 65 20  , except assume 
fc30: 65 76 65 72 79 20 72 6f 77 20 69 73 20 61 20 22  every row is a "
fc40: 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f 0a 73 74  new peer"..*/.st
fc50: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
fc60: 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
fc70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
fc80: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
fc90: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
fca0: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
fcb0: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
fcc0: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
fcd0: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
fce0: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
fcf0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
fd00: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b  Parse);.  int k;
fd10: 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d  .  int iSubCsr =
fd20: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69   p->pSrc->a[0].i
fd30: 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53  Cursor;.  int nS
fd40: 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
fd50: 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  0].pTab->nCol;. 
fd60: 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73   int reg = pPars
fd70: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74  e->nMem+1;.  int
fd80: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67   regRecord = reg
fd90: 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67  +nSub;.  int reg
fda0: 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72  Rowid = regRecor
fdb0: 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  d+1;.  int addr;
fdc0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61  .  ExprList *pPa
fdd0: 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
fde0: 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69  tition;.  ExprLi
fdf0: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
fe00: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  MWin->pOrderBy;.
fe10: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e  .  assert( pMWin
fe20: 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
fe30: 45 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 4d 57  E .      || (pMW
fe40: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55  in->eStart==TK_U
fe50: 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69  NBOUNDED && pMWi
fe60: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
fe70: 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73  ENT).  );..  ass
fe80: 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74  ert( (pMWin->eSt
fe90: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
fea0: 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
feb0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20  ==TK_CURRENT).  
fec0: 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e       || (pMWin->
fed0: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
fee0: 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
fef0: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
ff00: 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  D).       || (pM
ff10: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
ff20: 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
ff30: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
ff40: 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  NT).       || (p
ff50: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
ff60: 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69  _CURRENT && pMWi
ff70: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
ff80: 55 4e 44 45 44 20 26 26 20 21 70 4f 72 64 65 72  UNDED && !pOrder
ff90: 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  By).  );..  if( 
ffa0: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
ffb0: 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
ffc0: 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
ffd0: 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   }..  pParse->nM
ffe0: 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a  em += nSub + 2;.
fff0: 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68  .  /* Martial th
10000 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  e row returned b
10010 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  y the sub-select
10020 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
10030 66 20 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  f .  ** register
10040 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  s. */.  for(k=0;
10050 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20   k<nSub; k++){. 
10060 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10070 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
10080 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72  n, iSubCsr, k, r
10090 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eg+k);.  }..  /*
100a0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
100b0 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
100c0 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 6f   new partition o
100d0 72 20 70 65 65 72 20 67 72 6f 75 70 2e 20 2a 2f  r peer group. */
100e0 0a 20 20 69 66 28 20 70 50 61 72 74 20 7c 7c 20  .  if( pPart || 
100f0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
10100 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 50 61  int nPart = (pPa
10110 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt ? pPart->nExp
10120 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  r : 0);.    int 
10130 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20  addrGoto = 0;.  
10140 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d    int addrJump =
10150 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65 65   0;.    int nPee
10160 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20  r = (pOrderBy ? 
10170 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
10180 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  : 0);..    if( p
10190 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  Part ){.      in
101a0 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20 72  t regNewPart = r
101b0 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  eg + pMWin->nBuf
101c0 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20 4b 65  ferCol;.      Ke
101d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
101e0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
101f0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
10200 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30  rse, pPart, 0, 0
10210 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
10220 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10230 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
10240 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57   regNewPart, pMW
10250 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72  in->regPart,nPar
10260 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10270 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
10280 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
10290 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
102a0 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20       addrJump = 
102b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
102c0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
102d0 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29  dr+2, 0, addr+2)
102e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
102f0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 77  rage(v);.      w
10300 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
10310 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29 3b  arse, pMWin, 1);
10320 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
10330 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rBy ){.        a
10340 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  ddrGoto = sqlite
10350 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10360 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 7d  P_Goto);.      }
10370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
10380 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
10390 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72    int regNewPeer
103a0 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e   = reg + pMWin->
103b0 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 6e 50 61  nBufferCol + nPa
103c0 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  rt;.      int re
103d0 67 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72  gPeer = pMWin->r
103e0 65 67 50 61 72 74 20 2b 20 6e 50 61 72 74 3b 0a  egPart + nPart;.
103f0 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4a  .      if( addrJ
10400 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62  ump ) sqlite3Vdb
10410 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10420 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 69 66  rJump);.      if
10430 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d  ( pMWin->eType==
10440 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  TK_RANGE ){.    
10450 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
10460 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
10470 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
10480 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
10490 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rBy, 0, 0);.    
104a0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
104b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
104c0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e  OP_Compare, regN
104d0 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c  ewPeer, regPeer,
104e0 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 20   nPeer);.       
104f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
10500 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70  ndP4(v, (void*)p
10510 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
10520 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 61 64  NFO);.        ad
10530 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33  drJump = sqlite3
10540 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10550 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30  _Jump, addr+2, 0
10560 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20  , addr+2);.     
10570 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
10580 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
10590 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d  .        addrJum
105a0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 0;.      }. 
105b0 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69       windowAggFi
105c0 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
105d0 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  n, pMWin->eStart
105e0 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20  ==TK_CURRENT);. 
105f0 20 20 20 20 20 69 66 28 20 61 64 64 72 47 6f 74       if( addrGot
10600 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  o ) sqlite3VdbeJ
10610 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
10620 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  oto);.    }..   
10630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10640 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
10650 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
10660 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10670 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
10680 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
10690 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
106a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
106b0 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20  osub, regGosub, 
106c0 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20  addrGosub);.    
106d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
106e0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d  2(v, OP_Next, pM
106f0 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71  Win->iEphCsr, sq
10700 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10710 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 20 20  Addr(v)-1);.    
10720 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10730 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
10740 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
10750 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e  setSorter, pMWin
10760 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
10770 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10780 33 28 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50  3(.        v, OP
10790 5f 43 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e  _Copy, reg+pMWin
107a0 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d  ->nBufferCol, pM
107b0 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50  Win->regPart, nP
107c0 61 72 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20  art+nPeer-1.    
107d0 29 3b 0a 0a 20 20 20 20 69 66 28 20 61 64 64 72  );..    if( addr
107e0 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64  Jump ) sqlite3Vd
107f0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10800 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20  drJump);.  }..  
10810 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66  /* Invoke step f
10820 75 6e 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64  unction for wind
10830 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ow functions */.
10840 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
10850 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 2d  pParse, pMWin, -
10860 31 2c 20 30 2c 20 72 65 67 2c 20 30 29 3b 0a 0a  1, 0, reg, 0);..
10870 20 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20    /* Buffer the 
10880 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74  current row in t
10890 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
108a0 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  le. */.  if( pMW
108b0 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30  in->nBufferCol>0
108c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
108d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
108e0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c  MakeRecord, reg,
108f0 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
10900 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
10910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
10920 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10930 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65  , OP_Blob, 0, re
10940 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71  gRecord);.    sq
10950 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
10960 34 28 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20  4(v, (void*)"", 
10970 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
10980 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10990 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69  P_NewRowid, pMWi
109a0 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
109b0 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
109c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
109d0 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e  _Insert, pMWin->
109e0 69 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f  iEphCsr, regReco
109f0 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  rd, regRowid);..
10a00 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
10a10 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
10a20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
10a30 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
10a40 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
10a50 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
10a60 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
10a70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
10a80 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  wind, pMWin->iEp
10a90 68 43 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65  hCsr,sqlite3Vdbe
10aa0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
10ab0 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
10ac0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
10ad0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10ae0 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c  Gosub, regGosub,
10af0 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73   addrGosub);.  s
10b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10b10 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57  (v, OP_Next, pMW
10b20 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c  in->iEphCsr, sql
10b30 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10b40 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 56 64 62  ddr(v)-1);.  Vdb
10b50 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 7d 0a  eCoverage(v);.}.
10b60 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
10b70 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70  and return a dup
10b80 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69  licate of the Wi
10b90 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69  ndow object indi
10ba0 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  cated by the.** 
10bb0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20  third argument. 
10bc0 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70  Set the Window.p
10bd0 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74  Owner field of t
10be0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f  he new object to
10bf0 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57  .** pOwner..*/.W
10c00 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
10c10 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20  ndowDup(sqlite3 
10c20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65  *db, Expr *pOwne
10c30 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  r, Window *p){. 
10c40 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20   Window *pNew = 
10c50 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  0;.  if( p ){.  
10c60 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
10c70 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
10c80 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29   sizeof(Window))
10c90 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
10ca0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e  {.      pNew->zN
10cb0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
10cc0 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61  trDup(db, p->zNa
10cd0 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  me);.      pNew-
10ce0 3e 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  >pFilter = sqlit
10cf0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
10d00 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20  >pFilter, 0);.  
10d10 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 74 69      pNew->pParti
10d20 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  tion = sqlite3Ex
10d30 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
10d40 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b  >pPartition, 0);
10d50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72  .      pNew->pOr
10d60 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
10d70 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
10d80 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a  ->pOrderBy, 0);.
10d90 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 54 79 70        pNew->eTyp
10da0 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20  e = p->eType;.  
10db0 20 20 20 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d      pNew->eEnd =
10dc0 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20   p->eEnd;.      
10dd0 70 4e 65 77 2d 3e 65 53 74 61 72 74 20 3d 20 70  pNew->eStart = p
10de0 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20  ->eStart;.      
10df0 70 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73  pNew->pStart = s
10e00 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
10e10 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b  , p->pStart, 0);
10e20 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e  .      pNew->pEn
10e30 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  d = sqlite3ExprD
10e40 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20  up(db, p->pEnd, 
10e50 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  0);.      pNew->
10e60 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b  pOwner = pOwner;
10e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10e80 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
10e90 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79  ** Return a copy
10ea0 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
10eb0 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
10ec0 6a 65 63 74 73 20 70 61 73 73 65 64 20 61 73 20  jects passed as 
10ed0 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72  the.** second ar
10ee0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f  gument..*/.Windo
10ef0 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
10f00 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
10f10 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b  *db, Window *p){
10f20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
10f30 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20  .  Window *pRet 
10f40 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a  = 0;.  Window **
10f50 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66  pp = &pRet;..  f
10f60 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b  or(pWin=p; pWin;
10f70 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
10f80 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d  tWin){.    *pp =
10f90 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75   sqlite3WindowDu
10fa0 70 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a  p(db, 0, pWin);.
10fb0 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29      if( *pp==0 )
10fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d   break;.    pp =
10fd0 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57   &((*pp)->pNextW
10fe0 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  in);.  }..  retu
10ff0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
11000 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  * sqlite3WhereBe
11010 67 69 6e 28 29 20 68 61 73 20 61 6c 72 65 61 64  gin() has alread
11020 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f  y been called fo
11030 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  r the SELECT sta
11040 74 65 6d 65 6e 74 20 0a 2a 2a 20 70 61 73 73 65  tement .** passe
11050 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
11060 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68  argument when th
11070 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
11080 6e 76 6f 6b 65 64 2e 20 49 74 20 67 65 6e 65 72  nvoked. It gener
11090 61 74 65 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  ates.** code to 
110a0 70 6f 70 75 6c 61 74 65 20 74 68 65 20 57 69 6e  populate the Win
110b0 64 6f 77 2e 72 65 67 52 65 73 75 6c 74 20 72 65  dow.regResult re
110c0 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20  gister for each 
110d0 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
110e0 61 6e 64 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  and.** invoke th
110f0 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
11100 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
11110 72 47 6f 73 75 62 20 6f 6e 63 65 20 66 6f 72 20  rGosub once for 
11120 65 61 63 68 20 72 6f 77 2e 0a 2a 2a 20 54 68 69  each row..** Thi
11130 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  s function calls
11140 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
11150 28 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  () before return
11160 69 6e 67 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  ing. .*/.void sq
11170 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
11180 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  tep(.  Parse *pP
11190 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
111a0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
111b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
111c0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
111e0 52 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43 54  Rewritten SELECT
111f0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
11200 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
11210 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
11220 2f 2a 20 43 6f 6e 74 65 78 74 20 72 65 74 75 72  /* Context retur
11230 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
11240 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
11250 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20  int regGosub,   
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
11280 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e  OP_Gosub */.  in
11290 74 20 61 64 64 72 47 6f 73 75 62 20 20 20 20 20  t addrGosub     
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112b0 20 4f 50 5f 47 6f 73 75 62 20 68 65 72 65 20 74   OP_Gosub here t
112c0 6f 20 72 65 74 75 72 6e 20 65 61 63 68 20 72 6f  o return each ro
112d0 77 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  w */.){.  Window
112e0 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
112f0 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 61  n;..  /* There a
11300 72 65 20 74 68 72 65 65 20 64 69 66 66 65 72 65  re three differe
11310 6e 74 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  nt functions tha
11320 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f  t may be used to
11330 20 64 6f 20 74 68 65 20 77 6f 72 6b 0a 20 20 2a   do the work.  *
11340 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 64  * of this one, d
11350 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
11360 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 61 6e 64  window frame and
11370 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62 75   the specific bu
11380 69 6c 74 2d 69 6e 0a 20 20 2a 2a 20 77 69 6e 64  ilt-in.  ** wind
11390 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  ow functions use
113a0 64 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 2a 2a  d (if any)..  **
113b0 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65  .  ** windowCode
113c0 52 6f 77 45 78 70 72 53 74 65 70 28 29 20 68 61  RowExprStep() ha
113d0 6e 64 6c 65 73 20 61 6c 6c 20 22 52 4f 57 53 22  ndles all "ROWS"
113e0 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20   window frames, 
113f0 65 78 63 65 70 74 20 66 6f 72 3a 0a 20 20 2a 2a  except for:.  **
11400 0a 20 20 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  .  **   ROWS BET
11410 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
11420 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
11430 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20  RENT ROW.  **.  
11440 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  ** The exception
11450 20 69 73 20 62 65 63 61 75 73 65 20 77 69 6e 64   is because wind
11460 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65  owCodeRowExprSte
11470 70 28 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  p() implements a
11480 6c 6c 20 77 69 6e 64 6f 77 0a 20 20 2a 2a 20 66  ll window.  ** f
11490 72 61 6d 65 20 74 79 70 65 73 20 62 79 20 63 61  rame types by ca
114a0 63 68 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65  ching the entire
114b0 20 70 61 72 74 69 74 69 6f 6e 20 69 6e 20 61 20   partition in a 
114c0 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 6e 64 0a  temp table, and.
114d0 20 20 2a 2a 20 22 52 4f 57 53 20 42 45 54 57 45    ** "ROWS BETWE
114e0 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
114f0 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
11500 4e 54 20 52 4f 57 22 20 69 73 20 65 61 73 79 20  NT ROW" is easy 
11510 65 6e 6f 75 67 68 20 74 6f 0a 20 20 2a 2a 20 69  enough to.  ** i
11520 6d 70 6c 65 6d 65 6e 74 20 77 69 74 68 6f 75 74  mplement without
11530 20 73 75 63 68 20 61 20 63 61 63 68 65 2e 0a 20   such a cache.. 
11540 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43   **.  ** windowC
11550 6f 64 65 43 61 63 68 65 53 74 65 70 28 29 20 69  odeCacheStep() i
11560 73 20 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a  s used for:.  **
11570 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45  .  **   RANGE BE
11580 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
11590 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
115a0 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20  FOLLOWING.  **. 
115b0 20 2a 2a 20 49 74 20 69 73 20 61 6c 73 6f 20 75   ** It is also u
115c0 73 65 64 20 66 6f 72 20 61 6e 79 74 68 69 6e 67  sed for anything
115d0 20 6e 6f 74 20 68 61 6e 64 6c 65 64 20 62 79 20   not handled by 
115e0 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70  windowCodeRowExp
115f0 72 53 74 65 70 28 29 20 0a 20 20 2a 2a 20 74 68  rStep() .  ** th
11600 61 74 20 69 6e 76 6f 6b 65 73 20 61 20 62 75 69  at invokes a bui
11610 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
11620 63 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69  ction that requi
11630 72 65 73 20 74 68 65 20 65 6e 74 69 72 65 20 0a  res the entire .
11640 20 20 2a 2a 20 70 61 72 74 69 74 69 6f 6e 20 74    ** partition t
11650 6f 20 62 65 20 63 61 63 68 65 64 20 69 6e 20 61  o be cached in a
11660 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f   temp table befo
11670 72 65 20 61 6e 79 20 72 6f 77 73 20 61 72 65 20  re any rows are 
11680 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 28 65  returned.  ** (e
11690 2e 67 2e 20 6e 74 68 5f 76 61 6c 75 65 28 29 20  .g. nth_value() 
116a0 6f 72 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28  or percent_rank(
116b0 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69  ))..  **.  ** Fi
116c0 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 69 6e 67 20  nally, assuming 
116d0 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 69 6c  there is no buil
116e0 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
116f0 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72  tion that requir
11700 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 74  es.  ** the part
11710 69 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 63 68  ition to be cach
11720 65 64 2c 20 77 69 6e 64 6f 77 43 6f 64 65 44 65  ed, windowCodeDe
11730 66 61 75 6c 74 53 74 65 70 28 29 20 69 73 20 75  faultStep() is u
11740 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20  sed for:.  **.  
11750 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
11760 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
11770 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
11780 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52  NT ROW .  **   R
11790 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
117a0 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
117b0 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
117c0 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20  OLLOWING.  **   
117d0 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
117e0 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55  RRENT ROW AND CU
117f0 52 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20  RRENT ROW .  ** 
11800 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55    ROWS BETWEEN U
11810 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
11820 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  NG AND CURRENT R
11830 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e  OW.  **.  ** win
11840 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
11850 65 70 28 29 20 69 73 20 74 68 65 20 6f 6e 6c 79  ep() is the only
11860 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65   one of the thre
11870 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  e functions that
11880 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63  .  ** does not c
11890 61 63 68 65 20 65 61 63 68 20 70 61 72 74 69 74  ache each partit
118a0 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20 74 61  ion in a temp ta
118b0 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e  ble before begin
118c0 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 72 65 74  ning to.  ** ret
118d0 75 72 6e 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20  urn rows..  */. 
118e0 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
118f0 65 3d 3d 54 4b 5f 52 4f 57 53 20 0a 20 20 20 26  e==TK_ROWS .   &
11900 26 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  & (pMWin->eStart
11910 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c 7c  !=TK_UNBOUNDED||
11920 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f  pMWin->eEnd!=TK_
11930 43 55 52 52 45 4e 54 7c 7c 21 70 4d 57 69 6e 2d  CURRENT||!pMWin-
11940 3e 70 4f 72 64 65 72 42 79 29 0a 20 20 29 7b 0a  >pOrderBy).  ){.
11950 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f      windowCodeRo
11960 77 45 78 70 72 53 74 65 70 28 70 50 61 72 73 65  wExprStep(pParse
11970 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67  , p, pWInfo, reg
11980 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
11990 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
119a0 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
119b0 20 20 69 6e 74 20 62 43 61 63 68 65 20 3d 20 30    int bCache = 0
119c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
119d0 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 43  /* True to use C
119e0 61 63 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a 20  acheStep() */.. 
119f0 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53     if( pMWin->eS
11a00 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
11a10 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
11a20 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b  =TK_UNBOUNDED ){
11a30 0a 20 20 20 20 20 20 62 43 61 63 68 65 20 3d 20  .      bCache = 
11a40 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
11a50 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57      for(pWin=pMW
11a60 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
11a70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
11a80 20 20 20 20 20 20 20 20 46 75 6e 63 44 65 66 20          FuncDef 
11a90 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70  *pFunc = pWin->p
11aa0 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 69 66  Func;.        if
11ab0 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  ( (pFunc->funcFl
11ac0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
11ad0 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a 20  C_WINDOW_SIZE). 
11ae0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e          || (pFun
11af0 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  c->zName==nth_va
11b00 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 20 20  lueName).       
11b10 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61    || (pFunc->zNa
11b20 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e  me==first_valueN
11b30 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 7c 7c  ame).         ||
11b40 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d   (pFunc->zName==
11b50 6c 65 61 64 4e 61 6d 65 29 0a 20 20 20 20 20 20  leadName).      
11b60 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e     || (pFunc->zN
11b70 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20  ame==lagName).  
11b80 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
11b90 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b 0a 20     bCache = 1;. 
11ba0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
11bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11bc0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
11bd0 4f 74 68 65 72 77 69 73 65 2c 20 63 61 6c 6c 20  Otherwise, call 
11be0 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c  windowCodeDefaul
11bf0 74 53 74 65 70 28 29 2e 20 20 2a 2f 0a 20 20 20  tStep().  */.   
11c00 20 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20   if( bCache ){. 
11c10 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 43       windowCodeC
11c20 61 63 68 65 53 74 65 70 28 70 50 61 72 73 65 2c  acheStep(pParse,
11c30 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47   p, pWInfo, regG
11c40 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
11c50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11c60 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66     windowCodeDef
11c70 61 75 6c 74 53 74 65 70 28 70 50 61 72 73 65 2c  aultStep(pParse,
11c80 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47   p, pWInfo, regG
11c90 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
11ca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
11cb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11cc0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
11cd0 2a 2f 0a                                         */.