/ Hex Artifact Content
Login

Artifact 518274012188475ca02fb8444b1752a046c88a1cde6d1fd86a8e824cbb4b80f6:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 7d 0a 73 74 61 74 69   (*p)++;.}.stati
16e0: 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65  c void row_numbe
16f0: 72 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69  rInvFunc(.  sqli
1700: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
1710: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
1720: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1730: 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61  **apArg.){.}.sta
1740: 74 69 63 20 76 6f 69 64 20 72 6f 77 5f 6e 75 6d  tic void row_num
1750: 62 65 72 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  berValueFunc(sql
1760: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1770: 74 78 29 7b 0a 20 20 69 36 34 20 2a 70 20 3d 20  tx){.  i64 *p = 
1780: 28 69 36 34 2a 29 73 71 6c 69 74 65 33 5f 61 67  (i64*)sqlite3_ag
1790: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
17a0: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
17b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
17c0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
17d0: 28 70 20 3f 20 2a 70 20 3a 20 30 29 29 3b 0a 7d  (p ? *p : 0));.}
17e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20  ../*.** Context 
17f0: 6f 62 6a 65 63 74 20 74 79 70 65 20 75 73 65 64  object type used
1800: 20 62 79 20 72 61 6e 6b 28 29 2c 20 64 65 6e 73   by rank(), dens
1810: 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72 63 65 6e  e_rank(), percen
1820: 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a 2a 2a 20  t_rank() and.** 
1830: 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a 2a 2f 0a  cume_dist()..*/.
1840: 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74  struct CallCount
1850: 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c 75 65 3b   {.  i64 nValue;
1860: 0a 20 20 69 36 34 20 6e 53 74 65 70 3b 0a 20 20  .  i64 nStep;.  
1870: 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d 3b 0a 0a  i64 nTotal;.};..
1880: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1890: 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e  tion of built-in
18a0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
18b0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 2e 20 41   dense_rank(). A
18c0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
18d0: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
18e0: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
18f0: 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42  .**.**   RANGE B
1900: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
1910: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
1920: 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73  URRENT ROW .*/.s
1930: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1940: 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20  _rankStepFunc(. 
1950: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1960: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1970: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1980: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1990: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
19a0: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
19b0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
19c0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
19d0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
19e0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
19f0: 66 28 20 70 20 29 20 70 2d 3e 6e 53 74 65 70 20  f( p ) p->nStep 
1a00: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
1a10: 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b 49 6e 76  id dense_rankInv
1a20: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1a30: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1a40: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1a50: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1a60: 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20  Arg.){.}.static 
1a70: 76 6f 69 64 20 64 65 6e 73 65 5f 72 61 6e 6b 56  void dense_rankV
1a80: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
1a90: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
1aa0: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
1ab0: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
1ac0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
1ad0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
1ae0: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
1af0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
1b00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
1b10: 20 70 2d 3e 6e 53 74 65 70 20 29 7b 0a 20 20 20   p->nStep ){.   
1b20: 20 20 20 70 2d 3e 6e 56 61 6c 75 65 2b 2b 3b 0a     p->nValue++;.
1b30: 20 20 20 20 20 20 70 2d 3e 6e 53 74 65 70 20 3d        p->nStep =
1b40: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   0;.    }.    sq
1b50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
1b60: 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e 56 61 6c  64(pCtx, p->nVal
1b70: 75 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ue);.  }.}../*.*
1b80: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1b90: 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e   of built-in win
1ba0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 72 61 6e  dow function ran
1bb0: 6b 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61  k(). Assumes tha
1bc0: 74 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20  t.** the window 
1bd0: 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73  frame has been s
1be0: 65 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52  et to:.**.**   R
1bf0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
1c00: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
1c10: 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57   AND CURRENT ROW
1c20: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
1c30: 20 72 61 6e 6b 53 74 65 70 46 75 6e 63 28 0a 20   rankStepFunc(. 
1c40: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1c50: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
1c60: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
1c70: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
1c80: 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75    struct CallCou
1c90: 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  nt *p;.  p = (st
1ca0: 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29  ruct CallCount*)
1cb0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
1cc0: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
1cd0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
1ce0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  f( p ){.    p->n
1cf0: 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Step++;.    if( 
1d00: 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20 29 7b 0a  p->nValue==0 ){.
1d10: 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65 20        p->nValue 
1d20: 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20 20 20 20  = p->nStep;.    
1d30: 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  }.  }.}.static v
1d40: 6f 69 64 20 72 61 6e 6b 49 6e 76 46 75 6e 63 28  oid rankInvFunc(
1d50: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1d60: 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
1d70: 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
1d80: 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29  _value **apArg.)
1d90: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
1da0: 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71  rankValueFunc(sq
1db0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1dc0: 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43  Ctx){.  struct C
1dd0: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1de0: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1df0: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1e00: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1e10: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1e20: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1e30: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1e40: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
1e50: 6e 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e  nValue);.    p->
1e60: 6e 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a  nValue = 0;.  }.
1e70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
1e80: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1e90: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1ea0: 69 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b  ion percent_rank
1eb0: 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74  (). Assumes that
1ec0: 0a 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66  .** the window f
1ed0: 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65  rame has been se
1ee0: 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41  t to:.**.**   RA
1ef0: 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
1f00: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
1f10: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
1f20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f30: 70 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70  percent_rankStep
1f40: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1f50: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
1f60: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
1f70: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1f80: 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  Arg.){.  struct 
1f90: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1fa0: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1fb0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
1fc0: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 41  lite3VdbeAssertA
1fd0: 67 67 43 6f 6e 74 65 78 74 28 70 43 74 78 29 20  ggContext(pCtx) 
1fe0: 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  );.  p = (struct
1ff0: 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69   CallCount*)sqli
2000: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
2010: 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65  ntext(pCtx, size
2020: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 41  of(*p));.  if( A
2030: 4c 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20  LWAYS(p) ){.    
2040: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
2050: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f   ){.      p->nTo
2060: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
2070: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
2080: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
2090: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
20a0: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
20b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
20c0: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
20d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
20e0: 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74 5f 72  c void percent_r
20f0: 61 6e 6b 49 6e 76 46 75 6e 63 28 0a 20 20 73 71  ankInvFunc(.  sq
2100: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2110: 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
2120: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
2130: 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 7d 0a 73  e **apArg.){.}.s
2140: 74 61 74 69 63 20 76 6f 69 64 20 70 65 72 63 65  tatic void perce
2150: 6e 74 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63  nt_rankValueFunc
2160: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
2170: 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63   *pCtx){.  struc
2180: 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a  t CallCount *p;.
2190: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
21a0: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
21b0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
21c0: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
21d0: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
21e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
21f0: 61 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 64 6f  al>1 ){.      do
2200: 75 62 6c 65 20 72 20 3d 20 28 64 6f 75 62 6c 65  uble r = (double
2210: 29 28 70 2d 3e 6e 56 61 6c 75 65 2d 31 29 20 2f  )(p->nValue-1) /
2220: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 54 6f   (double)(p->nTo
2230: 74 61 6c 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  tal-1);.      sq
2240: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
2250: 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20  ble(pCtx, r);.  
2260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2270: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
2280: 75 62 6c 65 28 70 43 74 78 2c 20 30 2e 30 29 3b  uble(pCtx, 0.0);
2290: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 56  .    }.    p->nV
22a0: 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  alue = 0;.  }.}.
22b0: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
22c0: 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d 69  ation of built-i
22d0: 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
22e0: 6e 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 20 41  n cume_dist(). A
22f0: 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 74  ssumes that.** t
2300: 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20  he window frame 
2310: 68 61 73 20 62 65 65 6e 20 73 65 74 20 74 6f 3a  has been set to:
2320: 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47 45 20 42  .**.**   RANGE B
2330: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
2340: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
2350: 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73  URRENT ROW .*/.s
2360: 74 61 74 69 63 20 76 6f 69 64 20 63 75 6d 65 5f  tatic void cume_
2370: 64 69 73 74 53 74 65 70 46 75 6e 63 28 0a 20 20  distStepFunc(.  
2380: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
2390: 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
23a0: 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
23b0: 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a 20  lue **apArg.){. 
23c0: 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e   struct CallCoun
23d0: 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t *p;.  assert( 
23e0: 6e 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 61 73  nArg==1 );..  as
23f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
2400: 65 41 73 73 65 72 74 41 67 67 43 6f 6e 74 65 78  eAssertAggContex
2410: 74 28 70 43 74 78 29 20 29 3b 0a 20 20 70 20 3d  t(pCtx) );.  p =
2420: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
2430: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
2440: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
2450: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
2460: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 29  .  if( ALWAYS(p)
2470: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
2480: 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Total==0 ){.    
2490: 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71    p->nTotal = sq
24a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
24b0: 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20  4(apArg[0]);.   
24c0: 20 7d 0a 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b   }.    p->nStep+
24d0: 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  +;.  }.}.static 
24e0: 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 49 6e  void cume_distIn
24f0: 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  vFunc(.  sqlite3
2500: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2510: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
2520: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2530: 70 41 72 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63  pArg.){.}.static
2540: 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74 56   void cume_distV
2550: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2560: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
2570: 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  .  struct CallCo
2580: 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  unt *p;.  p = (s
2590: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 2a  truct CallCount*
25a0: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
25b0: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
25c0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
25d0: 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 54 6f 74  if( p && p->nTot
25e0: 61 6c 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65  al ){.    double
25f0: 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d   r = (double)(p-
2600: 3e 6e 53 74 65 70 29 20 2f 20 28 64 6f 75 62 6c  >nStep) / (doubl
2610: 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20  e)(p->nTotal);. 
2620: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2630: 74 5f 64 6f 75 62 6c 65 28 70 43 74 78 2c 20 72  t_double(pCtx, r
2640: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2650: 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66  Context object f
2660: 6f 72 20 6e 74 69 6c 65 28 29 20 77 69 6e 64 6f  or ntile() windo
2670: 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  w function..*/.s
2680: 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 20 7b  truct NtileCtx {
2690: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 20 20  .  i64 nTotal;  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 72 6f 77 73     /* Total rows
26c0: 20 69 6e 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f   in partition */
26d0: 0a 20 20 69 36 34 20 6e 50 61 72 61 6d 3b 20 20  .  i64 nParam;  
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20     /* Parameter 
2700: 70 61 73 73 65 64 20 74 6f 20 6e 74 69 6c 65 28  passed to ntile(
2710: 4e 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  N) */.  i64 iRow
2720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2730: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2740: 6e 74 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  nt row */.};../*
2750: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2760: 6f 6e 20 6f 66 20 6e 74 69 6c 65 28 29 2e 20 54  on of ntile(). T
2770: 68 69 73 20 61 73 73 75 6d 65 73 20 74 68 61 74  his assumes that
2780: 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61 6d   the window fram
2790: 65 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 63 6f  e has.** been co
27a0: 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  erced to:.**.** 
27b0: 20 20 52 4f 57 53 20 55 4e 42 4f 55 4e 44 45 44    ROWS UNBOUNDED
27c0: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
27d0: 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74  URRENT ROW.*/.st
27e0: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 53  atic void ntileS
27f0: 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  tepFunc(.  sqlit
2800: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2810: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2820: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2830: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2840: 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a  ct NtileCtx *p;.
2850: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
2860: 32 20 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75  2 );.  p = (stru
2870: 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73 71 6c  ct NtileCtx*)sql
2880: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2890: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
28a0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
28b0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
28c0: 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  nTotal==0 ){.   
28d0: 20 20 20 70 2d 3e 6e 50 61 72 61 6d 20 3d 20 73     p->nParam = s
28e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
28f0: 36 34 28 61 70 41 72 67 5b 30 5d 29 3b 0a 20 20  64(apArg[0]);.  
2900: 20 20 20 20 70 2d 3e 6e 54 6f 74 61 6c 20 3d 20      p->nTotal = 
2910: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2920: 74 36 34 28 61 70 41 72 67 5b 31 5d 29 3b 0a 20  t64(apArg[1]);. 
2930: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 61 72       if( p->nPar
2940: 61 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  am<=0 ){.       
2950: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2960: 65 72 72 6f 72 28 0a 20 20 20 20 20 20 20 20 20  error(.         
2970: 20 20 20 70 43 74 78 2c 20 22 61 72 67 75 6d 65     pCtx, "argume
2980: 6e 74 20 6f 66 20 6e 74 69 6c 65 20 6d 75 73 74  nt of ntile must
2990: 20 62 65 20 61 20 70 6f 73 69 74 69 76 65 20 69   be a positive i
29a0: 6e 74 65 67 65 72 22 2c 20 2d 31 0a 20 20 20 20  nteger", -1.    
29b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
29c0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 52 6f 77     }.    p->iRow
29d0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ++;.  }.}.static
29e0: 20 76 6f 69 64 20 6e 74 69 6c 65 49 6e 76 46 75   void ntileInvFu
29f0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2a00: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
2a10: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
2a20: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72  te3_value **apAr
2a30: 67 0a 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  g.){.}.static vo
2a40: 69 64 20 6e 74 69 6c 65 56 61 6c 75 65 46 75 6e  id ntileValueFun
2a50: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
2a60: 74 20 2a 70 43 74 78 29 7b 0a 20 20 73 74 72 75  t *pCtx){.  stru
2a70: 63 74 20 4e 74 69 6c 65 43 74 78 20 2a 70 3b 0a  ct NtileCtx *p;.
2a80: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4e 74    p = (struct Nt
2a90: 69 6c 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f  ileCtx*)sqlite3_
2aa0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
2ab0: 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a  t(pCtx, sizeof(*
2ac0: 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  p));.  if( p && 
2ad0: 70 2d 3e 6e 50 61 72 61 6d 3e 30 20 29 7b 0a 20  p->nParam>0 ){. 
2ae0: 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20 28     int nSize = (
2af0: 70 2d 3e 6e 54 6f 74 61 6c 20 2f 20 70 2d 3e 6e  p->nTotal / p->n
2b00: 50 61 72 61 6d 29 3b 0a 20 20 20 20 69 66 28 20  Param);.    if( 
2b10: 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
2b20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
2b30: 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e  _int64(pCtx, p->
2b40: 69 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iRow);.    }else
2b50: 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 4c 61 72  {.      i64 nLar
2b60: 67 65 20 3d 20 70 2d 3e 6e 54 6f 74 61 6c 20 2d  ge = p->nTotal -
2b70: 20 70 2d 3e 6e 50 61 72 61 6d 2a 6e 53 69 7a 65   p->nParam*nSize
2b80: 3b 0a 20 20 20 20 20 20 69 36 34 20 69 53 6d 61  ;.      i64 iSma
2b90: 6c 6c 20 3d 20 6e 4c 61 72 67 65 2a 28 6e 53 69  ll = nLarge*(nSi
2ba0: 7a 65 2b 31 29 3b 0a 20 20 20 20 20 20 69 36 34  ze+1);.      i64
2bb0: 20 69 52 6f 77 20 3d 20 70 2d 3e 69 52 6f 77 2d   iRow = p->iRow-
2bc0: 31 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  1;..      assert
2bd0: 28 20 28 6e 4c 61 72 67 65 2a 28 6e 53 69 7a 65  ( (nLarge*(nSize
2be0: 2b 31 29 20 2b 20 28 70 2d 3e 6e 50 61 72 61 6d  +1) + (p->nParam
2bf0: 2d 6e 4c 61 72 67 65 29 2a 6e 53 69 7a 65 29 3d  -nLarge)*nSize)=
2c00: 3d 70 2d 3e 6e 54 6f 74 61 6c 20 29 3b 0a 0a 20  =p->nTotal );.. 
2c10: 20 20 20 20 20 69 66 28 20 69 52 6f 77 3c 69 53       if( iRow<iS
2c20: 6d 61 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  mall ){.        
2c30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
2c40: 6e 74 36 34 28 70 43 74 78 2c 20 31 20 2b 20 69  nt64(pCtx, 1 + i
2c50: 52 6f 77 2f 28 6e 53 69 7a 65 2b 31 29 29 3b 0a  Row/(nSize+1));.
2c60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
2c80: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
2c90: 31 20 2b 20 6e 4c 61 72 67 65 20 2b 20 28 69 52  1 + nLarge + (iR
2ca0: 6f 77 2d 69 53 6d 61 6c 6c 29 2f 6e 53 69 7a 65  ow-iSmall)/nSize
2cb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2cc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
2cd0: 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72  ntext object for
2ce0: 20 6c 61 73 74 5f 76 61 6c 75 65 28 29 20 77 69   last_value() wi
2cf0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ndow function..*
2d00: 2f 0a 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c  /.struct LastVal
2d10: 75 65 43 74 78 20 7b 0a 20 20 73 71 6c 69 74 65  ueCtx {.  sqlite
2d20: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
2d30: 20 69 6e 74 20 6e 56 61 6c 3b 0a 7d 3b 0a 0a 2f   int nVal;.};../
2d40: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2d50: 69 6f 6e 20 6f 66 20 6c 61 73 74 5f 76 61 6c 75  ion of last_valu
2d60: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
2d70: 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 53 74  oid last_valueSt
2d80: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
2d90: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2da0: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2db0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2dc0: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2dd0: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2de0: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
2df0: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
2e00: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2e10: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2e20: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2e30: 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( p ){.    sqlit
2e40: 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d  e3_value_free(p-
2e50: 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e 70  >pVal);.    p->p
2e60: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  Val = sqlite3_va
2e70: 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30 5d  lue_dup(apArg[0]
2e80: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 56  );.    if( p->pV
2e90: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  al==0 ){.      s
2ea0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2eb0: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
2ec0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ed0: 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20 20    p->nVal++;.   
2ee0: 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20   }.  }.}.static 
2ef0: 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65 49  void last_valueI
2f00: 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  nvFunc(.  sqlite
2f10: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2f20: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
2f30: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2f40: 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75 63  apArg.){.  struc
2f50: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a  t LastValueCtx *
2f60: 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74  p;.  p = (struct
2f70: 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73   LastValueCtx*)s
2f80: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
2f90: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
2fa0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2fb0: 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a 20  ( ALWAYS(p) ){. 
2fc0: 20 20 20 70 2d 3e 6e 56 61 6c 2d 2d 3b 0a 20 20     p->nVal--;.  
2fd0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 3d 3d 30    if( p->nVal==0
2fe0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ff0: 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e  3_value_free(p->
3000: 70 56 61 6c 29 3b 0a 20 20 20 20 20 20 70 2d 3e  pVal);.      p->
3010: 70 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pVal = 0;.    }.
3020: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
3030: 64 20 6c 61 73 74 5f 76 61 6c 75 65 56 61 6c 75  d last_valueValu
3040: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3050: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20  ntext *pCtx){.  
3060: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
3070: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73  Ctx *p;.  p = (s
3080: 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65 43  truct LastValueC
3090: 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  tx*)sqlite3_aggr
30a0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
30b0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
30c0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 70  .  if( p && p->p
30d0: 56 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Val ){.    sqlit
30e0: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
30f0: 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c 29 3b 0a  pCtx, p->pVal);.
3100: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
3110: 64 20 6c 61 73 74 5f 76 61 6c 75 65 46 69 6e 61  d last_valueFina
3120: 6c 69 7a 65 46 75 6e 63 28 73 71 6c 69 74 65 33  lizeFunc(sqlite3
3130: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
3140: 0a 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61  .  struct LastVa
3150: 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  lueCtx *p;.  p =
3160: 20 28 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c   (struct LastVal
3170: 75 65 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61  ueCtx*)sqlite3_a
3180: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
3190: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
31a0: 29 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  ));.  if( p && p
31b0: 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20 20 73 71  ->pVal ){.    sq
31c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
31d0: 75 65 28 70 43 74 78 2c 20 70 2d 3e 70 56 61 6c  ue(pCtx, p->pVal
31e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  );.    sqlite3_v
31f0: 61 6c 75 65 5f 66 72 65 65 28 70 2d 3e 70 56 61  alue_free(p->pVa
3200: 6c 29 3b 0a 20 20 20 20 70 2d 3e 70 56 61 6c 20  l);.    p->pVal 
3210: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
3220: 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d 65 6e  * No-op implemen
3230: 74 61 74 69 6f 6e 73 20 6f 66 20 6e 74 68 5f 76  tations of nth_v
3240: 61 6c 75 65 28 29 2c 20 66 69 72 73 74 5f 76 61  alue(), first_va
3250: 6c 75 65 28 29 2c 20 6c 65 61 64 28 29 20 61 6e  lue(), lead() an
3260: 64 20 6c 61 67 28 29 2e 0a 2a 2a 20 54 68 65 73  d lag()..** Thes
3270: 65 20 61 72 65 20 61 6c 6c 20 69 6d 70 6c 65 6d  e are all implem
3280: 65 6e 74 65 64 20 69 6e 6c 69 6e 65 20 75 73 69  ented inline usi
3290: 6e 67 20 56 44 42 45 20 69 6e 73 74 72 75 63 74  ng VDBE instruct
32a0: 69 6f 6e 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ions. .*/.static
32b0: 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65 53   void nth_valueS
32c0: 74 65 70 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  tepFunc(sqlite3_
32d0: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  context *pCtx, i
32e0: 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61  nt n, sqlite3_va
32f0: 6c 75 65 20 2a 2a 61 29 7b 7d 0a 73 74 61 74 69  lue **a){}.stati
3300: 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75 65  c void nth_value
3310: 49 6e 76 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  InvFunc(sqlite3_
3320: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  context *pCtx, i
3330: 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61  nt n, sqlite3_va
3340: 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74  lue **ap){}.stat
3350: 69 63 20 76 6f 69 64 20 6e 74 68 5f 76 61 6c 75  ic void nth_valu
3360: 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  eValueFunc(sqlit
3370: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
3380: 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ){}.static void 
3390: 66 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46  first_valueStepF
33a0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
33b0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 73  ext *p, int n, s
33c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
33d0: 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  p){}.static void
33e0: 20 66 69 72 73 74 5f 76 61 6c 75 65 49 6e 76 46   first_valueInvF
33f0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
3400: 65 78 74 20 2a 70 2c 20 69 6e 74 20 6e 2c 20 73  ext *p, int n, s
3410: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
3420: 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  p){}.static void
3430: 20 66 69 72 73 74 5f 76 61 6c 75 65 56 61 6c 75   first_valueValu
3440: 65 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  eFunc(sqlite3_co
3450: 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 7d 0a 73  ntext *pCtx){}.s
3460: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 61 64 53  tatic void leadS
3470: 74 65 70 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  tepFunc(sqlite3_
3480: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 69  context *pCtx, i
3490: 6e 74 20 6e 2c 20 73 71 6c 69 74 65 33 5f 76 61  nt n, sqlite3_va
34a0: 6c 75 65 20 2a 2a 61 70 29 7b 7d 0a 73 74 61 74  lue **ap){}.stat
34b0: 69 63 20 76 6f 69 64 20 6c 65 61 64 49 6e 76 46  ic void leadInvF
34c0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
34d0: 65 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e  ext *pCtx, int n
34e0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
34f0: 2a 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20 76  **ap){}.static v
3500: 6f 69 64 20 6c 65 61 64 56 61 6c 75 65 46 75 6e  oid leadValueFun
3510: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
3520: 74 20 2a 70 43 74 78 29 7b 7d 0a 73 74 61 74 69  t *pCtx){}.stati
3530: 63 20 76 6f 69 64 20 6c 61 67 53 74 65 70 46 75  c void lagStepFu
3540: 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  nc(sqlite3_conte
3550: 78 74 20 2a 70 43 74 78 2c 20 69 6e 74 20 6e 2c  xt *pCtx, int n,
3560: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3570: 2a 61 70 29 7b 7d 0a 73 74 61 74 69 63 20 76 6f  *ap){}.static vo
3580: 69 64 20 6c 61 67 49 6e 76 46 75 6e 63 28 73 71  id lagInvFunc(sq
3590: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
35a0: 43 74 78 2c 20 69 6e 74 20 6e 2c 20 73 71 6c 69  Ctx, int n, sqli
35b0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 29 7b  te3_value **ap){
35c0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 61  }.static void la
35d0: 67 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74  gValueFunc(sqlit
35e0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
35f0: 29 7b 7d 0a 0a 23 64 65 66 69 6e 65 20 57 49 4e  ){}..#define WIN
3600: 44 4f 57 46 55 4e 43 28 6e 61 6d 65 2c 6e 41 72  DOWFUNC(name,nAr
3610: 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20 20 20  g,extra) {      
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54  \.  nArg, (SQLIT
3650: 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55  E_UTF8|SQLITE_FU
3660: 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29  NC_WINDOW|extra)
3670: 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20  , 0, 0,         
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
3690: 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46 75 6e   name ## StepFun
36a0: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
36b0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61  Func, name ## Va
36c0: 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20 20 20  lueFunc,        
36d0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 61            \.  na
36e0: 6d 65 20 23 23 20 49 6e 76 46 75 6e 63 2c 20 23  me ## InvFunc, #
36f0: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20     \.}..#define 
3730: 57 49 4e 44 4f 57 46 55 4e 43 46 28 6e 61 6d 65  WINDOWFUNCF(name
3740: 2c 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20  ,nArg,extra) {  
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3770: 20 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51     \.  nArg, (SQ
3780: 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45  LITE_UTF8|SQLITE
3790: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74  _FUNC_WINDOW|ext
37a0: 72 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20  ra), 0, 0,      
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 5c 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70  \.  name ## Step
37d0: 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 46 69  Func, name ## Fi
37e0: 6e 61 6c 69 7a 65 46 75 6e 63 2c 20 6e 61 6d 65  nalizeFunc, name
37f0: 20 23 23 20 56 61 6c 75 65 46 75 6e 63 2c 20 20   ## ValueFunc,  
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
3810: 20 6e 61 6d 65 20 23 23 20 49 6e 76 46 75 6e 63   name ## InvFunc
3820: 2c 20 23 6e 61 6d 65 20 20 20 20 20 20 20 20 20  , #name         
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
3860: 20 52 65 67 69 73 74 65 72 20 74 68 6f 73 65 20   Register those 
3870: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
3880: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
3890: 72 65 20 6e 6f 74 20 61 6c 73 6f 20 61 67 67 72  re not also aggr
38a0: 65 67 61 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  egates..*/.void 
38b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 46 75 6e  sqlite3WindowFun
38c0: 63 74 69 6f 6e 73 28 76 6f 69 64 29 7b 0a 20 20  ctions(void){.  
38d0: 73 74 61 74 69 63 20 46 75 6e 63 44 65 66 20 61  static FuncDef a
38e0: 57 69 6e 64 6f 77 46 75 6e 63 73 5b 5d 20 3d 20  WindowFuncs[] = 
38f0: 7b 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  {.    WINDOWFUNC
3900: 28 72 6f 77 5f 6e 75 6d 62 65 72 2c 20 30 2c 20  (row_number, 0, 
3910: 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  0),.    WINDOWFU
3920: 4e 43 28 64 65 6e 73 65 5f 72 61 6e 6b 2c 20 30  NC(dense_rank, 0
3930: 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  , 0),.    WINDOW
3940: 46 55 4e 43 28 72 61 6e 6b 2c 20 30 2c 20 30 29  FUNC(rank, 0, 0)
3950: 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43  ,.    WINDOWFUNC
3960: 28 70 65 72 63 65 6e 74 5f 72 61 6e 6b 2c 20 30  (percent_rank, 0
3970: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  , SQLITE_FUNC_WI
3980: 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20  NDOW_SIZE),.    
3990: 57 49 4e 44 4f 57 46 55 4e 43 28 63 75 6d 65 5f  WINDOWFUNC(cume_
39a0: 64 69 73 74 2c 20 30 2c 20 53 51 4c 49 54 45 5f  dist, 0, SQLITE_
39b0: 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45  FUNC_WINDOW_SIZE
39c0: 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e  ),.    WINDOWFUN
39d0: 43 28 6e 74 69 6c 65 2c 20 31 2c 20 53 51 4c 49  C(ntile, 1, SQLI
39e0: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53  TE_FUNC_WINDOW_S
39f0: 49 5a 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57  IZE),.    WINDOW
3a00: 46 55 4e 43 46 28 6c 61 73 74 5f 76 61 6c 75 65  FUNCF(last_value
3a10: 2c 20 31 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 1, 0),.    WIN
3a20: 44 4f 57 46 55 4e 43 28 6e 74 68 5f 76 61 6c 75  DOWFUNC(nth_valu
3a30: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
3a40: 4e 44 4f 57 46 55 4e 43 28 66 69 72 73 74 5f 76  NDOWFUNC(first_v
3a50: 61 6c 75 65 2c 20 31 2c 20 30 29 2c 0a 20 20 20  alue, 1, 0),.   
3a60: 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64   WINDOWFUNC(lead
3a70: 2c 20 31 2c 20 30 29 2c 20 57 49 4e 44 4f 57 46  , 1, 0), WINDOWF
3a80: 55 4e 43 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c  UNC(lead, 2, 0),
3a90: 20 57 49 4e 44 4f 57 46 55 4e 43 28 6c 65 61 64   WINDOWFUNC(lead
3aa0: 2c 20 33 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 3, 0),.    WIN
3ab0: 44 4f 57 46 55 4e 43 28 6c 61 67 2c 20 31 2c 20  DOWFUNC(lag, 1, 
3ac0: 30 29 2c 20 20 57 49 4e 44 4f 57 46 55 4e 43 28  0),  WINDOWFUNC(
3ad0: 6c 61 67 2c 20 32 2c 20 30 29 2c 20 20 57 49 4e  lag, 2, 0),  WIN
3ae0: 44 4f 57 46 55 4e 43 28 6c 61 67 2c 20 33 2c 20  DOWFUNC(lag, 3, 
3af0: 30 29 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74  0),.  };.  sqlit
3b00: 65 33 49 6e 73 65 72 74 42 75 69 6c 74 69 6e 46  e3InsertBuiltinF
3b10: 75 6e 63 73 28 61 57 69 6e 64 6f 77 46 75 6e 63  uncs(aWindowFunc
3b20: 73 2c 20 41 72 72 61 79 53 69 7a 65 28 61 57 69  s, ArraySize(aWi
3b30: 6e 64 6f 77 46 75 6e 63 73 29 29 3b 0a 7d 0a 0a  ndowFuncs));.}..
3b40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3b50: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 6d  ion is called im
3b60: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3b70: 72 65 73 6f 6c 76 69 6e 67 20 74 68 65 20 66 75  resolving the fu
3b80: 6e 63 74 69 6f 6e 20 6e 61 6d 65 0a 2a 2a 20 66  nction name.** f
3b90: 6f 72 20 61 20 77 69 6e 64 6f 77 20 66 75 6e 63  or a window func
3ba0: 74 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 53 45  tion within a SE
3bb0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
3bc0: 41 72 67 75 6d 65 6e 74 20 70 4c 69 73 74 20 69  Argument pList i
3bd0: 73 20 61 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  s a.** linked li
3be0: 73 74 20 6f 66 20 57 49 4e 44 4f 57 20 64 65 66  st of WINDOW def
3bf0: 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20 74 68 65  initions for the
3c00: 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
3c10: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 41 72  statement..** Ar
3c20: 67 75 6d 65 6e 74 20 70 46 75 6e 63 20 69 73 20  gument pFunc is 
3c30: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  the function def
3c40: 69 6e 69 74 69 6f 6e 20 6a 75 73 74 20 72 65 73  inition just res
3c50: 6f 6c 76 65 64 20 61 6e 64 20 70 57 69 6e 0a 2a  olved and pWin.*
3c60: 2a 20 69 73 20 74 68 65 20 57 69 6e 64 6f 77 20  * is the Window 
3c70: 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
3c80: 69 6e 67 20 74 68 65 20 61 73 73 6f 63 69 61 74  ing the associat
3c90: 65 64 20 4f 56 45 52 20 63 6c 61 75 73 65 2e 20  ed OVER clause. 
3ca0: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
3cb0: 20 75 70 64 61 74 65 73 20 74 68 65 20 63 6f 6e   updates the con
3cc0: 74 65 6e 74 73 20 6f 66 20 70 57 69 6e 20 61 73  tents of pWin as
3cd0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
3ce0: 20 20 2a 20 49 66 20 74 68 65 20 4f 56 45 52 20    * If the OVER 
3cf0: 63 6c 61 75 73 65 20 72 65 66 65 72 65 64 20 74  clause refered t
3d00: 6f 20 61 20 6e 61 6d 65 64 20 77 69 6e 64 6f 77  o a named window
3d10: 20 28 61 73 20 69 6e 20 22 6d 61 78 28 78 29 20   (as in "max(x) 
3d20: 4f 56 45 52 20 77 69 6e 22 29 2c 0a 2a 2a 20 20  OVER win"),.**  
3d30: 20 20 20 73 65 61 72 63 68 20 6c 69 73 74 20 70     search list p
3d40: 4c 69 73 74 20 66 6f 72 20 61 20 6d 61 74 63 68  List for a match
3d50: 69 6e 67 20 57 49 4e 44 4f 57 20 64 65 66 69 6e  ing WINDOW defin
3d60: 69 74 69 6f 6e 2c 20 61 6e 64 20 75 70 64 61 74  ition, and updat
3d70: 65 20 70 57 69 6e 0a 2a 2a 20 20 20 20 20 61 63  e pWin.**     ac
3d80: 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 6e 6f  cordingly. If no
3d90: 20 73 75 63 68 20 57 49 4e 44 4f 57 20 63 6c 61   such WINDOW cla
3da0: 75 73 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  use can be found
3db0: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
3dc0: 0a 2a 2a 20 20 20 20 20 69 6e 20 70 50 61 72 73  .**     in pPars
3dd0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  e..**.**   * If 
3de0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
3df0: 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  a built-in windo
3e00: 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  w function that 
3e10: 72 65 71 75 69 72 65 73 20 74 68 65 0a 2a 2a 20  requires the.** 
3e20: 20 20 20 20 77 69 6e 64 6f 77 20 74 6f 20 62 65      window to be
3e30: 20 63 6f 65 72 63 65 64 20 28 73 65 65 20 22 42   coerced (see "B
3e40: 55 49 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46  UILT-IN WINDOW F
3e50: 55 4e 43 54 49 4f 4e 53 22 20 61 74 20 74 68 65  UNCTIONS" at the
3e60: 20 74 6f 70 0a 2a 2a 20 20 20 20 20 6f 66 20 74   top.**     of t
3e70: 68 69 73 20 66 69 6c 65 29 2c 20 70 57 69 6e 20  his file), pWin 
3e80: 69 73 20 75 70 64 61 74 65 64 20 68 65 72 65 2e  is updated here.
3e90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3ea0: 57 69 6e 64 6f 77 55 70 64 61 74 65 28 0a 20 20  WindowUpdate(.  
3eb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
3ec0: 20 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 2c    Window *pList,
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6e 61 6d    /* List of nam
3ef0: 65 64 20 77 69 6e 64 6f 77 73 20 66 6f 72 20 74  ed windows for t
3f00: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
3f10: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 20 20 20  Window *pWin,   
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 2f 2a 20 57 69 6e 64 6f 77 20 66 72 61 6d 65 20  /* Window frame 
3f40: 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 46  to update */.  F
3f50: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 20 20  uncDef *pFunc   
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3f70: 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * Window functio
3f80: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a  n definition */.
3f90: 29 7b 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a  ){.  if( pWin->z
3fa0: 4e 61 6d 65 20 26 26 20 70 57 69 6e 2d 3e 65 54  Name && pWin->eT
3fb0: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ype==0 ){.    Wi
3fc0: 6e 64 6f 77 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ndow *p;.    for
3fd0: 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
3fe0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
3ff0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
4000: 72 49 43 6d 70 28 70 2d 3e 7a 4e 61 6d 65 2c 20  rICmp(p->zName, 
4010: 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  pWin->zName)==0 
4020: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
4030: 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20     if( p==0 ){. 
4040: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4050: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
4060: 20 73 75 63 68 20 77 69 6e 64 6f 77 3a 20 25 73   such window: %s
4070: 22 2c 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 29 3b  ", pWin->zName);
4080: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
4090: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 2d 3e 70     }.    pWin->p
40a0: 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c 69  Partition = sqli
40b0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
40c0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 50  Parse->db, p->pP
40d0: 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
40e0: 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79    pWin->pOrderBy
40f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4100: 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  stDup(pParse->db
4110: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30  , p->pOrderBy, 0
4120: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 70 53 74  );.    pWin->pSt
4130: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  art = sqlite3Exp
4140: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
4150: 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a   p->pStart, 0);.
4160: 20 20 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d      pWin->pEnd =
4170: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4180: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
4190: 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 70 57 69  End, 0);.    pWi
41a0: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65  n->eStart = p->e
41b0: 53 74 61 72 74 3b 0a 20 20 20 20 70 57 69 6e 2d  Start;.    pWin-
41c0: 3e 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b  >eEnd = p->eEnd;
41d0: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65  .    pWin->eType
41e0: 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 7d   = p->eType;.  }
41f0: 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 66 75  .  if( pFunc->fu
4200: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
4210: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29 7b 0a  _FUNC_WINDOW ){.
4220: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
4230: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
4240: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c    if( pWin->pFil
4250: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ter ){.      sql
4260: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4270: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
4280: 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65 20 6d  "FILTER clause m
4290: 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  ay only be used 
42a0: 77 69 74 68 20 61 67 67 72 65 67 61 74 65 20 77  with aggregate w
42b0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22  indow functions"
42c0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
42d0: 6c 73 65 0a 20 20 20 20 69 66 28 20 70 46 75 6e  lse.    if( pFun
42e0: 63 2d 3e 78 53 46 75 6e 63 3d 3d 72 6f 77 5f 6e  c->xSFunc==row_n
42f0: 75 6d 62 65 72 53 74 65 70 46 75 6e 63 20 7c 7c  umberStepFunc ||
4300: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
4310: 6e 74 69 6c 65 53 74 65 70 46 75 6e 63 20 29 7b  ntileStepFunc ){
4320: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4330: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4340: 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20  n->pStart);.    
4350: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4360: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
4370: 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nd);.      pWin-
4380: 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e  >pStart = pWin->
4390: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  pEnd = 0;.      
43a0: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b  pWin->eType = TK
43b0: 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69  _ROWS;.      pWi
43c0: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
43d0: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
43e0: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
43f0: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  CURRENT;.    }el
4400: 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e  se..    if( pFun
4410: 63 2d 3e 78 53 46 75 6e 63 3d 3d 64 65 6e 73 65  c->xSFunc==dense
4420: 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63 20 7c 7c  _rankStepFunc ||
4430: 20 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d   pFunc->xSFunc==
4440: 72 61 6e 6b 53 74 65 70 46 75 6e 63 0a 20 20 20  rankStepFunc.   
4450: 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 78 53 46 75    || pFunc->xSFu
4460: 6e 63 3d 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b  nc==percent_rank
4470: 53 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e  StepFunc || pFun
4480: 63 2d 3e 78 53 46 75 6e 63 3d 3d 63 75 6d 65 5f  c->xSFunc==cume_
4490: 64 69 73 74 53 74 65 70 46 75 6e 63 0a 20 20 20  distStepFunc.   
44a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
44b0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
44c0: 70 57 69 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20  pWin->pStart);. 
44d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
44e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e 2d  Delete(db, pWin-
44f0: 3e 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 70 57  >pEnd);.      pW
4500: 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20 70 57 69  in->pStart = pWi
4510: 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20  n->pEnd = 0;.   
4520: 20 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d     pWin->eType =
4530: 20 54 4b 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20   TK_RANGE;.     
4540: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
4550: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 20 20  TK_UNBOUNDED;.  
4560: 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d      pWin->eEnd =
4570: 20 54 4b 5f 43 55 52 52 45 4e 54 3b 0a 20 20 20   TK_CURRENT;.   
4580: 20 7d 0a 20 20 7d 0a 20 20 70 57 69 6e 2d 3e 70   }.  }.  pWin->p
4590: 46 75 6e 63 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a  Func = pFunc;.}.
45a0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f  ./*.** Context o
45b0: 62 6a 65 63 74 20 70 61 73 73 65 64 20 74 68 72  bject passed thr
45c0: 6f 75 67 68 20 73 71 6c 69 74 65 33 57 61 6c 6b  ough sqlite3Walk
45d0: 45 78 70 72 4c 69 73 74 28 29 20 74 6f 0a 2a 2a  ExprList() to.**
45e0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
45f0: 72 69 74 65 45 78 70 72 43 62 28 29 20 62 79 20  riteExprCb() by 
4600: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
4610: 69 74 65 45 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74  iteEList()..*/.t
4620: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57 69  ypedef struct Wi
4630: 6e 64 6f 77 52 65 77 72 69 74 65 20 57 69 6e 64  ndowRewrite Wind
4640: 6f 77 52 65 77 72 69 74 65 3b 0a 73 74 72 75 63  owRewrite;.struc
4650: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
4660: 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
4670: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53  ;.  ExprList *pS
4680: 75 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61  ub;.};../*.** Ca
4690: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
46a0: 75 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69  used by selectWi
46b0: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
46c0: 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  (). If necessary
46d0: 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
46e0: 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  on appends to th
46f0: 65 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73  e output express
4700: 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64  ion-list and upd
4710: 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73  ates .** express
4720: 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e  ion (*ppExpr) in
4730: 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   place..*/.stati
4740: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4750: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28  owRewriteExprCb(
4760: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
4770: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4780: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
4790: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
47a0: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
47b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
47c0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
47d0: 65 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45  e;..  switch( pE
47e0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20  xpr->op ){..    
47f0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
4800: 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  :.      if( pExp
4810: 72 2d 3e 70 57 69 6e 3d 3d 30 20 29 7b 0a 20 20  r->pWin==0 ){.  
4820: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4830: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4840: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
4850: 20 20 20 20 20 20 20 20 66 6f 72 28 70 57 69 6e          for(pWin
4860: 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e 3b 20  =p->pWin; pWin; 
4870: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
4880: 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Win){.          
4890: 69 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d  if( pExpr->pWin=
48a0: 3d 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  =pWin ){.       
48b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
48c0: 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70 45 78 70 72  n->pOwner==pExpr
48d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
48e0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
48f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4910: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
4920: 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20 20 20  rough.  */..    
4930: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
4940: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
4950: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
4960: 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73    Expr *pDup = s
4970: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
4980: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
4990: 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53   0);.      p->pS
49a0: 75 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ub = sqlite3Expr
49b0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
49c0: 65 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44 75 70  e, p->pSub, pDup
49d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
49e0: 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
49f0: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
4a00: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4a10: 50 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 3b 0a  P_Static)==0 );.
4a20: 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
4a30: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4a40: 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20  P_Static);.     
4a50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4a60: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
4a70: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
4a80: 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
4a90: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
4aa0: 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  tic);.        me
4ab0: 6d 73 65 74 28 70 45 78 70 72 2c 20 30 2c 20 73  mset(pExpr, 0, s
4ac0: 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
4ad0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
4ae0: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
4af0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
4b00: 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62 2d 3e  lumn = p->pSub->
4b10: 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 20 20 20  nExpr-1;.       
4b20: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4b30: 20 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68 43 73   p->pWin->iEphCs
4b40: 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
4b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4b60: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
4b70: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
4b80: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
4b90: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
4ba0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
4bb0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
4bc0: 74 65 53 65 6c 65 63 74 43 62 28 57 61 6c 6b 65  teSelectCb(Walke
4bd0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
4be0: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
4bf0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
4c00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  ;.}.../*.** Iter
4c10: 61 74 65 20 74 68 72 6f 75 67 68 20 65 61 63 68  ate through each
4c20: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65   expression in e
4c30: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
4c40: 45 4c 69 73 74 2e 20 46 6f 72 20 65 61 63 68 3a  EList. For each:
4c50: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43 4f  .**.**   * TK_CO
4c60: 4c 55 4d 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67 67  LUMN,.**   * agg
4c70: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
4c80: 20 6f 72 0a 2a 2a 20 20 20 2a 20 77 69 6e 64 6f   or.**   * windo
4c90: 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  w function with 
4ca0: 61 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  a Window object 
4cb0: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 6d 65  that is not a me
4cc0: 6d 62 65 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mber of the .** 
4cd0: 20 20 20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20      linked list 
4ce0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
4cf0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 70  cond argument (p
4d00: 57 69 6e 29 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e  Win).**.** Appen
4d10: 64 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6f 75  d the node to ou
4d20: 74 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d  tput expression-
4d30: 6c 69 73 74 20 28 2a 70 70 53 75 62 29 2e 20 41  list (*ppSub). A
4d40: 6e 64 20 72 65 70 6c 61 63 65 20 69 74 0a 2a 2a  nd replace it.**
4d50: 20 77 69 74 68 20 61 20 54 4b 5f 43 4f 4c 55 4d   with a TK_COLUM
4d60: 4e 20 74 68 61 74 20 72 65 61 64 73 20 74 68 65  N that reads the
4d70: 20 28 4e 2d 31 29 74 68 20 65 6c 65 6d 65 6e 74   (N-1)th element
4d80: 20 6f 66 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57   of table .** pW
4d90: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 77 68 65  in->iEphCsr, whe
4da0: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
4db0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
4dc0: 6e 20 28 2a 70 70 53 75 62 29 20 61 66 74 65 72  n (*ppSub) after
4dd0: 0a 2a 2a 20 61 70 70 65 6e 64 69 6e 67 20 74 68  .** appending th
4de0: 65 20 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74  e new one..*/.st
4df0: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
4e00: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69  WindowRewriteELi
4e10: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
4e20: 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a  rse, .  Window *
4e30: 70 57 69 6e 2c 0a 20 20 45 78 70 72 4c 69 73 74  pWin,.  ExprList
4e40: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20   *pEList,       
4e50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69          /* Rewri
4e60: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  te expressions i
4e70: 6e 20 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20  n this list */. 
4e80: 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 53 75   ExprList **ppSu
4e90: 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
4ea0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d   /* IN/OUT: Sub-
4eb0: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
4ec0: 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57  n-list */.){.  W
4ed0: 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20  alker sWalker;. 
4ee0: 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 73   WindowRewrite s
4ef0: 52 65 77 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73  Rewrite;..  mems
4f00: 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20  et(&sWalker, 0, 
4f10: 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b  sizeof(Walker));
4f20: 0a 20 20 6d 65 6d 73 65 74 28 26 73 52 65 77 72  .  memset(&sRewr
4f30: 69 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  ite, 0, sizeof(W
4f40: 69 6e 64 6f 77 52 65 77 72 69 74 65 29 29 3b 0a  indowRewrite));.
4f50: 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53 75 62  .  sRewrite.pSub
4f60: 20 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73 52 65   = *ppSub;.  sRe
4f70: 77 72 69 74 65 2e 70 57 69 6e 20 3d 20 70 57 69  write.pWin = pWi
4f80: 6e 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50  n;..  sWalker.pP
4f90: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
4fa0: 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61   sWalker.xExprCa
4fb0: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57  llback = selectW
4fc0: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72  indowRewriteExpr
4fd0: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53  Cb;.  sWalker.xS
4fe0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
4ff0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5000: 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73  iteSelectCb;.  s
5010: 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74  Walker.u.pRewrit
5020: 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a  e = &sRewrite;..
5030: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
5040: 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61  alkExprList(&sWa
5050: 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a  lker, pEList);..
5060: 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72    *ppSub = sRewr
5070: 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a  ite.pSub;.}../*.
5080: 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70 79  ** Append a copy
5090: 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73 73   of each express
50a0: 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ion in expressio
50b0: 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20 74  n-list pAppend t
50c0: 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  o.** expression 
50d0: 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74 75  list pList. Retu
50e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
50f0: 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  the result list.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 4c  .*/.static ExprL
5110: 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70 70  ist *exprListApp
5120: 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73 65  endList(.  Parse
5130: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5140: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
5150: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
5160: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
5170: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
5180: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
5190: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
51a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70 70    ExprList *pApp
51b0: 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  end       /* Lis
51c0: 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61  t of values to a
51d0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
51e0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
51f0: 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20   pAppend ){.    
5200: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
5210: 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20 70  Init = pList ? p
5220: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
5230: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5240: 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b 20  pAppend->nExpr; 
5250: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
5260: 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33   *pDup = sqlite3
5270: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
5280: 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69  db, pAppend->a[i
5290: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
52a0: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
52b0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
52c0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
52d0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
52e0: 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e   pList ) pList->
52f0: 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f  a[nInit+i].sortO
5300: 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e  rder = pAppend->
5310: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
5320: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5330: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
5340: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
5350: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
5360: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
5370: 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  argument does no
5380: 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20  t invoke.** any 
5390: 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  SQL window funct
53a0: 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ions, this funct
53b0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
53c0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a  Otherwise, it .*
53d0: 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53  * rewrites the S
53e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
53f0: 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66  so that window f
5400: 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75  unction xStep fu
5410: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69  nctions.** are i
5420: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f  nvoked in the co
5430: 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64  rrect order as d
5440: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22  escribed under "
5450: 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47  SELECT REWRITING
5460: 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20  ".** at the top 
5470: 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f  of this file..*/
5480: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64  .int sqlite3Wind
5490: 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20  owRewrite(Parse 
54a0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
54b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
54c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
54d0: 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20   p->pWin ){.    
54e0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
54f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
5500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
5510: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5520: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
5530: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5540: 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
5550: 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  y */.    SrcList
5560: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
5570: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65  ;.    Expr *pWhe
5580: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
5590: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
55a0: 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
55b0: 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  upBy;.    Expr *
55c0: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
55d0: 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  ving;.    ExprLi
55e0: 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a  st *pSort = 0;..
55f0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
5600: 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  ublist = 0;     
5610: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
5620: 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65  list for sub-que
5630: 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77  ry */.    Window
5640: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
5650: 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65  n;      /* Maste
5660: 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  r window object 
5670: 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  */.    Window *p
5680: 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Win;            
5690: 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f       /* Window o
56a0: 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a  bject iterator *
56b0: 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  /..    p->pSrc =
56c0: 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72   0;.    p->pWher
56d0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47  e = 0;.    p->pG
56e0: 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20  roupBy = 0;.    
56f0: 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  p->pHaving = 0;.
5700: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
5710: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
5720: 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d 73  se for the sub-s
5730: 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 74  elect. This is t
5740: 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  he concatenation
5750: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 77  .    ** of the w
5760: 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e 20  indow PARTITION 
5770: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61  and ORDER BY cla
5780: 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20 74  uses. Then, if t
5790: 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20 20  his makes it.   
57a0: 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20 72   ** redundant, r
57b0: 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20  emove the ORDER 
57c0: 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  BY from the pare
57d0: 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a 20  nt SELECT.  */. 
57e0: 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69 74     pSort = sqlit
57f0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
5800: 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  , pMWin->pPartit
5810: 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53 6f  ion, 0);.    pSo
5820: 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70  rt = exprListApp
5830: 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20  endList(pParse, 
5840: 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f  pSort, pMWin->pO
5850: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
5860: 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f 72   pSort && p->pOr
5870: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
5880: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
5890: 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 2c  stCompare(pSort,
58a0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
58b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
58c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
58d0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
58e0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20  derBy);.        
58f0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
5900: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
5910: 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20      /* Assign a 
5920: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
5930: 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  r the ephemeral 
5940: 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75  table used to bu
5950: 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a  ffer rows..    *
5960: 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65  * The OpenEpheme
5970: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
5980: 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20  is coded later, 
5990: 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77  after it is know
59a0: 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e  n how.    ** man
59b0: 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61  y columns the ta
59c0: 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20  ble will have.  
59d0: 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45  */.    pMWin->iE
59e0: 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e  phCsr = pParse->
59f0: 6e 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 73 65 6c  nTab++;..    sel
5a00: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
5a10: 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d  EList(pParse, pM
5a20: 57 69 6e 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  Win, p->pEList, 
5a30: 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20  &pSublist);.    
5a40: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5a50: 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65 2c  iteEList(pParse,
5a60: 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 4f 72 64 65   pMWin, p->pOrde
5a70: 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74 29 3b  rBy, &pSublist);
5a80: 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42 75 66  .    pMWin->nBuf
5a90: 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69  ferCol = (pSubli
5aa0: 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e  st ? pSublist->n
5ab0: 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20  Expr : 0);..    
5ac0: 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 50 41  /* Append the PA
5ad0: 52 54 49 54 49 4f 4e 20 42 59 20 61 6e 64 20 4f  RTITION BY and O
5ae0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
5af0: 6f 6e 73 20 74 6f 20 74 68 65 20 74 6f 20 74 68  ons to the to th
5b00: 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65  e .    ** sub-se
5b10: 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20  lect expression 
5b20: 6c 69 73 74 2e 20 54 68 65 79 20 61 72 65 20 72  list. They are r
5b30: 65 71 75 69 72 65 64 20 74 6f 20 66 69 67 75 72  equired to figur
5b40: 65 20 6f 75 74 20 77 68 65 72 65 20 0a 20 20 20  e out where .   
5b50: 20 2a 2a 20 62 6f 75 6e 64 61 72 69 65 73 20 66   ** boundaries f
5b60: 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20 61 6e  or partitions an
5b70: 64 20 73 65 74 73 20 6f 66 20 70 65 65 72 20 72  d sets of peer r
5b80: 6f 77 73 20 6c 69 65 2e 20 20 2a 2f 0a 20 20 20  ows lie.  */.   
5b90: 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72   pSublist = expr
5ba0: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
5bb0: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
5bc0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
5bd0: 6f 6e 29 3b 0a 20 20 20 20 70 53 75 62 6c 69 73  on);.    pSublis
5be0: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
5bf0: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
5c00: 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e  Sublist, pMWin->
5c10: 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 20 20  pOrderBy);..    
5c20: 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 61 72  /* Append the ar
5c30: 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
5c40: 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  o each window fu
5c50: 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a 20 20  nction to the.  
5c60: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 20    ** sub-select 
5c70: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
5c80: 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 74   Also allocate t
5c90: 77 6f 20 72 65 67 69 73 74 65 72 73 20 66 6f 72  wo registers for
5ca0: 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77 69 6e   each.    ** win
5cb0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d 20 6f  dow function - o
5cc0: 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63 75 6d  ne for the accum
5cd0: 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65 72 20  ulator, another 
5ce0: 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20 20 20  for interim.    
5cf0: 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a  ** results.  */.
5d00: 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57      for(pWin=pMW
5d10: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
5d20: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
5d30: 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41 72 67        pWin->iArg
5d40: 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74 20  Col = (pSublist 
5d50: 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70  ? pSublist->nExp
5d60: 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70 53  r : 0);.      pS
5d70: 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73  ublist = exprLis
5d80: 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72  tAppendList(pPar
5d90: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 57  se, pSublist, pW
5da0: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
5db0: 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ist);.      if( 
5dc0: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
5dd0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
5de0: 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
5df0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 57 69 6e  ExprDup(db, pWin
5e00: 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20  ->pFilter, 0);. 
5e10: 20 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20         pSublist 
5e20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5e30: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
5e40: 70 53 75 62 6c 69 73 74 2c 20 70 46 69 6c 74 65  pSublist, pFilte
5e50: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
5e60: 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d    pWin->regAccum
5e70: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
5e80: 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72  m;.      pWin->r
5e90: 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70 50 61  egResult = ++pPa
5ea0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
5eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5ec0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
5ed0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
5ee0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
5ef0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
5f00: 4f 52 44 45 52 20 42 59 20 6f 72 20 50 41 52 54  ORDER BY or PART
5f10: 49 54 49 4f 4e 20 42 59 20 63 6c 61 75 73 65 2c  ITION BY clause,
5f20: 20 61 6e 64 20 74 68 65 20 77 69 6e 64 6f 77 0a   and the window.
5f30: 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
5f40: 61 63 63 65 70 74 73 20 7a 65 72 6f 20 61 72 67  accepts zero arg
5f50: 75 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68 65 72  uments, and ther
5f60: 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 63  e are no other c
5f70: 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20 73 65  olumns.    ** se
5f80: 6c 65 63 74 65 64 20 28 65 2e 67 2e 20 22 53 45  lected (e.g. "SE
5f90: 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65 72 28  LECT row_number(
5fa0: 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d 20 74  ) OVER () FROM t
5fb0: 31 22 29 2c 20 69 74 20 69 73 20 70 6f 73 73 69  1"), it is possi
5fc0: 62 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ble.    ** that 
5fd0: 70 53 75 62 6c 69 73 74 20 69 73 20 73 74 69 6c  pSublist is stil
5fe0: 6c 20 4e 55 4c 4c 20 68 65 72 65 2e 20 41 64 64  l NULL here. Add
5ff0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72   a constant expr
6000: 65 73 73 69 6f 6e 20 68 65 72 65 20 74 6f 20 0a  ession here to .
6010: 20 20 20 20 2a 2a 20 6b 65 65 70 20 65 76 65 72      ** keep ever
6020: 79 74 68 69 6e 67 20 6c 65 67 61 6c 20 69 6e 20  ything legal in 
6030: 74 68 69 73 20 63 61 73 65 2e 20 0a 20 20 20 20  this case. .    
6040: 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 6c  */.    if( pSubl
6050: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
6060: 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c 69 74  pSublist = sqlit
6070: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6080: 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20 20 20  (pParse, 0, .   
6090: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
60a0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
60b0: 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33  NTEGER, &sqlite3
60c0: 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29  IntTokens[0], 0)
60d0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
60e0: 0a 20 20 20 20 70 53 75 62 20 3d 20 73 71 6c 69  .    pSub = sqli
60f0: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
6100: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
6110: 75 62 6c 69 73 74 2c 20 70 53 72 63 2c 20 70 57  ublist, pSrc, pW
6120: 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  here, pGroupBy, 
6130: 70 48 61 76 69 6e 67 2c 20 70 53 6f 72 74 2c 20  pHaving, pSort, 
6140: 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20  0, 0.    );.    
6150: 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  p->pSrc = sqlite
6160: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
6170: 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
6180: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63   assert( p->pSrc
6190: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
61a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
61b0: 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20 20 20  p->pSrc ){.     
61c0: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
61d0: 53 65 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a 20  Select = pSub;. 
61e0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
61f0: 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
6200: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
6210: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
6220: 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75 65  ite3ExpandSubque
6230: 72 79 28 70 50 61 72 73 65 2c 20 26 70 2d 3e 70  ry(pParse, &p->p
6240: 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20  Src->a[0]) ){.  
6250: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6260: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
6270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53  else{.        pS
6280: 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  ub->selFlags |= 
6290: 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 20  SF_Expanded;.   
62a0: 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
62b0: 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61 74   &= ~SF_Aggregat
62c0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
62d0: 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
62e0: 72 73 65 2c 20 70 53 75 62 2c 20 30 29 3b 0a 20  rse, pSub, 0);. 
62f0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
6300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6310: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
6320: 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ral, pMWin->iEph
6330: 43 73 72 2c 20 70 53 75 62 6c 69 73 74 2d 3e 6e  Csr, pSublist->n
6340: 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Expr);.    }else
6350: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
6360: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
6370: 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSub);.    }.   
6380: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
6390: 61 69 6c 65 64 20 29 20 72 63 20 3d 20 53 51 4c  ailed ) rc = SQL
63a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
63b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
63c0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 57  /*.** Free the W
63d0: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 61 73  indow object pas
63e0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
63f0: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
6400: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
6410: 77 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  wDelete(sqlite3 
6420: 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b  *db, Window *p){
6430: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
6440: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6450: 65 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72  e(db, p->pFilter
6460: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6470: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
6480: 20 70 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b   p->pPartition);
6490: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
64a0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
64b0: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
64c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
64d0: 74 65 28 64 62 2c 20 70 2d 3e 70 45 6e 64 29 3b  te(db, p->pEnd);
64e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
64f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
6500: 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tart);.    sqlit
6510: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
6520: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
6530: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
6540: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
6550: 72 65 65 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  ree the linked l
6560: 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62  ist of Window ob
6570: 6a 65 63 74 73 20 73 74 61 72 74 69 6e 67 20 61  jects starting a
6580: 74 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  t the second arg
6590: 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
65a0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
65b0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
65c0: 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
65d0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
65e0: 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 78 74 20    Window *pNext 
65f0: 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a 20  = p->pNextWin;. 
6600: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
6610: 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20  Delete(db, p);. 
6620: 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20     p = pNext;.  
6630: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
6640: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
6650: 20 6e 65 77 20 57 69 6e 64 6f 77 20 6f 62 6a 65   new Window obje
6660: 63 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73  ct..*/.Window *s
6670: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c 6c 6f  qlite3WindowAllo
6680: 63 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c(.  Parse *pPar
6690: 73 65 2c 20 0a 20 20 69 6e 74 20 65 54 79 70 65  se, .  int eType
66a0: 2c 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20  ,.  int eStart, 
66b0: 45 78 70 72 20 2a 70 53 74 61 72 74 2c 0a 20 20  Expr *pStart,.  
66c0: 69 6e 74 20 65 45 6e 64 2c 20 45 78 70 72 20 2a  int eEnd, Expr *
66d0: 70 45 6e 64 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  pEnd.){.  Window
66e0: 20 2a 70 57 69 6e 20 3d 20 30 3b 0a 0a 20 20 69   *pWin = 0;..  i
66f0: 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  f( eType==TK_RAN
6700: 47 45 20 26 26 20 28 70 53 74 61 72 74 20 7c 7c  GE && (pStart ||
6710: 20 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 73 71   pEnd) ){.    sq
6720: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6730: 61 72 73 65 2c 20 22 52 41 4e 47 45 20 25 73 20  arse, "RANGE %s 
6740: 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65  is only supporte
6750: 64 20 77 69 74 68 20 55 4e 42 4f 55 4e 44 45 44  d with UNBOUNDED
6760: 22 2c 0a 20 20 20 20 20 20 20 20 28 70 53 74 61  ",.        (pSta
6770: 72 74 20 3f 20 22 50 52 45 43 45 44 49 4e 47 22  rt ? "PRECEDING"
6780: 20 3a 20 22 46 4f 4c 4c 4f 57 49 4e 47 22 29 0a   : "FOLLOWING").
6790: 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
67a0: 20 20 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64      pWin = (Wind
67b0: 6f 77 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  ow*)sqlite3DbMal
67c0: 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e  locZero(pParse->
67d0: 64 62 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f  db, sizeof(Windo
67e0: 77 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  w));.  }..  if( 
67f0: 70 57 69 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  pWin ){.    asse
6800: 72 74 28 20 65 54 79 70 65 20 29 3b 0a 20 20 20  rt( eType );.   
6810: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65   pWin->eType = e
6820: 54 79 70 65 3b 0a 20 20 20 20 70 57 69 6e 2d 3e  Type;.    pWin->
6830: 65 53 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b  eStart = eStart;
6840: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20  .    pWin->eEnd 
6850: 3d 20 65 45 6e 64 3b 0a 20 20 20 20 70 57 69 6e  = eEnd;.    pWin
6860: 2d 3e 70 45 6e 64 20 3d 20 70 45 6e 64 3b 0a 20  ->pEnd = pEnd;. 
6870: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
6880: 3d 20 70 53 74 61 72 74 3b 0a 20 20 7d 65 6c 73  = pStart;.  }els
6890: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
68a0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
68b0: 3e 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  >db, pEnd);.    
68c0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
68d0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  e(pParse->db, pS
68e0: 74 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  tart);.  }..  re
68f0: 74 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a  turn pWin;.}../*
6900: 0a 2a 2a 20 41 74 74 61 63 68 20 77 69 6e 64 6f  .** Attach windo
6910: 77 20 6f 62 6a 65 63 74 20 70 57 69 6e 20 74 6f  w object pWin to
6920: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a   expression p..*
6930: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
6940: 6e 64 6f 77 41 74 74 61 63 68 28 50 61 72 73 65  ndowAttach(Parse
6950: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
6960: 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29  p, Window *pWin)
6970: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
6980: 20 70 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e 3b   p->pWin = pWin;
6990: 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20 29 20  .    if( pWin ) 
69a0: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70  pWin->pOwner = p
69b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
69c0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
69d0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
69e0: 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Win);.  }.}../*.
69f0: 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  ** Return 0 if t
6a00: 68 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62  he two window ob
6a10: 6a 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69  jects are identi
6a20: 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cal, or non-zero
6a30: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49   otherwise..** I
6a40: 64 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20  dentical window 
6a50: 6f 62 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70  objects can be p
6a60: 72 6f 63 65 73 73 65 64 20 69 6e 20 61 20 73 69  rocessed in a si
6a70: 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e  ngle scan..*/.in
6a80: 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  t sqlite3WindowC
6a90: 6f 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50  ompare(Parse *pP
6aa0: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31  arse, Window *p1
6ab0: 2c 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20  , Window *p2){. 
6ac0: 20 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d   if( p1->eType!=
6ad0: 70 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75  p2->eType ) retu
6ae0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e  rn 1;.  if( p1->
6af0: 65 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61  eStart!=p2->eSta
6b00: 72 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  rt ) return 1;. 
6b10: 20 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70   if( p1->eEnd!=p
6b20: 32 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e  2->eEnd ) return
6b30: 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   1;.  if( sqlite
6b40: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61  3ExprCompare(pPa
6b50: 72 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c  rse, p1->pStart,
6b60: 20 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29   p2->pStart, -1)
6b70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6b80: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
6b90: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
6ba0: 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64  ->pEnd, p2->pEnd
6bb0: 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31  , -1) ) return 1
6bc0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
6bd0: 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
6be0: 31 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70  1->pPartition, p
6bf0: 32 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d  2->pPartition, -
6c00: 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  1) ) return 1;. 
6c10: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
6c20: 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e  ListCompare(p1->
6c30: 70 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f  pOrderBy, p2->pO
6c40: 72 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65  rderBy, -1) ) re
6c50: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
6c60: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   0;.}.../*.** Th
6c70: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  is is called by 
6c80: 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63  code in select.c
6c90: 20 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73   before it calls
6ca0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
6cb0: 69 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e  in().** to begin
6cc0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
6cd0: 67 68 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  gh the sub-query
6ce0: 20 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20   results. It is 
6cf0: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
6d00: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
6d10: 7a 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ze registers and
6d20: 20 63 75 72 73 6f 72 73 20 75 73 65 64 20 62 79   cursors used by
6d30: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
6d40: 64 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  deStep()..*/.voi
6d50: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  d sqlite3WindowC
6d60: 6f 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70  odeInit(Parse *p
6d70: 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70  Parse, Window *p
6d80: 4d 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20  MWin){.  Window 
6d90: 2a 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  *pWin;.  Vdbe *v
6da0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
6db0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
6dc0: 20 6e 50 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d   nPart = (pMWin-
6dd0: 3e 70 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d  >pPartition ? pM
6de0: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d  Win->pPartition-
6df0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e  >nExpr : 0);.  n
6e00: 50 61 72 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e  Part += (pMWin->
6e10: 70 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e  pOrderBy ? pMWin
6e20: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
6e30: 72 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 50  r : 0);.  if( nP
6e40: 61 72 74 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e  art ){.    pMWin
6e50: 2d 3e 72 65 67 50 61 72 74 20 3d 20 70 50 61 72  ->regPart = pPar
6e60: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
6e70: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6e80: 6e 50 61 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  nPart;.    sqlit
6e90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6ea0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69  OP_Null, 0, pMWi
6eb0: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69  n->regPart, pMWi
6ec0: 6e 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61 72 74  n->regPart+nPart
6ed0: 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  -1);.  }..  for(
6ee0: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
6ef0: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
6f00: 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63  xtWin){.    Func
6f10: 44 65 66 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70  Def *p = pWin->p
6f20: 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 28 70  Func;.    if( (p
6f30: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
6f40: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
6f50: 29 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72  ) && pWin->eStar
6f60: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
6f70: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
6f80: 69 6e 6c 69 6e 65 20 76 65 72 73 69 6f 6e 73 20  inline versions 
6f90: 6f 66 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78  of min() and max
6fa0: 28 29 20 72 65 71 75 69 72 65 20 61 20 73 69 6e  () require a sin
6fb0: 67 6c 65 20 65 70 68 65 6d 65 72 61 6c 0a 20 20  gle ephemeral.  
6fc0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64      ** table and
6fd0: 20 33 20 72 65 67 69 73 74 65 72 73 2e 20 54 68   3 registers. Th
6fe0: 65 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  e registers are 
6ff0: 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  used as follows:
7000: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
7010: 2a 2a 20 20 20 72 65 67 41 70 70 2b 30 3a 20 73  **   regApp+0: s
7020: 6c 6f 74 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28  lot to copy min(
7030: 29 2f 6d 61 78 28 29 20 61 72 67 75 6d 65 6e 74  )/max() argument
7040: 20 74 6f 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f   to for MakeReco
7050: 72 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  rd.      **   re
7060: 67 41 70 70 2b 31 3a 20 69 6e 74 65 67 65 72 20  gApp+1: integer 
7070: 76 61 6c 75 65 20 75 73 65 64 20 74 6f 20 65 6e  value used to en
7080: 73 75 72 65 20 6b 65 79 73 20 61 72 65 20 75 6e  sure keys are un
7090: 69 71 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20  ique.      **   
70a0: 72 65 67 41 70 70 2b 32 3a 20 6f 75 74 70 75 74  regApp+2: output
70b0: 20 6f 66 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20   of MakeRecord. 
70c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78       */.      Ex
70d0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
70e0: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
70f0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 4b 65 79  pList;.      Key
7100: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
7110: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
7120: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
7130: 73 65 2c 20 70 4c 69 73 74 2c 20 30 2c 20 30 29  se, pList, 0, 0)
7140: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73  ;.      pWin->cs
7150: 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rApp = pParse->n
7160: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69  Tab++;.      pWi
7170: 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72  n->regApp = pPar
7180: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
7190: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
71a0: 3d 20 33 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 3;.      if( p
71b0: 4b 65 79 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d  KeyInfo && pWin-
71c0: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d  >pFunc->zName[1]
71d0: 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 20  =='i' ){.       
71e0: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
71f0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  o->aSortOrder[0]
7200: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
7210: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
7220: 64 65 72 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20  der[0] = 1;.    
7230: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7240: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7250: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
7260: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32   pWin->csrApp, 2
7270: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7280: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
7290: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
72a0: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c  INFO);.      sql
72b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
72c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
72d0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29   pWin->regApp+1)
72e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
72f0: 20 69 66 28 20 70 2d 3e 78 53 46 75 6e 63 3d 3d   if( p->xSFunc==
7300: 6e 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e  nth_valueStepFun
7310: 63 20 7c 7c 20 70 2d 3e 78 53 46 75 6e 63 3d 3d  c || p->xSFunc==
7320: 66 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46  first_valueStepF
7330: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  unc ){.      /* 
7340: 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67  Allocate two reg
7350: 69 73 74 65 72 73 20 61 74 20 70 57 69 6e 2d 3e  isters at pWin->
7360: 72 65 67 41 70 70 2e 20 54 68 65 73 65 20 77 69  regApp. These wi
7370: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  ll be used to.  
7380: 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
7390: 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 69   start and end i
73a0: 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75 72 72  ndex of the curr
73b0: 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20  ent frame.  */. 
73c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57       assert( pMW
73d0: 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20  in->iEphCsr );. 
73e0: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70       pWin->regAp
73f0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  p = pParse->nMem
7400: 2b 31 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  +1;.      pWin->
7410: 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d  csrApp = pParse-
7420: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
7430: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32  Parse->nMem += 2
7440: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7460: 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63  OpenDup, pWin->c
7470: 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45  srApp, pMWin->iE
7480: 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20  phCsr);.    }.  
7490: 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 78 53    else if( p->xS
74a0: 46 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75  Func==leadStepFu
74b0: 6e 63 20 7c 7c 20 70 2d 3e 78 53 46 75 6e 63 3d  nc || p->xSFunc=
74c0: 3d 6c 61 67 53 74 65 70 46 75 6e 63 20 29 7b 0a  =lagStepFunc ){.
74d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
74e0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a  Win->iEphCsr );.
74f0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41        pWin->csrA
7500: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  pp = pParse->nTa
7510: 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b++;.      sqlit
7520: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7530: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e  OP_OpenDup, pWin
7540: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
7550: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d  >iEphCsr);.    }
7560: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
7570: 22 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70 72  "PRECEDING <expr
7580: 3e 22 20 28 62 45 6e 64 3d 3d 30 29 20 6f 72 20  >" (bEnd==0) or 
7590: 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78 70 72  "FOLLOWING <expr
75a0: 3e 22 20 28 62 45 6e 64 3d 3d 31 29 20 68 61 73  >" (bEnd==1) has
75b0: 20 6a 75 73 74 20 0a 2a 2a 20 62 65 65 6e 20 65   just .** been e
75c0: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74 68 65  valuated and the
75d0: 20 72 65 73 75 6c 74 20 6c 65 66 74 20 69 6e 20   result left in 
75e0: 72 65 67 69 73 74 65 72 20 72 65 67 2e 20 54 68  register reg. Th
75f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65  is function gene
7600: 72 61 74 65 73 0a 2a 2a 20 56 4d 20 63 6f 64 65  rates.** VM code
7610: 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74   to check that t
7620: 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 6f  he value is a no
7630: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
7640: 65 72 20 61 6e 64 20 74 68 72 6f 77 73 0a 2a 2a  er and throws.**
7650: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66   an exception if
7660: 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73   it is not..*/.s
7670: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
7680: 77 43 68 65 63 6b 46 72 61 6d 65 56 61 6c 75 65  wCheckFrameValue
7690: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
76a0: 69 6e 74 20 72 65 67 2c 20 69 6e 74 20 62 45 6e  int reg, int bEn
76b0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
76c0: 73 74 20 63 68 61 72 20 2a 61 7a 45 72 72 5b 5d  st char *azErr[]
76d0: 20 3d 20 7b 0a 20 20 20 20 22 66 72 61 6d 65 20   = {.    "frame 
76e0: 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65 74 20  starting offset 
76f0: 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65  must be a non-ne
7700: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c  gative integer",
7710: 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e 64 69  .    "frame endi
7720: 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62  ng offset must b
7730: 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  e a non-negative
7740: 20 69 6e 74 65 67 65 72 22 0a 20 20 7d 3b 0a 20   integer".  };. 
7750: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
7760: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7770: 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a 65 72 6f  );.  int regZero
7780: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7790: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
77a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
77b0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
77c0: 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20   0, regZero);.  
77d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
77e0: 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
77f0: 74 2c 20 72 65 67 2c 20 73 71 6c 69 74 65 33 56  t, reg, sqlite3V
7800: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
7810: 29 2b 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  )+2);.  sqlite3V
7820: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7830: 47 65 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c  Ge, regZero, sql
7840: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7850: 64 64 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a  ddr(v)+2, reg);.
7860: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
7870: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
7880: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c  AddOp2(v, OP_Hal
7890: 74 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  t, SQLITE_ERROR,
78a0: 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71   OE_Abort);.  sq
78b0: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
78c0: 34 28 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72  4(v, (void*)azEr
78d0: 72 5b 62 45 6e 64 5d 2c 20 50 34 5f 53 54 41 54  r[bEnd], P4_STAT
78e0: 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  IC);.  sqlite3Re
78f0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
7900: 72 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d  rse, regZero);.}
7910: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7920: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  he number of arg
7930: 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
7940: 20 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63   the window-func
7950: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a  tion associated.
7960: 2a 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65  ** with the obje
7970: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
7980: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74   only argument t
7990: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
79a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
79b0: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69  indowArgCount(Wi
79c0: 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45  ndow *pWin){.  E
79d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
79e0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
79f0: 2e 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e  .pList;.  return
7a00: 20 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d   (pList ? pList-
7a10: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a  >nExpr : 0);.}..
7a20: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
7a30: 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65  M code to invoke
7a40: 20 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20   either xStep() 
7a50: 28 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20  (if bInverse is 
7a60: 30 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72  0) or .** xInver
7a70: 73 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20  se (if bInverse 
7a80: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72  is non-zero) for
7a90: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
7aa0: 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a  ction in the .**
7ab0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
7ac0: 72 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20  rting at pMWin. 
7ad0: 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e  Or, for built-in
7ae0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
7af0: 73 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74  s.** that do not
7b00: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
7b10: 64 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20  d function API, 
7b20: 67 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71  generate the req
7b30: 75 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20  uired.** inline 
7b40: 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49  VM code..**.** I
7b50: 66 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69  f argument csr i
7b60: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
7b70: 72 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68  r equal to 0, th
7b80: 65 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20  en argument reg 
7b90: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
7ba0: 72 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61  register in an a
7bb0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
7bc0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
7bd0: 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
7be0: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61  gh to hold the a
7bf0: 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
7c00: 73 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74  s for each funct
7c10: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
7c20: 65 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e  e.** the argumen
7c30: 74 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ts are extracted
7c40: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
7c50: 74 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74  t row of csr int
7c60: 6f 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f  o the.** array o
7c70: 66 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f  f registers befo
7c80: 72 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41  re invoking OP_A
7c90: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67  ggStep or OP_Agg
7ca0: 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72  Inverse.**.** Or
7cb0: 2c 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73  , if csr is less
7cc0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
7cd0: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65   the array of re
7ce0: 67 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69  gisters at reg i
7cf0: 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70  s.** already pop
7d00: 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20  ulated with all 
7d10: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65  columns from the
7d20: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
7d30: 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
7d40: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
7d50: 20 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20   regPartSize is 
7d60: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
7d70: 74 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  t is a register 
7d80: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a  containing the.*
7d90: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
7da0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
7db0: 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  partition..*/.st
7dc0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
7dd0: 41 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65  AggStep(.  Parse
7de0: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e   *pParse, .  Win
7df0: 64 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20  dow *pMWin,     
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e10: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77  Linked list of w
7e20: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
7e30: 2a 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20  */.  int csr,   
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67       /* Read arg
7e60: 75 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73  uments from this
7e70: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74   cursor */.  int
7e80: 20 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20   bInverse,      
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ea0: 54 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78  True to invoke x
7eb0: 49 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20  Inverse instead 
7ec0: 6f 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e  of xStep */.  in
7ed0: 74 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20  t reg,          
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ef0: 20 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   Array of regist
7f00: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ers */.  int reg
7f10: 50 61 72 74 53 69 7a 65 20 20 20 20 20 20 20 20  PartSize        
7f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
7f30: 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ster containing 
7f40: 73 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69 6f  size of partitio
7f50: 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  n */.){.  Vdbe *
7f60: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
7f70: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69  be(pParse);.  Wi
7f80: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f  ndow *pWin;.  fo
7f90: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
7fa0: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
7fb0: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 6e  NextWin){.    in
7fc0: 74 20 66 6c 61 67 73 20 3d 20 70 57 69 6e 2d 3e  t flags = pWin->
7fd0: 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
7fe0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 72 67  ;.    int regArg
7ff0: 3b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d  ;.    int nArg =
8000: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
8010: 70 57 69 6e 29 3b 0a 0a 20 20 20 20 69 66 28 20  pWin);..    if( 
8020: 63 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  csr>=0 ){.      
8030: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
8040: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
8050: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
8060: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8070: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c   OP_Column, csr,
8080: 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69   pWin->iArgCol+i
8090: 2c 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20  , reg+i);.      
80a0: 7d 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d  }.      regArg =
80b0: 20 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20   reg;.      if( 
80c0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
80d0: 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 20  UNC_WINDOW_SIZE 
80e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
80f0: 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Arg==0 ){.      
8100: 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67      regArg = reg
8110: 50 61 72 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  PartSize;.      
8120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8130: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8140: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
8150: 2c 20 72 65 67 50 61 72 74 53 69 7a 65 2c 20 72  , regPartSize, r
8160: 65 67 2b 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  eg+nArg);.      
8170: 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 72 67    }.        nArg
8180: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
8190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
81a0: 65 72 74 28 20 21 28 66 6c 61 67 73 20 26 20 53  ert( !(flags & S
81b0: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
81c0: 57 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 20  W_SIZE) );.     
81d0: 20 72 65 67 41 72 67 20 3d 20 72 65 67 20 2b 20   regArg = reg + 
81e0: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20  pWin->iArgCol;. 
81f0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
8200: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
8210: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
8220: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20  UNC_MINMAX) .   
8230: 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61     && pWin->eSta
8240: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
8250: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
8260: 66 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 29  f( bInverse==0 )
8270: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8280: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8290: 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e  P_AddImm, pWin->
82a0: 72 65 67 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20  regApp+1, 1);.  
82b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
82c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
82d0: 6f 70 79 2c 20 72 65 67 41 72 67 2c 20 70 57 69  opy, regArg, pWi
82e0: 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20  n->regApp);.    
82f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8300: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8310: 52 65 63 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65  Record, pWin->re
8320: 67 41 70 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72  gApp, 2, pWin->r
8330: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
8340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8350: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
8360: 65 72 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  ert, pWin->csrAp
8370: 70 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  p, pWin->regApp+
8380: 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
8390: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
83a0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
83b0: 20 4f 50 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e   OP_SeekGE, pWin
83c0: 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 72 65 67  ->csrApp, 0, reg
83d0: 41 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Arg, 1);.       
83e0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
83f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8400: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
8410: 50 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e  P_Delete, pWin->
8420: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 20  csrApp);.       
8430: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
8440: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
8450: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
8460: 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )-2);.      }.  
8470: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e    }else if( pWin
8480: 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20  ->regApp ){.    
8490: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e    assert( pWin->
84a0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e  pFunc->xSFunc==n
84b0: 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  th_valueStepFunc
84c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
84d0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46  pWin->pFunc->xSF
84e0: 75 6e 63 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  unc==first_value
84f0: 53 74 65 70 46 75 6e 63 20 0a 20 20 20 20 20 20  StepFunc .      
8500: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8510: 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c 20   bInverse==0 || 
8520: 62 49 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a 20  bInverse==1 );. 
8530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8540: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
8550: 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Imm, pWin->regAp
8560: 70 2b 31 2d 62 49 6e 76 65 72 73 65 2c 20 31 29  p+1-bInverse, 1)
8570: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8580: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53 46  pWin->pFunc->xSF
8590: 75 6e 63 3d 3d 6c 65 61 64 53 74 65 70 46 75 6e  unc==leadStepFun
85a0: 63 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  c .           ||
85b0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 78 53   pWin->pFunc->xS
85c0: 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e  Func==lagStepFun
85d0: 63 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  c .    ){.      
85e0: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
85f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
8600: 20 61 64 64 72 49 66 20 3d 20 30 3b 0a 20 20 20   addrIf = 0;.   
8610: 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69     if( pWin->pFi
8620: 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  lter ){.        
8630: 69 6e 74 20 72 65 67 54 6d 70 3b 0a 20 20 20 20  int regTmp;.    
8640: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
8650: 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  ==pWin->pOwner->
8660: 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  x.pList->nExpr )
8670: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 73  ;.        if( cs
8680: 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r>0 ){.         
8690: 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69 74 65   regTmp = sqlite
86a0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
86b0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
86c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
86d0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
86e0: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
86f0: 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b 0a  l+nArg,regTmp);.
8700: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8710: 20 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20           regTmp 
8720: 3d 20 72 65 67 41 72 67 20 2b 20 6e 41 72 67 3b  = regArg + nArg;
8730: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8740: 20 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c 69     addrIf = sqli
8750: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8760: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 54 6d   OP_IfNot, regTm
8770: 70 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  p, 0, 1);.      
8780: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
8790: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
87a0: 73 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  sr>0 ){.        
87b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
87c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
87d0: 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20  regTmp);.       
87e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
87f0: 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63   if( pWin->pFunc
8800: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
8810: 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
8820: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  LL ){.        Co
8830: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
8840: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
8850: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
8860: 65 71 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2d  eq(pParse, pWin-
8870: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
8880: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
8890: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
88a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
88b0: 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30 2c 20 28  ollSeq, 0,0,0, (
88c0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 43 6f 6c  const char*)pCol
88d0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
88e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
88f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8900: 76 2c 20 62 49 6e 76 65 72 73 65 3f 20 4f 50 5f  v, bInverse? OP_
8910: 41 67 67 49 6e 76 65 72 73 65 20 3a 20 4f 50 5f  AggInverse : OP_
8920: 41 67 67 53 74 65 70 2c 20 0a 20 20 20 20 20 20  AggStep, .      
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 62 49 6e 76 65 72 73 65 2c 20 72 65 67 41    bInverse, regA
8950: 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63  rg, pWin->regAcc
8960: 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  um);.      sqlit
8970: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
8980: 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
8990: 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
89a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
89b0: 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
89c0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  g);.      if( ad
89d0: 64 72 49 66 20 29 20 73 71 6c 69 74 65 33 56 64  drIf ) sqlite3Vd
89e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
89f0: 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  drIf);.    }.  }
8a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
8a10: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
8a20: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56 61 6c  voke either xVal
8a30: 75 65 28 29 20 28 62 46 69 6e 61 6c 3d 3d 30 29  ue() (bFinal==0)
8a40: 20 6f 72 20 78 46 69 6e 61 6c 69 7a 65 28 29 0a   or xFinalize().
8a50: 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d 31 29 20 66  ** (bFinal==1) f
8a60: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
8a70: 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 6c  unction in the l
8a80: 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
8a90: 69 6e 67 20 61 74 0a 2a 2a 20 70 4d 57 69 6e 2e  ing at.** pMWin.
8aa0: 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69   Or, for built-i
8ab0: 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f  n window-functio
8ac0: 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75  ns that do not u
8ad0: 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 0a  se the standard.
8ae0: 2a 2a 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65  ** API, generate
8af0: 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
8b00: 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  VM code..*/.stat
8b10: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41 67  ic void windowAg
8b20: 67 46 69 6e 61 6c 28 50 61 72 73 65 20 2a 70 50  gFinal(Parse *pP
8b30: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d  arse, Window *pM
8b40: 57 69 6e 2c 20 69 6e 74 20 62 46 69 6e 61 6c 29  Win, int bFinal)
8b50: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
8b60: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
8b70: 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a  rse);.  Window *
8b80: 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70 57 69  pWin;..  for(pWi
8b90: 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
8ba0: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
8bb0: 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 28 70 57  in){.    if( (pW
8bc0: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
8bd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
8be0: 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
8bf0: 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74   && pWin->eStart
8c00: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a  !=TK_UNBOUNDED .
8c10: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
8c20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8c30: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
8c40: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
8c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8c60: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
8c70: 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  st, pWin->csrApp
8c80: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
8c90: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
8ca0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8cb0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8cc0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 30 2c  pWin->csrApp, 0,
8cd0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
8ce0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8cf0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
8d00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
8d10: 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20  ntAddr(v)-2);.  
8d20: 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20 29      if( bFinal )
8d30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8d40: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
8d50: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
8d60: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
8d70: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
8d80: 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  if( pWin->regApp
8d90: 20 29 7b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   ){.    }else{. 
8da0: 20 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c 20       if( bFinal 
8db0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8dc0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8dd0: 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69  OP_AggFinal, pWi
8de0: 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 77 69 6e  n->regAccum, win
8df0: 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e  dowArgCount(pWin
8e00: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
8e10: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
8e20: 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20  v, pWin->pFunc, 
8e30: 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
8e40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
8e60: 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  y, pWin->regAccu
8e70: 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  m, pWin->regResu
8e80: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  lt);.        sql
8e90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8ea0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
8eb0: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20  in->regAccum);. 
8ec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8ed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8ee0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 56  ddOp3(v, OP_AggV
8ef0: 61 6c 75 65 2c 20 70 57 69 6e 2d 3e 72 65 67 41  alue, pWin->regA
8f00: 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41 72 67 43  ccum, windowArgC
8f10: 6f 75 6e 74 28 70 57 69 6e 29 2c 0a 20 20 20 20  ount(pWin),.    
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 72           pWin->r
8f40: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
8f50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
8f60: 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e  pendP4(v, pWin->
8f70: 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
8f80: 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  F);.      }.    
8f90: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
8fa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65 6e  his function gen
8fb0: 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20 74  erates VM code t
8fc0: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75 62  o invoke the sub
8fd0: 2d 72 6f 75 74 69 6e 65 20 61 74 20 61 64 64 72  -routine at addr
8fe0: 65 73 73 0a 2a 2a 20 6c 62 6c 46 6c 75 73 68 50  ess.** lblFlushP
8ff0: 61 72 74 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  art once for eac
9000: 68 20 70 61 72 74 69 74 69 6f 6e 20 77 69 74 68  h partition with
9010: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 74   the entire part
9020: 69 74 69 6f 6e 20 63 61 63 68 65 64 20 69 6e 0a  ition cached in.
9030: 2a 2a 20 74 68 65 20 57 69 6e 64 6f 77 2e 69 45  ** the Window.iE
9040: 70 68 43 73 72 20 74 65 6d 70 20 74 61 62 6c 65  phCsr temp table
9050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9060: 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e   windowPartition
9070: 43 61 63 68 65 28 0a 20 20 50 61 72 73 65 20 2a  Cache(.  Parse *
9080: 70 50 61 72 73 65 2c 0a 20 20 53 65 6c 65 63 74  pParse,.  Select
9090: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
90a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
90b0: 20 72 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43   rewritten SELEC
90c0: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
90d0: 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
90e0: 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
90f0: 20 2f 2a 20 57 68 65 72 65 49 6e 66 6f 20 74 6f   /* WhereInfo to
9100: 20 63 61 6c 6c 20 57 68 65 72 65 45 6e 64 28 29   call WhereEnd()
9110: 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67   on */.  int reg
9120: 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20 20 20  FlushPart,      
9130: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
9140: 73 74 65 72 20 74 6f 20 75 73 65 20 77 69 74 68  ster to use with
9150: 20 47 6f 73 75 62 20 6c 62 6c 46 6c 75 73 68 50   Gosub lblFlushP
9160: 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c  art */.  int lbl
9170: 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20 20 20  FlushPart,      
9180: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 72           /* Subr
9190: 6f 75 74 69 6e 65 20 74 6f 20 47 6f 73 75 62 20  outine to Gosub 
91a0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  to */.  int *pRe
91b0: 67 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  gSize           
91c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
91d0: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
91e0: 69 6e 67 20 70 61 72 74 69 74 69 6f 6e 20 73 69  ing partition si
91f0: 7a 65 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f  ze */.){.  Windo
9200: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
9210: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
9220: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9230: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 69 53  Parse);.  int iS
9240: 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72 63 2d  ubCsr = p->pSrc-
9250: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[0].iCursor;. 
9260: 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e 70   int nSub = p->p
9270: 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e  Src->a[0].pTab->
9280: 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b 3b 0a 0a  nCol;.  int k;..
9290: 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72    int reg = pPar
92a0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e  se->nMem+1;.  in
92b0: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65  t regRecord = re
92c0: 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65  g+nSub;.  int re
92d0: 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f  gRowid = regReco
92e0: 72 64 2b 31 3b 0a 0a 20 20 2a 70 52 65 67 53 69  rd+1;..  *pRegSi
92f0: 7a 65 20 3d 20 72 65 67 52 6f 77 69 64 3b 0a 20  ze = regRowid;. 
9300: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
9310: 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20 20 2f 2a   nSub + 2;..  /*
9320: 20 4d 61 72 74 69 61 6c 20 74 68 65 20 72 6f 77   Martial the row
9330: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
9340: 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 74 6f   sub-select into
9350: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 0a 20 20   an array of .  
9360: 2a 2a 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f  ** registers. */
9370: 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53  .  for(k=0; k<nS
9380: 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71  ub; k++){.    sq
9390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
93a0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
93b0: 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29  ubCsr, k, reg+k)
93c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
93d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
93e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c  MakeRecord, reg,
93f0: 20 6e 53 75 62 2c 20 72 65 67 52 65 63 6f 72 64   nSub, regRecord
9400: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
9410: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73 74  f this is the st
9420: 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70 61 72  art of a new par
9430: 74 69 74 69 6f 6e 2e 20 49 66 20 73 6f 2c 20 63  tition. If so, c
9440: 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 66 6c 75  all the.  ** flu
9450: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62  sh_partition sub
9460: 2d 72 6f 75 74 69 6e 65 2e 20 20 2a 2f 0a 20 20  -routine.  */.  
9470: 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  if( pMWin->pPart
9480: 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74  ition ){.    int
9490: 20 61 64 64 72 3b 0a 20 20 20 20 45 78 70 72 4c   addr;.    ExprL
94a0: 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57  ist *pPart = pMW
94b0: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a  in->pPartition;.
94c0: 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20      int nPart = 
94d0: 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pPart->nExpr;.  
94e0: 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74    int regNewPart
94f0: 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e   = reg + pMWin->
9500: 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20  nBufferCol;.    
9510: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
9520: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
9530: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
9540: 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c  Parse, pPart, 0,
9550: 20 30 29 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d   0);..    addr =
9560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9570: 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
9580: 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d  , regNewPart, pM
9590: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61  Win->regPart,nPa
95a0: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
95b0: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
95c0: 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c  (void*)pKeyInfo,
95d0: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
95e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
95f0: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
9600: 61 64 64 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20  addr+2, addr+4, 
9610: 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62  addr+2);.    Vdb
9620: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
9630: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9640: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
9650: 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
9660: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72  n->regPart, nPar
9670: 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t-1);.    sqlite
9680: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
9690: 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73  P_Gosub, regFlus
96a0: 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50  hPart, lblFlushP
96b0: 61 72 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  art);.  }..  /* 
96c0: 42 75 66 66 65 72 20 74 68 65 20 63 75 72 72 65  Buffer the curre
96d0: 6e 74 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70  nt row in the ep
96e0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a  hemeral table. *
96f0: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
9700: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
9710: 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  owid, pMWin->iEp
9720: 68 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b  hCsr, regRowid);
9730: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9740: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
9750: 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
9760: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65  r, regRecord, re
9770: 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45  gRowid);..  /* E
9780: 6e 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  nd of the input 
9790: 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  loop */.  sqlite
97a0: 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
97b0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20  );..  /* Invoke 
97c0: 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e  "flush_partition
97d0: 22 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  " to deal with t
97e0: 68 65 20 66 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c  he final (or onl
97f0: 79 29 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  y) partition */.
9800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9810: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
9820: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
9830: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 7d 0a  blFlushPart);.}.
9840: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
9850: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
9860: 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e 65 72   regGosub (gener
9870: 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  ated by code in 
9880: 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20  select.c) to.** 
9890: 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
98a0: 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77  nt row of Window
98b0: 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61 6c 6c  .iEphCsr. If all
98c0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
98d0: 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65 67 61  s are.** aggrega
98e0: 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  te window functi
98f0: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ons that use the
9900: 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c 20 61   standard API, a
9910: 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f   single.** OP_Go
9920: 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  sub instruction 
9930: 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68 69 73  is all that this
9940: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
9950: 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63 6f 64  es. Extra VM cod
9960: 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77  e.** for per-row
9970: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6f   processing is o
9980: 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
9990: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
99a0: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a  built-in window.
99b0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ** functions:.**
99c0: 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75 65 28  .**   nth_value(
99d0: 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76 61 6c  ).**   first_val
99e0: 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a  ue().**   lag().
99f0: 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73  **   lead().*/.s
9a00: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
9a10: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20  wReturnOneRow(. 
9a20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
9a30: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c    Window *pMWin,
9a40: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
9a50: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
9a60: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
9a70: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9a80: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
9a90: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
9aa0: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
9ab0: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
9ac0: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
9ad0: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
9ae0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20  >pFunc;.    if( 
9af0: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e  pFunc->xSFunc==n
9b00: 74 68 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63  th_valueStepFunc
9b10: 20 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d   .     || pFunc-
9b20: 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74 5f 76  >xSFunc==first_v
9b30: 61 6c 75 65 53 74 65 70 46 75 6e 63 20 0a 20 20  alueStepFunc .  
9b40: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63    ){.      int c
9b50: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
9b60: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
9b70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
9b80: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
9b90: 20 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73    int tmpReg = s
9ba0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
9bb0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
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 52 65 73 75 6c 74   pWin->regResult
9bf0: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 46  );..      if( pF
9c00: 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68  unc->xSFunc==nth
9c10: 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 20 29  _valueStepFunc )
9c20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9c30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9c40: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d  P_Column, pMWin-
9c50: 3e 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e  >iEphCsr, pWin->
9c60: 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67  iArgCol+1,tmpReg
9c70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9c80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9c90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9ca0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52  Integer, 1, tmpR
9cb0: 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
9cc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9cd0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
9ce0: 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65  tmpReg, pWin->re
9cf0: 67 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20  gApp, tmpReg);. 
9d00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9d10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c  AddOp3(v, OP_Gt,
9d20: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c   pWin->regApp+1,
9d30: 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20   lbl, tmpReg);. 
9d40: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
9d50: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
9d60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9d70: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63   OP_SeekRowid, c
9d80: 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29  sr, lbl, tmpReg)
9d90: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
9da0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
9db0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9dc0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
9dd0: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
9de0: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
9df0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
9e00: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
9e10: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
9e20: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
9e30: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
9e40: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  tmpReg);.    }. 
9e50: 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75 6e     else if( pFun
9e60: 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53  c->xSFunc==leadS
9e70: 74 65 70 46 75 6e 63 20 7c 7c 20 70 46 75 6e 63  tepFunc || pFunc
9e80: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 61 67 53 74 65  ->xSFunc==lagSte
9e90: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  pFunc ){.      i
9ea0: 6e 74 20 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e  nt nArg = pWin->
9eb0: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d  pOwner->x.pList-
9ec0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e  >nExpr;.      in
9ed0: 74 20 69 45 70 68 20 3d 20 70 4d 57 69 6e 2d 3e  t iEph = pMWin->
9ee0: 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 69  iEphCsr;.      i
9ef0: 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63  nt csr = pWin->c
9f00: 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74  srApp;.      int
9f10: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
9f20: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
9f30: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67        int tmpReg
9f40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9f50: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20  pReg(pParse);.. 
9f60: 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 33 20       if( nArg<3 
9f70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9f80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9f90: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
9fa0: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
9fb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9fc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9fd0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
9fe0: 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69  n, iEph, pWin->i
9ff0: 41 72 67 43 6f 6c 2b 32 2c 20 70 57 69 6e 2d 3e  ArgCol+2, pWin->
a000: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
a010: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a020: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a030: 50 5f 52 6f 77 69 64 2c 20 69 45 70 68 2c 20 74  P_Rowid, iEph, t
a040: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 69 66  mpReg);.      if
a050: 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20  ( nArg<2 ){.    
a060: 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 28 70      int val = (p
a070: 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65  Func->xSFunc==le
a080: 61 64 53 74 65 70 46 75 6e 63 20 3f 20 31 20 3a  adStepFunc ? 1 :
a090: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   -1);.        sq
a0a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a0b0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d  v, OP_AddImm, tm
a0c0: 70 52 65 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20  pReg, val);.    
a0d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a0e0: 20 69 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63   int op = (pFunc
a0f0: 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64 53 74  ->xSFunc==leadSt
a100: 65 70 46 75 6e 63 20 3f 20 4f 50 5f 41 64 64 20  epFunc ? OP_Add 
a110: 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a  : OP_Subtract);.
a120: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52          int tmpR
a130: 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  eg2 = sqlite3Get
a140: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a150: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a160: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a170: 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70  _Column, iEph, p
a180: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20  Win->iArgCol+1, 
a190: 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20  tmpReg2);.      
a1a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a1b0: 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65  Op3(v, op, tmpRe
a1c0: 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52  g2, tmpReg, tmpR
a1d0: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eg);.        sql
a1e0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a1f0: 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65  eg(pParse, tmpRe
a200: 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  g2);.      }..  
a210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a220: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
a230: 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c  Rowid, csr, lbl,
a240: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
a250: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
a260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a270: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a280: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
a290: 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d  ->iArgCol, pWin-
a2a0: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
a2b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
a2c0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
a2d0: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
a2e0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
a2f0: 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b  pParse, tmpReg);
a300: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
a310: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a320: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47  , OP_Gosub, regG
a330: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
a340: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
a350: 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  e the code gener
a360: 61 74 65 64 20 62 79 20 77 69 6e 64 6f 77 52 65  ated by windowRe
a370: 74 75 72 6e 4f 6e 65 52 6f 77 28 29 20 61 6e 64  turnOneRow() and
a380: 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  , optionally, th
a390: 65 0a 2a 2a 20 78 49 6e 76 65 72 73 65 28 29 20  e.** xInverse() 
a3a0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
a3b0: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
a3c0: 6e 2c 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f  n, for one or mo
a3d0: 72 65 20 72 6f 77 73 0a 2a 2a 20 66 72 6f 6d 20  re rows.** from 
a3e0: 74 68 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43  the Window.iEphC
a3f0: 73 72 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 54  sr temp table. T
a400: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
a410: 72 61 74 65 73 20 56 4d 20 63 6f 64 65 0a 2a 2a  rates VM code.**
a420: 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   similar to:.**.
a430: 2a 2a 20 20 20 77 68 69 6c 65 28 20 72 65 67 43  **   while( regC
a440: 74 72 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20 72  tr>0 ){.**     r
a450: 65 67 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20 20 20  egCtr--;.**     
a460: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
a470: 6f 77 28 29 0a 2a 2a 20 20 20 20 20 69 66 28 20  ow().**     if( 
a480: 62 49 6e 76 65 72 73 65 20 29 7b 0a 2a 2a 20 20  bInverse ){.**  
a490: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 0a       AggInverse.
a4a0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
a4b0: 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e 69 45 70  Next (Window.iEp
a4c0: 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a  hCsr).**   }.*/.
a4d0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
a4e0: 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a 20 20  owReturnRows(.  
a4f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
a500: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a520: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77 69 6e 64   /* List of wind
a530: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ow functions */.
a540: 20 20 69 6e 74 20 72 65 67 43 74 72 2c 20 20 20    int regCtr,   
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
a570: 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62 65 72 20  ntaining number 
a580: 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
a590: 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20   regGosub,      
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5b0: 52 65 67 69 73 74 65 72 20 66 6f 72 20 47 6f 73  Register for Gos
a5c0: 75 62 20 61 64 64 72 47 6f 73 75 62 20 2a 2f 0a  ub addrGosub */.
a5d0: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 2c    int addrGosub,
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
a600: 73 75 62 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20  sub-routine for 
a610: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20 2a 2f 0a  ReturnOneRow */.
a620: 20 20 69 6e 74 20 72 65 67 49 6e 76 41 72 67 2c    int regInvArg,
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
a650: 67 69 73 74 65 72 73 20 66 6f 72 20 78 49 6e 76  gisters for xInv
a660: 65 72 73 65 20 61 72 67 73 20 2a 2f 0a 20 20 69  erse args */.  i
a670: 6e 74 20 72 65 67 49 6e 76 53 69 7a 65 20 20 20  nt regInvSize   
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a690: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  * Register conta
a6a0: 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61  ining size of pa
a6b0: 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rtition */.){.  
a6c0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65  int addr;.  Vdbe
a6d0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
a6e0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a6f0: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
a700: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29  Parse, pMWin, 0)
a710: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
a720: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a730: 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43 74 72  OP_IfPos, regCtr
a740: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
a750: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 20 2c 31  rentAddr(v)+2 ,1
a760: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
a770: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
a780: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a790: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 77  Goto, 0, 0);.  w
a7a0: 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
a7b0: 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  w(pParse, pMWin,
a7c0: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
a7d0: 6f 73 75 62 29 3b 0a 20 20 69 66 28 20 72 65 67  osub);.  if( reg
a7e0: 49 6e 76 41 72 67 20 29 7b 0a 20 20 20 20 77 69  InvArg ){.    wi
a7f0: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
a800: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e  se, pMWin, pMWin
a810: 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c 20 72 65  ->iEphCsr, 1, re
a820: 67 49 6e 76 41 72 67 2c 20 72 65 67 49 6e 76 53  gInvArg, regInvS
a830: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ize);.  }.  sqli
a840: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
a850: 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d   OP_Next, pMWin-
a860: 3e 69 45 70 68 43 73 72 2c 20 61 64 64 72 29 3b  >iEphCsr, addr);
a870: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
a880: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
a890: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
a8a0: 72 2b 31 29 3b 20 20 20 2f 2a 20 54 68 65 20 4f  r+1);   /* The O
a8b0: 50 5f 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  P_Goto */.}../*.
a8c0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a8d0: 20 74 6f 20 73 65 74 20 74 68 65 20 61 63 63 75   to set the accu
a8e0: 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
a8f0: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
a900: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
a910: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
a920: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
a930: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
a940: 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66 6f   NULL. And perfo
a950: 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76 61  rm.** any equiva
a960: 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  lent initializat
a970: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
a980: 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  any built-in win
a990: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  dow functions.**
a9a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
a9b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64  .static int wind
a9c0: 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72 73  owInitAccum(Pars
a9d0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
a9e0: 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64 62  w *pMWin){.  Vdb
a9f0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
aa00: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
aa10: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
aa20: 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 57  nt nArg = 0;.  W
aa30: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
aa40: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
aa50: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
aa60: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
aa70: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
aa80: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
aa90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
aaa0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
aab0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
aac0: 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d 41  );.    nArg = MA
aad0: 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41 72  X(nArg, windowAr
aae0: 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20  gCount(pWin));. 
aaf0: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 78 53     if( pFunc->xS
ab00: 46 75 6e 63 3d 3d 6e 74 68 5f 76 61 6c 75 65 53  Func==nth_valueS
ab10: 74 65 70 46 75 6e 63 0a 20 20 20 20 20 7c 7c 20  tepFunc.     || 
ab20: 70 46 75 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 66  pFunc->xSFunc==f
ab30: 69 72 73 74 5f 76 61 6c 75 65 53 74 65 70 46 75  irst_valueStepFu
ab40: 6e 63 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  nc .    ){.     
ab50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab60: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
ab70: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
ab80: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
ab90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
aba0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
abb0: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
abc0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
abd0: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
abe0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
abf0: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63  NMAX) && pWin->c
ac00: 73 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61  srApp ){.      a
ac10: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74  ssert( pWin->eSt
ac20: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
ac30: 44 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  D );.      sqlit
ac40: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ac50: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
ac60: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
ac70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ac80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
ac90: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
aca0: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a  egApp+1);.    }.
acb0: 20 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70    }.  regArg = p
acc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
acd0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
ace0: 20 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20   nArg;.  return 
acf0: 72 65 67 41 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  regArg;.}.../*.*
ad00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ad10: 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
ad20: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
ad30: 64 65 53 74 65 70 28 29 20 66 6f 72 20 61 6c 6c  deStep() for all
ad40: 20 22 52 4f 57 53 22 0a 2a 2a 20 77 69 6e 64 6f   "ROWS".** windo
ad50: 77 20 66 72 61 6d 65 20 74 79 70 65 73 20 65 78  w frame types ex
ad60: 63 65 70 74 20 66 6f 72 20 22 42 45 54 57 45 45  cept for "BETWEE
ad70: 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
ad80: 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
ad90: 54 0a 2a 2a 20 52 4f 57 22 2e 20 50 73 65 75 64  T.** ROW". Pseud
ada0: 6f 2d 63 6f 64 65 20 66 6f 72 20 65 61 63 68 20  o-code for each 
adb0: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
adc0: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
add0: 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
ade0: 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
adf0: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
ae00: 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
ae10: 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
ae20: 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
ae30: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
ae40: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
ae50: 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65 63       Insert (rec
ae60: 6f 72 64 20 69 6e 20 65 70 68 2d 74 61 62 6c 65  ord in eph-table
ae70: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
ae80: 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
ae90: 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61    Gosub flush_pa
aea0: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20  rtition.**  .** 
aeb0: 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f    flush_partitio
aec0: 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b  n:.**     Once {
aed0: 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75  .**       OpenDu
aee0: 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73  p (iEphCsr -> cs
aef0: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
af00: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
af10: 72 20 2d 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20  r -> csrEnd).** 
af20: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67      }.**     reg
af30: 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 20  Start = <expr1> 
af40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af50: 2f 20 50 52 45 43 45 44 49 4e 47 20 65 78 70 72  / PRECEDING expr
af60: 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65  ession.**     re
af70: 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 20 20  gEnd = <expr2>  
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af90: 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70  // FOLLOWING exp
afa0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69  ression.**     i
afb0: 66 28 20 72 65 67 53 74 61 72 74 3c 30 20 7c 7c  f( regStart<0 ||
afc0: 20 72 65 67 45 6e 64 3c 30 20 29 7b 20 65 72 72   regEnd<0 ){ err
afd0: 6f 72 21 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77  or! }.**     Rew
afe0: 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72  ind (csr,csrStar
aff0: 74 2c 63 73 72 45 6e 64 29 20 20 20 20 20 20 2f  t,csrEnd)      /
b000: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
b010: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
b020: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  ne.**       Next
b030: 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20  (csrEnd)        
b040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
b050: 66 20 45 4f 46 20 73 6b 69 70 20 41 67 67 73 74  f EOF skip Aggst
b060: 65 70 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73  ep.**       Aggs
b070: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
b080: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
b090: 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
b0a0: 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28        AggFinal (
b0b0: 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20  xValue).**      
b0c0: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
b0d0: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  ub.**         Ne
b0e0: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
b0f0: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
b100: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
b110: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
b120: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
b130: 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
b140: 20 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76            AggInv
b150: 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29 0a  erse (csrStart).
b160: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65 78  **           Nex
b170: 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20  t(csrStart).**  
b180: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
b190: 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70    }.**   flush_p
b1a0: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 0a 2a  artition_done:.*
b1b0: 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65  *     ResetSorte
b1c0: 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52  r (csr).**     R
b1d0: 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  eturn.**.** ROWS
b1e0: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
b1f0: 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44  PRECEDING    AND
b200: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20   CURRENT ROW.** 
b210: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55 52  ROWS BETWEEN CUR
b220: 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20 20 20  RENT ROW        
b230: 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c   AND <expr> FOLL
b240: 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45  OWING.** ROWS BE
b250: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
b260: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
b270: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  xpr> FOLLOWING.*
b280: 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 61 72 65  *.**   These are
b290: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
b2a0: 61 62 6f 76 65 2e 20 46 6f 72 20 22 43 55 52 52  above. For "CURR
b2b0: 45 4e 54 20 52 4f 57 22 2c 20 69 6e 74 69 61 6c  ENT ROW", intial
b2c0: 69 7a 65 20 74 68 65 0a 2a 2a 20 20 20 72 65 67  ize the.**   reg
b2d0: 69 73 74 65 72 20 74 6f 20 30 2e 20 46 6f 72 20  ister to 0. For 
b2e0: 22 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45  "UNBOUNDED PRECE
b2f0: 44 49 4e 47 22 20 74 6f 20 69 6e 66 69 6e 69 74  DING" to infinit
b300: 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  y..**.** ROWS BE
b310: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
b320: 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 55 4e  CEDING    AND UN
b330: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
b340: 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  G.** ROWS BETWEE
b350: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20  N CURRENT ROW   
b360: 20 20 20 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e        AND UNBOUN
b370: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  DED FOLLOWING.**
b380: 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20 28  .**     Rewind (
b390: 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72  csr,csrStart,csr
b3a0: 45 6e 64 29 20 20 20 20 2f 2f 20 69 66 20 45 4f  End)    // if EO
b3b0: 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72  F goto flush_par
b3c0: 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20  tition_done.**  
b3d0: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
b3e0: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
b3f0: 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20  End)            
b400: 20 20 20 20 20 20 2f 2f 20 45 78 69 74 20 77 68        // Exit wh
b410: 69 6c 65 28 31 29 20 61 74 20 45 4f 46 0a 2a 2a  ile(1) at EOF.**
b420: 20 20 20 20 20 20 20 41 67 67 73 74 65 70 20 28         Aggstep (
b430: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d  csrEnd).**     }
b440: 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31  .**     while( 1
b450: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
b460: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
b470: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
b480: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
b490: 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20   Next(csr)      
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b4b0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
b4c0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
b4d0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ne.**       if( 
b4e0: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
b4f0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
b500: 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61  gInverse (csrSta
b510: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e  rt).**         N
b520: 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
b530: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
b540: 7d 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 74 68  }.**.**   For th
b550: 65 20 22 43 55 52 52 45 4e 54 20 52 4f 57 20 41  e "CURRENT ROW A
b560: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
b570: 4c 4f 57 49 4e 47 22 20 63 61 73 65 2c 20 74 68  LOWING" case, th
b580: 65 20 66 69 6e 61 6c 20 69 66 28 29 20 0a 2a 2a  e final if() .**
b590: 20 20 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20     condition is 
b5a0: 61 6c 77 61 79 73 20 74 72 75 65 20 28 61 73 20  always true (as 
b5b0: 69 66 20 72 65 67 53 74 61 72 74 20 77 65 72 65  if regStart were
b5c0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
b5d0: 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20  0)..**.** RANGE 
b5e0: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
b5f0: 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
b600: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 0a  D FOLLOWING.** .
b610: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 74 68 65  **   This is the
b620: 20 6f 6e 6c 79 20 52 41 4e 47 45 20 63 61 73 65   only RANGE case
b630: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
b640: 20 72 6f 75 74 69 6e 65 2e 20 49 74 20 6d 6f 64   routine. It mod
b650: 69 66 69 65 73 20 74 68 65 0a 2a 2a 20 20 20 73  ifies the.**   s
b660: 65 63 6f 6e 64 20 77 68 69 6c 65 28 20 31 20 29  econd while( 1 )
b670: 20 6c 6f 6f 70 20 69 6e 20 22 52 4f 57 53 20 42   loop in "ROWS B
b680: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 2e  ETWEEN CURRENT .
b690: 2e 2e 20 55 4e 42 4f 55 4e 44 45 44 2e 2e 2e 22  .. UNBOUNDED..."
b6a0: 20 74 6f 0a 2a 2a 20 20 20 62 65 3a 0a 2a 2a 0a   to.**   be:.**.
b6b0: 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31 20  **     while( 1 
b6c0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46  ){.**       AggF
b6d0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
b6e0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20         while( 1 
b6f0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  ){.**         re
b700: 67 50 65 65 72 2b 2b 0a 2a 2a 20 20 20 20 20 20  gPeer++.**      
b710: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
b720: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  ub.**         Ne
b730: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
b740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
b750: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
b760: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
b770: 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  **         if( n
b780: 65 77 20 70 65 65 72 20 29 20 62 72 65 61 6b 3b  ew peer ) break;
b790: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
b7a0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 72 65 67       while( (reg
b7b0: 50 65 65 72 2d 2d 29 3e 30 20 29 7b 0a 2a 2a 20  Peer--)>0 ){.** 
b7c0: 20 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72          AggInver
b7d0: 73 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  se (csrStart).**
b7e0: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
b7f0: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
b800: 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a   }.**     }.**.*
b810: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
b820: 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
b830: 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f     AND <expr> FO
b840: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
b850: 72 65 67 45 6e 64 20 3d 20 72 65 67 45 6e 64 20  regEnd = regEnd 
b860: 2d 20 72 65 67 53 74 61 72 74 0a 2a 2a 20 20 20  - regStart.**   
b870: 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53  Rewind (csr,csrS
b880: 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 2f  tart,csrEnd)   /
b890: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
b8a0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
b8b0: 6e 65 0a 2a 2a 20 20 20 20 20 41 67 67 73 74 65  ne.**     Aggste
b8c0: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
b8d0: 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20    Next(csrEnd)  
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8f0: 2f 20 69 66 20 45 4f 46 20 66 61 6c 6c 2d 74 68  / if EOF fall-th
b900: 72 6f 75 67 68 0a 2a 2a 20 20 20 20 20 69 66 28  rough.**     if(
b910: 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
b920: 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  {.**       if( (
b930: 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29  regStart--)<=0 )
b940: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
b950: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
b960: 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
b970: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
b980: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
b990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
b9a0: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
b9b0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
b9c0: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
b9d0: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
b9e0: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
b9f0: 20 20 20 4e 65 78 74 20 28 63 73 72 53 74 61 72     Next (csrStar
ba00: 74 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a  t).**     }.**.*
ba10: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
ba20: 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
ba30: 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 50 52     AND <expr> PR
ba40: 45 43 45 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  ECEDING.**.**   
ba50: 52 65 70 6c 61 63 65 20 74 68 65 20 62 69 74 20  Replace the bit 
ba60: 61 66 74 65 72 20 22 52 65 77 69 6e 64 22 20 69  after "Rewind" i
ba70: 6e 20 74 68 65 20 61 62 6f 76 65 20 77 69 74 68  n the above with
ba80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 28 20  :.**.**     if( 
ba90: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
baa0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65  .**       AggSte
bab0: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
bac0: 20 20 20 20 4e 65 78 74 20 28 63 73 72 45 6e 64      Next (csrEnd
bad0: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
bae0: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
baf0: 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62  ue).**     Gosub
bb00: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
bb10: 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20    Next(csr)     
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
bb30: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
bb40: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
bb50: 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65 67  .**     if( (reg
bb60: 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
bb70: 2a 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72  *       AggInver
bb80: 73 65 20 28 63 73 72 32 29 0a 2a 2a 20 20 20 20  se (csr2).**    
bb90: 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a 2a     Next (csr2).*
bba0: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74  *     }.**.*/.st
bbb0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
bbc0: 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
bbd0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bbe0: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
bbf0: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
bc00: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
bc10: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
bc20: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
bc30: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
bc40: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
bc50: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
bc60: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65  Parse);.  int re
bc70: 67 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  gFlushPart;     
bc80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
bc90: 69 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62  ister for "Gosub
bca0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
bcb0: 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  " */.  int lblFl
bcc0: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
bcd0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
bce0: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
bcf0: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
bd00: 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e   int lblFlushDon
bd10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bd20: 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22 47   /* Label for "G
bd30: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
bd40: 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20  tion_done" */.. 
bd50: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
bd60: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 63  nt addr;.  int c
bd70: 73 72 53 74 61 72 74 20 3d 20 70 50 61 72 73 65  srStart = pParse
bd80: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20  ->nTab++;.  int 
bd90: 63 73 72 45 6e 64 20 3d 20 70 50 61 72 73 65 2d  csrEnd = pParse-
bda0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 72  >nTab++;.  int r
bdb0: 65 67 53 74 61 72 74 3b 20 20 20 20 20 20 20 20  egStart;        
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
bdd0: 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 50  alue of <expr> P
bde0: 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e  RECEDING */.  in
bdf0: 74 20 72 65 67 45 6e 64 3b 20 20 20 20 20 20 20  t regEnd;       
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be10: 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
be20: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20  > FOLLOWING */. 
be30: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 0a 20   int addrGoto;. 
be40: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a 20 20   int addrTop;.  
be50: 69 6e 74 20 61 64 64 72 49 66 50 6f 73 31 3b 0a  int addrIfPos1;.
be60: 20 20 69 6e 74 20 61 64 64 72 49 66 50 6f 73 32    int addrIfPos2
be70: 3b 0a 20 20 69 6e 74 20 72 65 67 53 69 7a 65 20  ;.  int regSize 
be80: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
be90: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
bea0: 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20  K_PRECEDING .   
beb0: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53      || pMWin->eS
bec0: 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
bed0: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
bee0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
bef0: 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20  LLOWING .       
bf00: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
bf10: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a  ==TK_UNBOUNDED .
bf20: 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
bf30: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46  MWin->eEnd==TK_F
bf40: 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20  OLLOWING .      
bf50: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
bf60: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
bf70: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
bf80: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
bf90: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
bfa0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
bfb0: 45 44 49 4e 47 20 0a 20 20 29 3b 0a 0a 20 20 2f  EDING .  );..  /
bfc0: 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73  * Allocate regis
bfd0: 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f  ter and label fo
bfe0: 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72  r the "flush_par
bff0: 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74  tition" sub-rout
c000: 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75  ine. */.  regFlu
c010: 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73  shPart = ++pPars
c020: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c  e->nMem;.  lblFl
c030: 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65  ushPart = sqlite
c040: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
c050: 29 3b 0a 20 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  );.  lblFlushDon
c060: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
c070: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
c080: 72 65 67 53 74 61 72 74 20 3d 20 2b 2b 70 50 61  regStart = ++pPa
c090: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
c0a0: 45 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  End = ++pParse->
c0b0: 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50  nMem;..  windowP
c0c0: 61 72 74 69 74 69 6f 6e 43 61 63 68 65 28 70 50  artitionCache(pP
c0d0: 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
c0e0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
c0f0: 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 26 72 65  blFlushPart, &re
c100: 67 53 69 7a 65 29 3b 0a 0a 20 20 61 64 64 72 47  gSize);..  addrG
c110: 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
c120: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
c130: 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74  to);..  /* Start
c140: 20 6f 66 20 22 66 6c 75 73 68 5f 70 61 72 74 69   of "flush_parti
c150: 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c 69 74  tion" */.  sqlit
c160: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
c170: 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 50 61  el(v, lblFlushPa
c180: 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rt);.  sqlite3Vd
c190: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
c1a0: 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56  nce, 0, sqlite3V
c1b0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c1c0: 29 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+3);.  VdbeCove
c1d0: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
c1e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c1f0: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 53  OP_OpenDup, csrS
c200: 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  tart, pMWin->iEp
c210: 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  hCsr);.  sqlite3
c220: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
c230: 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e 64  _OpenDup, csrEnd
c240: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
c250: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74 68  );..  /* If eith
c260: 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20 72  er regStart or r
c270: 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e 6f  egEnd are not no
c280: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
c290: 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a 2a  ers, throw .  **
c2a0: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20   an exception.  
c2b0: 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
c2c0: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71  pStart ){.    sq
c2d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c2e0: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74  arse, pMWin->pSt
c2f0: 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  art, regStart);.
c300: 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 46      windowCheckF
c310: 72 61 6d 65 56 61 6c 75 65 28 70 50 61 72 73 65  rameValue(pParse
c320: 2c 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a  , regStart, 0);.
c330: 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d    }.  if( pMWin-
c340: 3e 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c  >pEnd ){.    sql
c350: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c360: 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64  rse, pMWin->pEnd
c370: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77  , regEnd);.    w
c380: 69 6e 64 6f 77 43 68 65 63 6b 46 72 61 6d 65 56  indowCheckFrameV
c390: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72 65 67  alue(pParse, reg
c3a0: 45 6e 64 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  End, 1);.  }..  
c3b0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 22 52  /* If this is "R
c3c0: 4f 57 53 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c  OWS <expr1> FOLL
c3d0: 4f 57 49 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c  OWING AND ROWS <
c3e0: 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
c3f0: 22 2c 20 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ", do:.  **.  **
c400: 20 20 20 69 66 28 20 72 65 67 45 6e 64 3c 72 65     if( regEnd<re
c410: 67 53 74 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20  gStart ){.  **  
c420: 20 20 20 2f 2f 20 54 68 65 20 66 72 61 6d 65 20     // The frame 
c430: 61 6c 77 61 79 73 20 63 6f 6e 73 69 73 74 73 20  always consists 
c440: 6f 66 20 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20  of 0 rows.  **  
c450: 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 72 65     regStart = re
c460: 67 53 69 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a  gSize;.  **   }.
c470: 20 20 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20    **   regEnd = 
c480: 72 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72  regEnd - regStar
c490: 74 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d  t;.  */.  if( pM
c4a0: 57 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57  Win->pEnd && pMW
c4b0: 69 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d  in->pStart && pM
c4c0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
c4d0: 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
c4e0: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
c4f0: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
c500: 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NG );.    sqlite
c510: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c520: 50 5f 47 65 2c 20 72 65 67 53 74 61 72 74 2c 20  P_Ge, regStart, 
c530: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
c540: 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67  ntAddr(v)+2, reg
c550: 45 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  End);.    VdbeCo
c560: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
c570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c580: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
c590: 53 69 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b  Size, regStart);
c5a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c5b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62  AddOp3(v, OP_Sub
c5c0: 74 72 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c  tract, regStart,
c5d0: 20 72 65 67 45 6e 64 2c 20 72 65 67 45 6e 64 29   regEnd, regEnd)
c5e0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57  ;.  }..  if( pMW
c5f0: 69 6e 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69  in->pEnd && pMWi
c600: 6e 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57  n->pStart && pMW
c610: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  in->eEnd==TK_PRE
c620: 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 73  CEDING ){.    as
c630: 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74  sert( pMWin->eSt
c640: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
c650: 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  G );.    sqlite3
c660: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c670: 5f 4c 65 2c 20 72 65 67 53 74 61 72 74 2c 20 73  _Le, regStart, s
c680: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c690: 74 41 64 64 72 28 76 29 2b 33 2c 20 72 65 67 45  tAddr(v)+3, regE
c6a0: 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  nd);.    VdbeCov
c6b0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
c6c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
c6d0: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53  v, OP_Copy, regS
c6e0: 69 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  ize, regStart);.
c6f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c700: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
c710: 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 45 6e  , regSize, regEn
c720: 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  d);.  }..  /* In
c730: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 63 63  itialize the acc
c740: 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
c750: 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  r for each windo
c760: 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55  w function to NU
c770: 4c 4c 20 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d  LL */.  regArg =
c780: 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d   windowInitAccum
c790: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b  (pParse, pMWin);
c7a0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
c7b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
c7c0: 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  nd, pMWin->iEphC
c7d0: 73 72 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65  sr, lblFlushDone
c7e0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
c7f0: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
c800: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c810: 52 65 77 69 6e 64 2c 20 63 73 72 53 74 61 72 74  Rewind, csrStart
c820: 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b  , lblFlushDone);
c830: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
c840: 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
c850: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
c860: 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c  eP5(v, 1);.  sql
c870: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
c880: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72  , OP_Rewind, csr
c890: 45 6e 64 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  End, lblFlushDon
c8a0: 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  e);.  VdbeCovera
c8b0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
c8c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
c8d0: 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 0a 20  angeP5(v, 1);.. 
c8e0: 20 2f 2a 20 49 6e 76 6f 6b 65 20 41 67 67 53 74   /* Invoke AggSt
c8f0: 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ep function for 
c900: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
c910: 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 72  tion using the r
c920: 6f 77 20 74 68 61 74 0a 20 20 2a 2a 20 63 73 72  ow that.  ** csr
c930: 45 6e 64 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  End currently po
c940: 69 6e 74 73 20 74 6f 2e 20 4f 72 2c 20 69 66 20  ints to. Or, if 
c950: 63 73 72 45 6e 64 20 69 73 20 61 6c 72 65 61 64  csrEnd is alread
c960: 79 20 61 74 20 45 4f 46 2c 0a 20 20 2a 2a 20 64  y at EOF,.  ** d
c970: 6f 20 6e 6f 74 68 69 6e 67 2e 20 20 2a 2f 0a 20  o nothing.  */. 
c980: 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74   addrTop = sqlit
c990: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
c9a0: 72 28 76 29 3b 0a 20 20 69 66 28 20 70 4d 57 69  r(v);.  if( pMWi
c9b0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
c9c0: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64  EDING ){.    add
c9d0: 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69 74 65  rIfPos1 = sqlite
c9e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
c9f0: 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c  P_IfPos, regEnd,
ca00: 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56 64 62   0 , 1);.    Vdb
ca10: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
ca20: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
ca30: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
ca40: 2c 20 63 73 72 45 6e 64 2c 20 73 71 6c 69 74 65  , csrEnd, sqlite
ca50: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
ca60: 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f  (v)+2);.  VdbeCo
ca70: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 61 64 64  verage(v);.  add
ca80: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
ca90: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
caa0: 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74  );.  windowAggSt
cab0: 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ep(pParse, pMWin
cac0: 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20 72 65 67  , csrEnd, 0, reg
cad0: 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20  Arg, regSize);. 
cae0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
caf0: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  ==TK_UNBOUNDED )
cb00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
cb10: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
cb20: 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  to, 0, addrTop);
cb30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
cb40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
cb50: 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  );.    addrTop =
cb60: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
cb70: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 65  entAddr(v);.  }e
cb80: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
cb90: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
cba0: 61 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70  addr);.    if( p
cbb0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50  MWin->eEnd==TK_P
cbc0: 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
cbd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
cbe0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 50  pHere(v, addrIfP
cbf0: 6f 73 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  os1);.    }.  }.
cc00: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
cc10: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
cc20: 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f   ){.    addrIfPo
cc30: 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  s1 = sqlite3Vdbe
cc40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
cc50: 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20  os, regEnd, 0 , 
cc60: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
cc70: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
cc80: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
cc90: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
cca0: 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 32  {.    addrIfPos2
ccb0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
ccc0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
ccd0: 2c 20 72 65 67 53 74 61 72 74 2c 20 30 20 2c 20  , regStart, 0 , 
cce0: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
ccf0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 77  rage(v);.  }.  w
cd00: 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
cd10: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b  arse, pMWin, 0);
cd20: 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  .  windowReturnO
cd30: 6e 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d  neRow(pParse, pM
cd40: 57 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  Win, regGosub, a
cd50: 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c  ddrGosub);.  sql
cd60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
cd70: 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e  , OP_Next, pMWin
cd80: 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74  ->iEphCsr, sqlit
cd90: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
cda0: 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43  r(v)+2);.  VdbeC
cdb0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
cdc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cdd0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
cde0: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
cdf0: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
ce00: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
ce10: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
ce20: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
ce30: 64 72 49 66 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a  drIfPos2);.  }..
ce40: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
ce50: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
ce60: 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  .   || pMWin->eS
ce70: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
ce80: 4e 47 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d  NG .   || pMWin-
ce90: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
cea0: 4f 57 49 4e 47 20 0a 20 20 29 7b 0a 20 20 20 20  OWING .  ){.    
ceb0: 69 6e 74 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72  int lblSkipInver
cec0: 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  se = sqlite3Vdbe
ced0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 3b 0a 20  MakeLabel(v);;. 
cee0: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53     if( pMWin->eS
cef0: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
cf00: 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  NG ){.      sqli
cf10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
cf20: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74   OP_IfPos, regSt
cf30: 61 72 74 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65  art, lblSkipInve
cf40: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 56  rse, 1);.      V
cf50: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
cf60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d      }.    if( pM
cf70: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
cf80: 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
cf90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cfa0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
cfb0: 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c 69 74   csrStart, sqlit
cfc0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
cfd0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 56  r(v)+2);.      V
cfe0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
cff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d000: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
d010: 74 6f 2c 20 30 2c 20 6c 62 6c 53 6b 69 70 49 6e  to, 0, lblSkipIn
d020: 76 65 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73  verse);.    }els
d030: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
d040: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d050: 5f 4e 65 78 74 2c 20 63 73 72 53 74 61 72 74 2c  _Next, csrStart,
d060: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
d070: 65 6e 74 41 64 64 72 28 76 29 2b 31 29 3b 0a 20  entAddr(v)+1);. 
d080: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
d090: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
d0a0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
d0b0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
d0c0: 53 74 61 72 74 2c 20 31 2c 20 72 65 67 41 72 67  Start, 1, regArg
d0d0: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 20 20  , regSize);.    
d0e0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
d0f0: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 53 6b  veLabel(v, lblSk
d100: 69 70 49 6e 76 65 72 73 65 29 3b 0a 20 20 7d 0a  ipInverse);.  }.
d110: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
d120: 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  d==TK_FOLLOWING 
d130: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
d140: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
d150: 64 72 49 66 50 6f 73 31 29 3b 0a 20 20 7d 0a 20  drIfPos1);.  }. 
d160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d170: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
d180: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 0a 20 20 2f  , addrTop);..  /
d190: 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  * flush_partitio
d1a0: 6e 5f 64 6f 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c  n_done: */.  sql
d1b0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
d1c0: 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68  abel(v, lblFlush
d1d0: 44 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Done);.  sqlite3
d1e0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
d1f0: 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d  _ResetSorter, pM
d200: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
d210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d220: 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
d230: 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b 0a   regFlushPart);.
d240: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65  .  /* Jump to he
d250: 72 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20  re to skip over 
d260: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20  flush_partition 
d270: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
d280: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
d290: 47 6f 74 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Goto);.}../*.** 
d2a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
d2b0: 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73  es the work of s
d2c0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
d2d0: 53 74 65 70 28 29 20 66 6f 72 20 63 61 73 65 73  Step() for cases
d2e0: 20 74 68 61 74 0a 2a 2a 20 77 6f 75 6c 64 20 6e   that.** would n
d2f0: 6f 72 6d 61 6c 6c 79 20 62 65 20 68 61 6e 64 6c  ormally be handl
d300: 65 64 20 62 79 20 77 69 6e 64 6f 77 43 6f 64 65  ed by windowCode
d310: 44 65 66 61 75 6c 74 53 74 65 70 28 29 20 77 68  DefaultStep() wh
d320: 65 6e 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  en there are.** 
d330: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 75 69 6c  one or more buil
d340: 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63  t-in window-func
d350: 74 69 6f 6e 73 20 74 68 61 74 20 72 65 71 75 69  tions that requi
d360: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
d370: 72 74 69 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rtition.** to be
d380: 20 63 61 63 68 65 64 20 69 6e 20 61 20 74 65 6d   cached in a tem
d390: 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 61  p table before a
d3a0: 6e 79 20 72 6f 77 73 20 63 61 6e 20 62 65 20 72  ny rows can be r
d3b0: 65 74 75 72 6e 65 64 2e 20 41 64 64 69 74 69 6f  eturned. Additio
d3c0: 6e 61 6c 6c 79 2e 0a 2a 2a 20 22 52 41 4e 47 45  nally..** "RANGE
d3d0: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
d3e0: 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44   ROW AND UNBOUND
d3f0: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 69 73  ED FOLLOWING" is
d400: 20 61 6c 77 61 79 73 20 68 61 6e 64 6c 65 64 20   always handled 
d410: 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  by.** this funct
d420: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 73 65 75 64  ion..**.** Pseud
d430: 6f 2d 63 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e  o-code correspon
d440: 64 69 6e 67 20 74 6f 20 74 68 65 20 56 4d 20 63  ding to the VM c
d450: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
d460: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
d470: 2a 20 66 6f 72 20 65 61 63 68 20 74 79 70 65 20  * for each type 
d480: 6f 66 20 77 69 6e 64 6f 77 20 66 6f 6c 6c 6f 77  of window follow
d490: 73 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42  s..**.** RANGE B
d4a0: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
d4b0: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
d4c0: 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a  URRENT ROW.**.**
d4d0: 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69     flush_partiti
d4e0: 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20  on:.**     Once 
d4f0: 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44  {.**       OpenD
d500: 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63  up (iEphCsr -> c
d510: 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d  srLead).**     }
d520: 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65 72 20  .**     Integer 
d530: 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66 6f 72  ctr 0.**     for
d540: 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61  each row (csrLea
d550: 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28  d){.**       if(
d560: 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20   new peer ){.** 
d570: 20 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c          AggFinal
d580: 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20   (xValue).**    
d590: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d5a0: 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20  ctr; i++){.**   
d5b0: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64          Gosub ad
d5c0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
d5d0: 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73       Next iEphCs
d5e0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  r.**         }.*
d5f0: 2a 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65  *         Intege
d600: 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 20  r ctr 0.**      
d610: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53   }.**       AggS
d620: 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a  tep (csrLead).**
d630: 20 20 20 20 20 20 20 49 6e 63 72 20 63 74 72 0a         Incr ctr.
d640: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20  **     }.**.**  
d650: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46 69     AggFinal (xFi
d660: 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66  nalize).**     f
d670: 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69  or(i=0; i<ctr; i
d680: 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f  ++){.**       Go
d690: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
d6a0: 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68         Next iEph
d6b0: 43 73 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a  Csr.**     }.**.
d6c0: 2a 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74  **     ResetSort
d6d0: 65 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20  er (csr).**     
d6e0: 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57  Return.**.** ROW
d6f0: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
d700: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
d710: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
d720: 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20  .**   As above, 
d730: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
d740: 22 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 22  "if( new peer )"
d750: 20 62 72 61 6e 63 68 20 69 73 20 61 6c 77 61 79   branch is alway
d760: 73 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 52  s taken..**.** R
d770: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52  ANGE BETWEEN CUR
d780: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52  RENT ROW AND CUR
d790: 52 45 4e 54 20 52 4f 57 20 0a 2a 2a 0a 2a 2a 20  RENT ROW .**.** 
d7a0: 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65    As above, exce
d7b0: 70 74 20 74 68 61 74 20 65 61 63 68 20 6f 66 20  pt that each of 
d7c0: 74 68 65 20 66 6f 72 28 29 20 6c 6f 6f 70 73 20  the for() loops 
d7d0: 62 65 63 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  becomes:.**.**  
d7e0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
d7f0: 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
d800: 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
d810: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
d820: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
d830: 65 20 28 69 45 70 68 43 73 72 29 0a 2a 2a 20 20  e (iEphCsr).**  
d840: 20 20 20 20 20 20 20 20 20 4e 65 78 74 20 69 45           Next iE
d850: 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20  phCsr.**        
d860: 20 7d 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42   }.**.** RANGE B
d870: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
d880: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55   PRECEDING AND U
d890: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
d8a0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68  NG.**.**   flush
d8b0: 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20  _partition:.**  
d8c0: 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20     Once {.**    
d8d0: 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68     OpenDup (iEph
d8e0: 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a  Csr -> csrLead).
d8f0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
d900: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72  foreach row (csr
d910: 4c 65 61 64 29 20 7b 0a 2a 2a 20 20 20 20 20 20  Lead) {.**      
d920: 20 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61   AggStep (csrLea
d930: 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  d).**     }.**  
d940: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28     foreach row (
d950: 69 45 70 68 43 73 72 29 20 7b 0a 2a 2a 20 20 20  iEphCsr) {.**   
d960: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
d970: 73 75 62 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  sub.**     }.** 
d980: 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45  .** RANGE BETWEE
d990: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
d9a0: 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
d9b0: 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c  OWING.**.**   fl
d9c0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a  ush_partition:.*
d9d0: 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20  *     Once {.** 
d9e0: 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69        OpenDup (i
d9f0: 45 70 68 43 73 72 20 2d 3e 20 63 73 72 4c 65 61  EphCsr -> csrLea
da00: 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  d).**     }.**  
da10: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28     foreach row (
da20: 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20  csrLead){.**    
da30: 20 20 20 41 67 67 53 74 65 70 20 28 63 73 72 4c     AggStep (csrL
da40: 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  ead).**     }.**
da50: 20 20 20 20 20 52 65 77 69 6e 64 20 28 63 73 72       Rewind (csr
da60: 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 49 6e 74  Lead).**     Int
da70: 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20  eger ctr 0.**   
da80: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63    foreach row (c
da90: 73 72 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20  srLead){.**     
daa0: 20 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29    if( new peer )
dab0: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
dac0: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
dad0: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  *         for(i=
dae0: 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a  0; i<ctr; i++){.
daf0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 47 6f 73  **           Gos
db00: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
db10: 20 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76            AggInv
db20: 65 72 73 65 20 28 69 45 70 68 43 73 72 29 0a 2a  erse (iEphCsr).*
db30: 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65 78 74  *           Next
db40: 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20   iEphCsr.**     
db50: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
db60: 20 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a   Integer ctr 0.*
db70: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  *       }.**    
db80: 20 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20     Incr ctr.**  
db90: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41     }.**.**     A
dba0: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
dbb0: 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69  ze).**     for(i
dbc0: 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b  =0; i<ctr; i++){
dbd0: 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
dbe0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
dbf0: 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a     Next iEphCsr.
dc00: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20  **     }.**.**  
dc10: 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 28     ResetSorter (
dc20: 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75  csr).**     Retu
dc30: 72 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  rn.*/.static voi
dc40: 64 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68  d windowCodeCach
dc50: 65 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a  eStep(.  Parse *
dc60: 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63  pParse, .  Selec
dc70: 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66  t *p,.  WhereInf
dc80: 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74  o *pWInfo,.  int
dc90: 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e   regGosub, .  in
dca0: 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20  t addrGosub.){. 
dcb0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
dcc0: 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65   p->pWin;.  Vdbe
dcd0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
dce0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
dcf0: 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20 61 64 64  int k;.  int add
dd00: 72 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  r;.  ExprList *p
dd10: 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50  Part = pMWin->pP
dd20: 61 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72  artition;.  Expr
dd30: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
dd40: 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   pMWin->pOrderBy
dd50: 3b 0a 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20  ;.  int nPeer = 
dd60: 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65  pOrderBy ? pOrde
dd70: 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  rBy->nExpr : 0;.
dd80: 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72    int regNewPeer
dd90: 3b 0a 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 74  ;..  int addrGot
dda0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
ddb0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
ddc0: 6f 66 20 47 6f 74 6f 20 75 73 65 64 20 74 6f 20  of Goto used to 
ddd0: 6a 75 6d 70 20 66 6c 75 73 68 5f 70 61 72 2e 2e  jump flush_par..
dde0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 65   */.  int addrNe
ddf0: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
de00: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
de10: 72 65 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72  re for next iter
de20: 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f  ation of loop */
de30: 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50  .  int regFlushP
de40: 61 72 74 3b 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  art;.  int lblFl
de50: 75 73 68 50 61 72 74 3b 0a 20 20 69 6e 74 20 63  ushPart;.  int c
de60: 73 72 4c 65 61 64 3b 0a 20 20 69 6e 74 20 72 65  srLead;.  int re
de70: 67 43 74 72 3b 0a 20 20 69 6e 74 20 72 65 67 41  gCtr;.  int regA
de80: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
de90: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
dea0: 74 65 72 20 61 72 72 61 79 20 74 6f 20 6d 61 72  ter array to mar
deb0: 74 69 61 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72  tial function ar
dec0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53  gs */.  int regS
ded0: 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 62 6c 45 6d  ize;.  int lblEm
dee0: 70 74 79 3b 0a 20 20 69 6e 74 20 62 52 65 76 65  pty;.  int bReve
def0: 72 73 65 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72  rse = pMWin->pOr
df00: 64 65 72 42 79 20 26 26 20 70 4d 57 69 6e 2d 3e  derBy && pMWin->
df10: 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
df20: 4e 54 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  NT .          &&
df30: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
df40: 5f 55 4e 42 4f 55 4e 44 45 44 3b 0a 0a 20 20 61  _UNBOUNDED;..  a
df50: 73 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65  ssert( (pMWin->e
df60: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
df70: 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
df80: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20  nd==TK_CURRENT) 
df90: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
dfa0: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
dfb0: 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
dfc0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
dfd0: 4e 44 45 44 29 20 0a 20 20 20 20 20 20 20 7c 7c  NDED) .       ||
dfe0: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
dff0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70  =TK_CURRENT && p
e000: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
e010: 55 52 52 45 4e 54 29 20 0a 20 20 20 20 20 20 20  URRENT) .       
e020: 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  || (pMWin->eStar
e030: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26  t==TK_CURRENT &&
e040: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
e050: 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a 20 20 29  _UNBOUNDED) .  )
e060: 3b 0a 0a 20 20 6c 62 6c 45 6d 70 74 79 20 3d 20  ;..  lblEmpty = 
e070: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
e080: 61 62 65 6c 28 76 29 3b 0a 20 20 72 65 67 4e 65  abel(v);.  regNe
e090: 77 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  wPeer = pParse->
e0a0: 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65  nMem+1;.  pParse
e0b0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b  ->nMem += nPeer;
e0c0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
e0d0: 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62  register and lab
e0e0: 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73  el for the "flus
e0f0: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62  h_partition" sub
e100: 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72  -routine. */.  r
e110: 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b  egFlushPart = ++
e120: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
e130: 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73  lblFlushPart = s
e140: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
e150: 62 65 6c 28 76 29 3b 0a 0a 20 20 63 73 72 4c 65  bel(v);..  csrLe
e160: 61 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ad = pParse->nTa
e170: 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72 20 3d 20  b++;.  regCtr = 
e180: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
e190: 0a 20 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69  .  windowPartiti
e1a0: 6f 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  onCache(pParse, 
e1b0: 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c  p, pWInfo, regFl
e1c0: 75 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73  ushPart, lblFlus
e1d0: 68 50 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29  hPart, &regSize)
e1e0: 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73  ;.  addrGoto = s
e1f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
e200: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20  (v, OP_Goto);.. 
e210: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c   /* Start of "fl
e220: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
e230: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
e240: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
e250: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
e260: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e270: 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c  2(v, OP_Once, 0,
e280: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e290: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
e2a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e2b0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e2c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
e2d0: 44 75 70 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d  Dup, csrLead, pM
e2e0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a  Win->iEphCsr);..
e2f0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
e300: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
e310: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
e320: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
e330: 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72  n to NULL */.  r
e340: 65 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e  egArg = windowIn
e350: 69 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20  itAccum(pParse, 
e360: 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74  pMWin);..  sqlit
e370: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e380: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
e390: 65 67 43 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  egCtr);.  sqlite
e3a0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e3b0: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61  P_Rewind, csrLea
e3c0: 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  d, lblEmpty);.  
e3d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e3e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e3f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
e400: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
e410: 72 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  r, lblEmpty);.  
e420: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
e430: 72 54 61 6b 65 6e 28 76 29 3b 0a 0a 20 20 69 66  rTaken(v);..  if
e440: 28 20 62 52 65 76 65 72 73 65 20 29 7b 0a 20 20  ( bReverse ){.  
e450: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
e460: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e470: 64 64 72 28 76 29 3b 0a 20 20 20 20 77 69 6e 64  ddr(v);.    wind
e480: 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65  owAggStep(pParse
e490: 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64  , pMWin, csrLead
e4a0: 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67  , 0, regArg, reg
e4b0: 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Size);.    sqlit
e4c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e4d0: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61 64  OP_Next, csrLead
e4e0: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 56 64 62  , addr);.    Vdb
e4f0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
e500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e510: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
e520: 2c 20 63 73 72 4c 65 61 64 2c 20 6c 62 6c 45 6d  , csrLead, lblEm
e530: 70 74 79 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  pty);.    VdbeCo
e540: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
e550: 28 76 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 4e  (v);.  }.  addrN
e560: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ext = sqlite3Vdb
e570: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
e580: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
e590: 20 26 26 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64   && (pMWin->eEnd
e5a0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20  ==TK_CURRENT || 
e5b0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
e5c0: 4b 5f 43 55 52 52 45 4e 54 29 20 29 7b 0a 20 20  K_CURRENT) ){.  
e5d0: 20 20 69 6e 74 20 62 43 75 72 72 65 6e 74 20 3d    int bCurrent =
e5e0: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
e5f0: 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20  =TK_CURRENT);.  
e600: 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d    int addrJump =
e610: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e620: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
e630: 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 2a 2f 0a 20  _Jump below */. 
e640: 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54     if( pMWin->eT
e650: 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b  ype==TK_RANGE ){
e660: 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20  .      int iOff 
e670: 3d 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  = pMWin->nBuffer
e680: 43 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70  Col + (pPart ? p
e690: 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  Part->nExpr : 0)
e6a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 50  ;.      int regP
e6b0: 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67  eer = pMWin->reg
e6c0: 50 61 72 74 20 2b 20 28 70 50 61 72 74 20 3f 20  Part + (pPart ? 
e6d0: 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pPart->nExpr : 0
e6e0: 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  );.      KeyInfo
e6f0: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c   *pKeyInfo = sql
e700: 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
e710: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
e720: 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b  pOrderBy, 0, 0);
e730: 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
e740: 6b 3c 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20  k<nPeer; k++){. 
e750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
e760: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
e770: 6f 6c 75 6d 6e 2c 20 63 73 72 4c 65 61 64 2c 20  olumn, csrLead, 
e780: 69 4f 66 66 2b 6b 2c 20 72 65 67 4e 65 77 50 65  iOff+k, regNewPe
e790: 65 72 2b 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  er+k);.      }. 
e7a0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
e7b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e7c0: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
e7d0: 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72  NewPeer, regPeer
e7e0: 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20  , nPeer);.      
e7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
e800: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
e810: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
e820: 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a  FO);.      addrJ
e830: 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
e840: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
e850: 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61  mp, addr+2, 0, a
e860: 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  ddr+2);.      Vd
e870: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
e880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e890: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
e8a0: 79 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72  y, regNewPeer, r
e8b0: 65 67 50 65 65 72 2c 20 6e 50 65 65 72 2d 31 29  egPeer, nPeer-1)
e8c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 69 6e  ;.    }..    win
e8d0: 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 70 50  dowReturnRows(pP
e8e0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67  arse, pMWin, reg
e8f0: 43 74 72 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  Ctr, regGosub, a
e900: 64 64 72 47 6f 73 75 62 2c 20 0a 20 20 20 20 20  ddrGosub, .     
e910: 20 20 20 28 62 43 75 72 72 65 6e 74 20 3f 20 72     (bCurrent ? r
e920: 65 67 41 72 67 20 3a 20 30 29 2c 20 28 62 43 75  egArg : 0), (bCu
e930: 72 72 65 6e 74 20 3f 20 72 65 67 53 69 7a 65 20  rrent ? regSize 
e940: 3a 20 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  : 0).    );.    
e950: 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73  if( addrJump ) s
e960: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
e970: 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b  re(v, addrJump);
e980: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 52 65 76  .  }..  if( bRev
e990: 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77  erse==0 ){.    w
e9a0: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
e9b0: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c  rse, pMWin, csrL
e9c0: 65 61 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20  ead, 0, regArg, 
e9d0: 72 65 67 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  regSize);.  }.  
e9e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e9f0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
ea00: 72 65 67 43 74 72 2c 20 31 29 3b 0a 20 20 73 71  regCtr, 1);.  sq
ea10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ea20: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c  v, OP_Next, csrL
ea30: 65 61 64 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  ead, addrNext);.
ea40: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
ea50: 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75  );..  windowRetu
ea60: 72 6e 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70  rnRows(pParse, p
ea70: 4d 57 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65  MWin, regCtr, re
ea80: 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
ea90: 62 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73 71 6c  b, 0, 0);..  sql
eaa0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
eab0: 61 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70 74 79  abel(v, lblEmpty
eac0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
ead0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
eae0: 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d  etSorter, pMWin-
eaf0: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c  >iEphCsr);.  sql
eb00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
eb10: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
eb20: 46 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f  FlushPart);..  /
eb30: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74  * Jump to here t
eb40: 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73  o skip over flus
eb50: 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20  h_partition */. 
eb60: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
eb70: 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f  Here(v, addrGoto
eb80: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e  );.}.../*.** RAN
eb90: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
eba0: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
ebb0: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
ebc0: 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20  *.**   ....**   
ebd0: 20 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74    if( new partit
ebe0: 69 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  ion ){.**       
ebf0: 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c  AggFinal (xFinal
ec00: 69 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f  ize).**       Go
ec10: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
ec20: 20 20 20 20 20 20 20 52 65 73 65 74 53 6f 72 74         ResetSort
ec30: 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20  er eph-table.** 
ec40: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65 6c 73      }.**     els
ec50: 65 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29  e if( new peer )
ec60: 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69  {.**       AggFi
ec70: 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20  nal (xValue).** 
ec80: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
ec90: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52  Gosub.**       R
eca0: 65 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74  esetSorter eph-t
ecb0: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  able.**     }.**
ecc0: 20 20 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20       AggStep.** 
ecd0: 20 20 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f      Insert (reco
ece0: 72 64 20 69 6e 74 6f 20 65 70 68 2d 74 61 62 6c  rd into eph-tabl
ecf0: 65 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57  e).**   sqlite3W
ed00: 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 41  hereEnd().**   A
ed10: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
ed20: 7a 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20 61  ze).**   Gosub a
ed30: 64 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52  ddrGosub.**.** R
ed40: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42  ANGE BETWEEN UNB
ed50: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
ed60: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
ed70: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
ed80: 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   As above, excep
ed90: 74 20 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e  t take no action
eda0: 20 66 6f 72 20 61 20 22 6e 65 77 20 70 65 65 72   for a "new peer
edb0: 22 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74  ". Invoke.**   t
edc0: 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f  he sub-routine o
edd0: 6e 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63  nce only for eac
ede0: 68 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a  h partition..**.
edf0: 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e  ** RANGE BETWEEN
ee00: 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44   CURRENT ROW AND
ee10: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a   CURRENT ROW.**.
ee20: 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65  **   As above, e
ee30: 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20 22  xcept that the "
ee40: 6e 65 77 20 70 65 65 72 22 20 63 6f 6e 64 69 74  new peer" condit
ee50: 69 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 69  ion is handled i
ee60: 6e 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20  n the.**   same 
ee70: 77 61 79 20 61 73 20 22 6e 65 77 20 70 61 72 74  way as "new part
ee80: 69 74 69 6f 6e 22 20 28 73 6f 20 74 68 65 72 65  ition" (so there
ee90: 20 69 73 20 6e 6f 20 22 65 6c 73 65 20 69 66 22   is no "else if"
eea0: 20 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52   block)..**.** R
eeb0: 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
eec0: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
eed0: 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  AND CURRENT ROW.
eee0: 2a 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76  ** .**   As abov
eef0: 65 2c 20 65 78 63 65 70 74 20 61 73 73 75 6d 65  e, except assume
ef00: 20 65 76 65 72 79 20 72 6f 77 20 69 73 20 61 20   every row is a 
ef10: 22 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f 0a 73  "new peer"..*/.s
ef20: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
ef30: 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70  wCodeDefaultStep
ef40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ef50: 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c  e, .  Select *p,
ef60: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
ef70: 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47  Info,.  int regG
ef80: 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64  osub, .  int add
ef90: 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64  rGosub.){.  Wind
efa0: 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70  ow *pMWin = p->p
efb0: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
efc0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
efd0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b  pParse);.  int k
efe0: 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72 20  ;.  int iSubCsr 
eff0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
f000: 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e  iCursor;.  int n
f010: 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
f020: 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  [0].pTab->nCol;.
f030: 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72    int reg = pPar
f040: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e  se->nMem+1;.  in
f050: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65  t regRecord = re
f060: 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65  g+nSub;.  int re
f070: 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f  gRowid = regReco
f080: 72 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64 64 72  rd+1;.  int addr
f090: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50  ;.  ExprList *pP
f0a0: 61 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61  art = pMWin->pPa
f0b0: 72 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c  rtition;.  ExprL
f0c0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
f0d0: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b  pMWin->pOrderBy;
f0e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69  ..  assert( pMWi
f0f0: 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  n->eType==TK_RAN
f100: 47 45 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 4d  GE .      || (pM
f110: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
f120: 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57  UNBOUNDED && pMW
f130: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
f140: 52 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20 61 73  RENT).  );..  as
f150: 73 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53  sert( (pMWin->eS
f160: 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart==TK_UNBOUND
f170: 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e  ED && pMWin->eEn
f180: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20  d==TK_CURRENT). 
f190: 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d        || (pMWin-
f1a0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
f1b0: 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e  UNDED && pMWin->
f1c0: 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
f1d0: 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ED).       || (p
f1e0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f1f0: 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69  _CURRENT && pMWi
f200: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
f210: 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ENT).       || (
f220: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
f230: 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57  K_CURRENT && pMW
f240: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
f250: 4f 55 4e 44 45 44 20 26 26 20 21 70 4f 72 64 65  OUNDED && !pOrde
f260: 72 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28  rBy).  );..  if(
f270: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
f280: 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
f290: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
f2a0: 20 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e    }..  pParse->n
f2b0: 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b  Mem += nSub + 2;
f2c0: 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74  ..  /* Martial t
f2d0: 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20  he row returned 
f2e0: 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  by the sub-selec
f2f0: 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  t into an array 
f300: 6f 66 20 0a 20 20 2a 2a 20 72 65 67 69 73 74 65  of .  ** registe
f310: 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  rs. */.  for(k=0
f320: 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a  ; k<nSub; k++){.
f330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f340: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
f350: 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20  mn, iSubCsr, k, 
f360: 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f  reg+k);.  }..  /
f370: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
f380: 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  is the start of 
f390: 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  a new partition 
f3a0: 6f 72 20 70 65 65 72 20 67 72 6f 75 70 2e 20 2a  or peer group. *
f3b0: 2f 0a 20 20 69 66 28 20 70 50 61 72 74 20 7c 7c  /.  if( pPart ||
f3c0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
f3d0: 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 50   int nPart = (pP
f3e0: 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78  art ? pPart->nEx
f3f0: 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  pr : 0);.    int
f400: 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a 20   addrGoto = 0;. 
f410: 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20     int addrJump 
f420: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 65  = 0;.    int nPe
f430: 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f  er = (pOrderBy ?
f440: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
f450: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66 28 20   : 0);..    if( 
f460: 70 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  pPart ){.      i
f470: 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20  nt regNewPart = 
f480: 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75  reg + pMWin->nBu
f490: 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20 4b  fferCol;.      K
f4a0: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
f4b0: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
f4c0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
f4d0: 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20  arse, pPart, 0, 
f4e0: 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  0);.      addr =
f4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f500: 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
f510: 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d  , regNewPart, pM
f520: 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61  Win->regPart,nPa
f530: 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
f540: 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
f550: 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66  , (void*)pKeyInf
f560: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
f570: 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d        addrJump =
f580: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f590: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
f5a0: 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32  ddr+2, 0, addr+2
f5b0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
f5c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
f5d0: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
f5e0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29  Parse, pMWin, 1)
f5f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
f600: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
f610: 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74  addrGoto = sqlit
f620: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
f630: 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20  OP_Goto);.      
f640: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
f650: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
f660: 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65     int regNewPee
f670: 72 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d  r = reg + pMWin-
f680: 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 6e 50  >nBufferCol + nP
f690: 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  art;.      int r
f6a0: 65 67 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e  egPeer = pMWin->
f6b0: 72 65 67 50 61 72 74 20 2b 20 6e 50 61 72 74 3b  regPart + nPart;
f6c0: 0a 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  ..      if( addr
f6d0: 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64  Jump ) sqlite3Vd
f6e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
f6f0: 64 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 69  drJump);.      i
f700: 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
f710: 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
f720: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
f730: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
f740: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
f750: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
f760: 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  erBy, 0, 0);.   
f770: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
f780: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
f790: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
f7a0: 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72  NewPeer, regPeer
f7b0: 2c 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20  , nPeer);.      
f7c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
f7d0: 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
f7e0: 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
f7f0: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 61  INFO);.        a
f800: 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65  ddrJump = sqlite
f810: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f820: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20  P_Jump, addr+2, 
f830: 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20  0, addr+2);.    
f840: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
f850: 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
f860: 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a 75  {.        addrJu
f870: 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mp = 0;.      }.
f880: 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46        windowAggF
f890: 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57  inal(pParse, pMW
f8a0: 69 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  in, pMWin->eStar
f8b0: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a  t==TK_CURRENT);.
f8c0: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 47 6f        if( addrGo
f8d0: 74 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  to ) sqlite3Vdbe
f8e0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
f8f0: 47 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Goto);.    }..  
f900: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f910: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
f920: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
f930: 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72  ,sqlite3VdbeCurr
f940: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
f950: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
f960: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
f970: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f980: 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c  Gosub, regGosub,
f990: 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20   addrGosub);.   
f9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f9b0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
f9c0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73  MWin->iEphCsr, s
f9d0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
f9e0: 74 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 20  tAddr(v)-1);.   
f9f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
fa00: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
fa10: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
fa20: 65 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69  esetSorter, pMWi
fa30: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20  n->iEphCsr);.   
fa40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fa50: 70 33 28 0a 20 20 20 20 20 20 20 20 76 2c 20 4f  p3(.        v, O
fa60: 50 5f 43 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69  P_Copy, reg+pMWi
fa70: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70  n->nBufferCol, p
fa80: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e  MWin->regPart, n
fa90: 50 61 72 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20  Part+nPeer-1.   
faa0: 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 61 64 64   );..    if( add
fab0: 72 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56  rJump ) sqlite3V
fac0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
fad0: 64 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20  ddrJump);.  }.. 
fae0: 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 65 70 20   /* Invoke step 
faf0: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e  function for win
fb00: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  dow functions */
fb10: 0a 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70  .  windowAggStep
fb20: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
fb30: 2d 31 2c 20 30 2c 20 72 65 67 2c 20 30 29 3b 0a  -1, 0, reg, 0);.
fb40: 0a 20 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65  .  /* Buffer the
fb50: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20   current row in 
fb60: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
fb70: 62 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d  ble. */.  if( pM
fb80: 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e  Win->nBufferCol>
fb90: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fba0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fbb0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
fbc0: 2c 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  , pMWin->nBuffer
fbd0: 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
fbe0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
fbf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
fc00: 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72  v, OP_Blob, 0, r
fc10: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73  egRecord);.    s
fc20: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
fc30: 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c  P4(v, (void*)"",
fc40: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
fc50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fc60: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57  OP_NewRowid, pMW
fc70: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67  in->iEphCsr, reg
fc80: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
fc90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fca0: 50 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d  P_Insert, pMWin-
fcb0: 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 65 63  >iEphCsr, regRec
fcc0: 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  ord, regRowid);.
fcd0: 0a 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61  .  /* End the da
fce0: 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
fcf0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68  . */.  sqlite3Wh
fd00: 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
fd10: 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61  .  windowAggFina
fd20: 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  l(pParse, pMWin,
fd30: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
fd40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
fd50: 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45  ewind, pMWin->iE
fd60: 70 68 43 73 72 2c 73 71 6c 69 74 65 33 56 64 62  phCsr,sqlite3Vdb
fd70: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
fd80: 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  3);.  VdbeCovera
fd90: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
fda0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fdb0: 5f 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62  _Gosub, regGosub
fdc0: 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20  , addrGosub);.  
fdd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fde0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d  2(v, OP_Next, pM
fdf0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71  Win->iEphCsr, sq
fe00: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fe10: 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 56 64  Addr(v)-1);.  Vd
fe20: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 7d  beCoverage(v);.}
fe30: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
fe40: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75   and return a du
fe50: 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57  plicate of the W
fe60: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64  indow object ind
fe70: 69 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a  icated by the.**
fe80: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e   third argument.
fe90: 20 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e   Set the Window.
fea0: 70 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20  pOwner field of 
feb0: 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74  the new object t
fec0: 6f 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a  o.** pOwner..*/.
fed0: 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57  Window *sqlite3W
fee0: 69 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33  indowDup(sqlite3
fef0: 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e   *db, Expr *pOwn
ff00: 65 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  er, Window *p){.
ff10: 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d    Window *pNew =
ff20: 20 30 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20   0;.  if( p ){. 
ff30: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
ff40: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ff50: 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29  , sizeof(Window)
ff60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
ff70: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a  ){.      pNew->z
ff80: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
ff90: 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e  StrDup(db, p->zN
ffa0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ame);.      pNew
ffb0: 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69  ->pFilter = sqli
ffc0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
ffd0: 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20  ->pFilter, 0);. 
ffe0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 74       pNew->pPart
fff0: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
10000 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
10010 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29  ->pPartition, 0)
10020 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f  ;.      pNew->pO
10030 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
10040 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
10050 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  p->pOrderBy, 0);
10060 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 54 79  .      pNew->eTy
10070 70 65 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20  pe = p->eType;. 
10080 20 20 20 20 20 70 4e 65 77 2d 3e 65 45 6e 64 20       pNew->eEnd 
10090 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 20  = p->eEnd;.     
100a0 20 70 4e 65 77 2d 3e 65 53 74 61 72 74 20 3d 20   pNew->eStart = 
100b0 70 2d 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 20  p->eStart;.     
100c0 20 70 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20   pNew->pStart = 
100d0 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
100e0 62 2c 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29  b, p->pStart, 0)
100f0 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45  ;.      pNew->pE
10100 6e 64 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  nd = sqlite3Expr
10110 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c  Dup(db, p->pEnd,
10120 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d   0);.      pNew-
10130 3e 70 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72  >pOwner = pOwner
10140 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10150 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
10160 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70  .** Return a cop
10170 79 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20  y of the linked 
10180 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f  list of Window o
10190 62 6a 65 63 74 73 20 70 61 73 73 65 64 20 61 73  bjects passed as
101a0 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61   the.** second a
101b0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64  rgument..*/.Wind
101c0 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f  ow *sqlite3Windo
101d0 77 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33  wListDup(sqlite3
101e0 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29   *db, Window *p)
101f0 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  {.  Window *pWin
10200 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74  ;.  Window *pRet
10210 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a   = 0;.  Window *
10220 2a 70 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20  *pp = &pRet;..  
10230 66 6f 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e  for(pWin=p; pWin
10240 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
10250 78 74 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20  xtWin){.    *pp 
10260 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44  = sqlite3WindowD
10270 75 70 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b  up(db, 0, pWin);
10280 0a 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20  .    if( *pp==0 
10290 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20  ) break;.    pp 
102a0 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  = &((*pp)->pNext
102b0 57 69 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Win);.  }..  ret
102c0 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
102d0 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  ** sqlite3WhereB
102e0 65 67 69 6e 28 29 20 68 61 73 20 61 6c 72 65 61  egin() has alrea
102f0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 66  dy been called f
10300 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
10310 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 70 61 73 73  atement .** pass
10320 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
10330 20 61 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74   argument when t
10340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
10350 69 6e 76 6f 6b 65 64 2e 20 49 74 20 67 65 6e 65  invoked. It gene
10360 72 61 74 65 73 0a 2a 2a 20 63 6f 64 65 20 74 6f  rates.** code to
10370 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 57 69   populate the Wi
10380 6e 64 6f 77 2e 72 65 67 52 65 73 75 6c 74 20 72  ndow.regResult r
10390 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68  egister for each
103a0 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
103b0 20 61 6e 64 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   and.** invoke t
103c0 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61  he sub-routine a
103d0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  t instruction ad
103e0 64 72 47 6f 73 75 62 20 6f 6e 63 65 20 66 6f 72  drGosub once for
103f0 20 65 61 63 68 20 72 6f 77 2e 0a 2a 2a 20 54 68   each row..** Th
10400 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
10410 73 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  s sqlite3WhereEn
10420 64 28 29 20 62 65 66 6f 72 65 20 72 65 74 75 72  d() before retur
10430 6e 69 6e 67 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  ning. .*/.void s
10440 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
10450 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
10460 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
10470 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
10480 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
10490 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104b0 20 52 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43   Rewritten SELEC
104c0 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
104d0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
104e0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
104f0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 72 65 74 75   /* Context retu
10500 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  rned by sqlite3W
10510 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
10520 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20   int regGosub,  
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72   /* Register for
10550 20 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69   OP_Gosub */.  i
10560 6e 74 20 61 64 64 72 47 6f 73 75 62 20 20 20 20  nt addrGosub    
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10580 2a 20 4f 50 5f 47 6f 73 75 62 20 68 65 72 65 20  * OP_Gosub here 
10590 74 6f 20 72 65 74 75 72 6e 20 65 61 63 68 20 72  to return each r
105a0 6f 77 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f  ow */.){.  Windo
105b0 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
105c0 69 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20  in;..  /* There 
105d0 61 72 65 20 74 68 72 65 65 20 64 69 66 66 65 72  are three differ
105e0 65 6e 74 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ent functions th
105f0 61 74 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  at may be used t
10600 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 0a 20 20  o do the work.  
10610 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20  ** of this one, 
10620 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
10630 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 61 6e   window frame an
10640 64 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62  d the specific b
10650 75 69 6c 74 2d 69 6e 0a 20 20 2a 2a 20 77 69 6e  uilt-in.  ** win
10660 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73  dow functions us
10670 65 64 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 2a  ed (if any)..  *
10680 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64  *.  ** windowCod
10690 65 52 6f 77 45 78 70 72 53 74 65 70 28 29 20 68  eRowExprStep() h
106a0 61 6e 64 6c 65 73 20 61 6c 6c 20 22 52 4f 57 53  andles all "ROWS
106b0 22 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c  " window frames,
106c0 20 65 78 63 65 70 74 20 66 6f 72 3a 0a 20 20 2a   except for:.  *
106d0 2a 0a 20 20 2a 2a 20 20 20 52 4f 57 53 20 42 45  *.  **   ROWS BE
106e0 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
106f0 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
10700 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20  RRENT ROW.  **. 
10710 20 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f   ** The exceptio
10720 6e 20 69 73 20 62 65 63 61 75 73 65 20 77 69 6e  n is because win
10730 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74  dowCodeRowExprSt
10740 65 70 28 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20  ep() implements 
10750 61 6c 6c 20 77 69 6e 64 6f 77 0a 20 20 2a 2a 20  all window.  ** 
10760 66 72 61 6d 65 20 74 79 70 65 73 20 62 79 20 63  frame types by c
10770 61 63 68 69 6e 67 20 74 68 65 20 65 6e 74 69 72  aching the entir
10780 65 20 70 61 72 74 69 74 69 6f 6e 20 69 6e 20 61  e partition in a
10790 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 61 6e 64   temp table, and
107a0 0a 20 20 2a 2a 20 22 52 4f 57 53 20 42 45 54 57  .  ** "ROWS BETW
107b0 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
107c0 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
107d0 45 4e 54 20 52 4f 57 22 20 69 73 20 65 61 73 79  ENT ROW" is easy
107e0 20 65 6e 6f 75 67 68 20 74 6f 0a 20 20 2a 2a 20   enough to.  ** 
107f0 69 6d 70 6c 65 6d 65 6e 74 20 77 69 74 68 6f 75  implement withou
10800 74 20 73 75 63 68 20 61 20 63 61 63 68 65 2e 0a  t such a cache..
10810 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77    **.  ** window
10820 43 6f 64 65 43 61 63 68 65 53 74 65 70 28 29 20  CodeCacheStep() 
10830 69 73 20 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a  is used for:.  *
10840 2a 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42  *.  **   RANGE B
10850 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
10860 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44  OW AND UNBOUNDED
10870 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a   FOLLOWING.  **.
10880 20 20 2a 2a 20 49 74 20 69 73 20 61 6c 73 6f 20    ** It is also 
10890 75 73 65 64 20 66 6f 72 20 61 6e 79 74 68 69 6e  used for anythin
108a0 67 20 6e 6f 74 20 68 61 6e 64 6c 65 64 20 62 79  g not handled by
108b0 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78   windowCodeRowEx
108c0 70 72 53 74 65 70 28 29 20 0a 20 20 2a 2a 20 74  prStep() .  ** t
108d0 68 61 74 20 69 6e 76 6f 6b 65 73 20 61 20 62 75  hat invokes a bu
108e0 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
108f0 6e 63 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75  nction that requ
10900 69 72 65 73 20 74 68 65 20 65 6e 74 69 72 65 20  ires the entire 
10910 0a 20 20 2a 2a 20 70 61 72 74 69 74 69 6f 6e 20  .  ** partition 
10920 74 6f 20 62 65 20 63 61 63 68 65 64 20 69 6e 20  to be cached in 
10930 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
10940 6f 72 65 20 61 6e 79 20 72 6f 77 73 20 61 72 65  ore any rows are
10950 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 28   returned.  ** (
10960 65 2e 67 2e 20 6e 74 68 5f 76 61 6c 75 65 28 29  e.g. nth_value()
10970 20 6f 72 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b   or percent_rank
10980 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46  ())..  **.  ** F
10990 69 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 69 6e 67  inally, assuming
109a0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 62 75 69   there is no bui
109b0 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
109c0 63 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69  ction that requi
109d0 72 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  res.  ** the par
109e0 74 69 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 63  tition to be cac
109f0 68 65 64 2c 20 77 69 6e 64 6f 77 43 6f 64 65 44  hed, windowCodeD
10a00 65 66 61 75 6c 74 53 74 65 70 28 29 20 69 73 20  efaultStep() is 
10a10 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20  used for:.  **. 
10a20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57   **   RANGE BETW
10a30 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
10a40 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
10a50 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20  ENT ROW .  **   
10a60 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e  RANGE BETWEEN UN
10a70 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
10a80 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  G AND UNBOUNDED 
10a90 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20  FOLLOWING.  **  
10aa0 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
10ab0 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43  URRENT ROW AND C
10ac0 55 52 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a  URRENT ROW .  **
10ad0 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20     ROWS BETWEEN 
10ae0 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
10af0 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
10b00 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69  ROW.  **.  ** wi
10b10 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53  ndowCodeDefaultS
10b20 74 65 70 28 29 20 69 73 20 74 68 65 20 6f 6e 6c  tep() is the onl
10b30 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72  y one of the thr
10b40 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ee functions tha
10b50 74 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  t.  ** does not 
10b60 63 61 63 68 65 20 65 61 63 68 20 70 61 72 74 69  cache each parti
10b70 74 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20 74  tion in a temp t
10b80 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69  able before begi
10b90 6e 6e 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 72 65  nning to.  ** re
10ba0 74 75 72 6e 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a  turn rows..  */.
10bb0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79    if( pMWin->eTy
10bc0 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 0a 20 20 20  pe==TK_ROWS .   
10bd0 26 26 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  && (pMWin->eStar
10be0 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c  t!=TK_UNBOUNDED|
10bf0 7c 70 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b  |pMWin->eEnd!=TK
10c00 5f 43 55 52 52 45 4e 54 7c 7c 21 70 4d 57 69 6e  _CURRENT||!pMWin
10c10 2d 3e 70 4f 72 64 65 72 42 79 29 0a 20 20 29 7b  ->pOrderBy).  ){
10c20 0a 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 52  .    windowCodeR
10c30 6f 77 45 78 70 72 53 74 65 70 28 70 50 61 72 73  owExprStep(pPars
10c40 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65  e, p, pWInfo, re
10c50 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75  gGosub, addrGosu
10c60 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
10c70 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
10c80 20 20 20 69 6e 74 20 62 43 61 63 68 65 20 3d 20     int bCache = 
10c90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10ca0 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
10cb0 43 61 63 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a  CacheStep() */..
10cc0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
10cd0 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
10ce0 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  T && pMWin->eEnd
10cf0 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  ==TK_UNBOUNDED )
10d00 7b 0a 20 20 20 20 20 20 62 43 61 63 68 65 20 3d  {.      bCache =
10d10 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
10d20 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d       for(pWin=pM
10d30 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
10d40 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
10d50 0a 20 20 20 20 20 20 20 20 46 75 6e 63 44 65 66  .        FuncDef
10d60 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
10d70 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 69  pFunc;.        i
10d80 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  f( (pFunc->funcF
10d90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
10da0 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a  NC_WINDOW_SIZE).
10db0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75           || (pFu
10dc0 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6e 74 68 5f  nc->xSFunc==nth_
10dd0 76 61 6c 75 65 53 74 65 70 46 75 6e 63 29 0a 20  valueStepFunc). 
10de0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e          || (pFun
10df0 63 2d 3e 78 53 46 75 6e 63 3d 3d 66 69 72 73 74  c->xSFunc==first
10e00 5f 76 61 6c 75 65 53 74 65 70 46 75 6e 63 29 0a  _valueStepFunc).
10e10 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75           || (pFu
10e20 6e 63 2d 3e 78 53 46 75 6e 63 3d 3d 6c 65 61 64  nc->xSFunc==lead
10e30 53 74 65 70 46 75 6e 63 29 0a 20 20 20 20 20 20  StepFunc).      
10e40 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 78 53     || (pFunc->xS
10e50 46 75 6e 63 3d 3d 6c 61 67 53 74 65 70 46 75 6e  Func==lagStepFun
10e60 63 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  c).        ){.  
10e70 20 20 20 20 20 20 20 20 62 43 61 63 68 65 20 3d          bCache =
10e80 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
10e90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
10ea0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10eb0 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
10ec0 63 61 6c 6c 20 77 69 6e 64 6f 77 43 6f 64 65 44  call windowCodeD
10ed0 65 66 61 75 6c 74 53 74 65 70 28 29 2e 20 20 2a  efaultStep().  *
10ee0 2f 0a 20 20 20 20 69 66 28 20 62 43 61 63 68 65  /.    if( bCache
10ef0 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77   ){.      window
10f00 43 6f 64 65 43 61 63 68 65 53 74 65 70 28 70 50  CodeCacheStep(pP
10f10 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
10f20 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
10f30 6f 73 75 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65  osub);.    }else
10f40 7b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f  {.      windowCo
10f50 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 70 50  deDefaultStep(pP
10f60 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
10f70 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
10f80 6f 73 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  osub);.    }.  }
10f90 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
10fa0 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
10fb0 46 55 4e 43 20 2a 2f 0a                          FUNC */.