/ Hex Artifact Content
Login

Artifact df2bc08168ec3d7509d4674b0e52f90f83011425e0d6519240cec051d16cbd62:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75 6d  on rank(). Assum
1b60: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
1b70: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
1b80: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
1b90: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
1ba0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1bb0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
1bc0: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
1bd0: 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46  c void rankStepF
1be0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1bf0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1c00: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1c10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1c20: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1c30: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1c40: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1c50: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1c60: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1c70: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1c80: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1c90: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1ca0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1cc0: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
1cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
1ce0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1cf0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
1d00: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
1d10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
1d20: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
1d30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1d40: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
1d50: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
1d60: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
1d70: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
1d80: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
1d90: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
1da0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1db0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1dc0: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e  int64(pCtx, p->n
1dd0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 6e  Value);.    p->n
1de0: 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Value = 0;.  }.}
1df0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1e00: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1e10: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1e20: 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28  on percent_rank(
1e30: 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a  ). Assumes that.
1e40: 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ** the window fr
1e50: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ame has been set
1e60: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e   to:.**.**   RAN
1e70: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
1e80: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
1e90: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
1ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1eb0: 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70 46  ercent_rankStepF
1ec0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ed0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1ee0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1ef0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1f00: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1f10: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55  allCount *p;.  U
1f20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f30: 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e  nArg); assert( n
1f40: 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 70 20 3d  Arg==1 );..  p =
1f50: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
1f60: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
1f70: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1f80: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1f90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fa0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
1fb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f   ){.      p->nTo
1fc0: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
1fd0: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1fe0: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
1ff0: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
2000: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
2010: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
2020: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
2030: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2040: 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74 5f 72  c void percent_r
2050: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
2060: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2070: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2080: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2090: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
20a0: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
20b0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
20c0: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
20d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
20e0: 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31   if( p->nTotal>1
20f0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
2100: 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d   r = (double)(p-
2110: 3e 6e 56 61 6c 75 65 2d 31 29 20 2f 20 28 64 6f  >nValue-1) / (do
2120: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2130: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2140: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2150: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2160: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2170: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2180: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2190: 20 7d 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65   }.    p->nValue
21a0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
21b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
21c0: 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69  n of built-in wi
21d0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75  ndow function cu
21e0: 6d 65 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d  me_dist(). Assum
21f0: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
2200: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
2210: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
2220: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
2230: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
2240: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2250: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
2260: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
2270: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2290: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
22a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22b0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
22c0: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70  uct CallCount *p
22d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
22e0: 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50 41  ==1 ); UNUSED_PA
22f0: 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 0a  RAMETER(nArg);..
2300: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2310: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2320: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2330: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2340: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2360: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  al==0 ){.      p
2370: 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74  ->nTotal = sqlit
2380: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2390: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  pArg[0]);.    }.
23a0: 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
23b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
23c0: 64 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65  d cume_distValue
23d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
23e0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
23f0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
2400: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
2410: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2420: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2430: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2440: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
2450: 70 20 26 26 20 70 2d 3e 6e 54 6f 74 61 6c 20 29  p && p->nTotal )
2460: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d  {.    double r =
2470: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74   (double)(p->nSt
2480: 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  ep) / (double)(p
2490: 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73  ->nTotal);.    s
24a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
24b0: 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20  uble(pCtx, r);. 
24c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
24d0: 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e  ext object for n
24e0: 74 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75  tile() window fu
24f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63  nction..*/.struc
2500: 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69  t NtileCtx {.  i
2510: 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20  64 nTotal;      
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2530: 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20  * Total rows in 
2540: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  partition */.  i
2550: 36 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20  64 nParam;      
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2570: 2a 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73  * Parameter pass
2580: 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a  ed to ntile(N) *
2590: 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20  /.  i64 iRow;   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
25c0: 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.};../*.** 
25d0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25e0: 66 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20  f ntile(). This 
25f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
2600: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
2610: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65  s.** been coerce
2620: 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  d to:.**.**   RO
2630: 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  WS UNBOUNDED PRE
2640: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2650: 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63  NT ROW.*/.static
2660: 20 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46   void ntileStepF
2670: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2680: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
2690: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
26a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
26b0: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e  rg.){.  struct N
26c0: 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73  tileCtx *p;.  as
26d0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
26e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26f0: 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  R(nArg);.  p = (
2700: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a  struct NtileCtx*
2710: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2720: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2730: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2740: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
2750: 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b   p->nTotal==0 ){
2760: 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d  .      p->nParam
2770: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2780: 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29  _int64(apArg[0])
2790: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61  ;.      p->nTota
27a0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
27b0: 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d  e_int64(apArg[1]
27c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
27d0: 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20  nParam<=0 ){.   
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
27f0: 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20  ult_error(.     
2800: 20 20 20 20 20 20 20 70 43 74 78 2c 20 22 61 72         pCtx, "ar
2810: 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20  gument of ntile 
2820: 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69  must be a positi
2830: 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a  ve integer", -1.
2840: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2850: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2860: 69 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  iRow++;.  }.}.st
2870: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 56  atic void ntileV
2880: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2890: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
28a0: 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43  .  struct NtileC
28b0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
28c0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
28d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2900: 28 20 70 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d  ( p && p->nParam
2910: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  >0 ){.    int nS
2920: 69 7a 65 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c  ize = (p->nTotal
2930: 20 2f 20 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20   / p->nParam);. 
2940: 20 20 20 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20     if( nSize==0 
2950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2960: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
2970: 74 78 2c 20 70 2d 3e 69 52 6f 77 29 3b 0a 20 20  tx, p->iRow);.  
2980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2990: 36 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e  64 nLarge = p->n
29a0: 54 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61  Total - p->nPara
29b0: 6d 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  m*nSize;.      i
29c0: 36 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72  64 iSmall = nLar
29d0: 67 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20  ge*(nSize+1);.  
29e0: 20 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70      i64 iRow = p
29f0: 2d 3e 69 52 6f 77 2d 31 3b 0a 0a 20 20 20 20 20  ->iRow-1;..     
2a00: 20 61 73 73 65 72 74 28 20 28 6e 4c 61 72 67 65   assert( (nLarge
2a10: 2a 28 6e 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d  *(nSize+1) + (p-
2a20: 3e 6e 50 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a  >nParam-nLarge)*
2a30: 6e 53 69 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61  nSize)==p->nTota
2a40: 6c 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  l );..      if( 
2a50: 69 52 6f 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20  iRow<iSmall ){. 
2a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2a70: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2a80: 2c 20 31 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a  , 1 + iRow/(nSiz
2a90: 65 2b 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e+1));.      }el
2aa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ab0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2ac0: 28 70 43 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67  (pCtx, 1 + nLarg
2ad0: 65 20 2b 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c  e + (iRow-iSmall
2ae0: 29 2f 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  )/nSize);.      
2af0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2b00: 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a  *.** Context obj
2b10: 65 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c  ect for last_val
2b20: 75 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63  ue() window func
2b30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tion..*/.struct 
2b40: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20  LastValueCtx {. 
2b50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b60: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  pVal;.  int nVal
2b70: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.};../*.** Impl
2b80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61  ementation of la
2b90: 73 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73  st_value()..*/.s
2ba0: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f  tatic void last_
2bb0: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20  valueStepFunc(. 
2bc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2bd0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2be0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2bf0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2c00: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
2c10: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
2c20: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
2c30: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2c40: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
2c50: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2c60: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
2c70: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2c80: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
2c90: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
2ca0: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e  ->pVal);.    p->
2cb0: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVal = sqlite3_v
2cc0: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2cd0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ]);.    if( p->p
2ce0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2cf0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2d00: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d20: 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20     p->nVal++;.  
2d30: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2d40: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2d50: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
2d60: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2d70: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2d80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d90: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2da0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2db0: 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  *p;.  UNUSED_PAR
2dc0: 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20  AMETER(nArg);.  
2dd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2de0: 28 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  (apArg);.  p = (
2df0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2e00: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
2e10: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2e20: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
2e30: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
2e40: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c  ) ){.    p->nVal
2e50: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
2e60: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
2e80: 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  ee(p->pVal);.   
2e90: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a     p->pVal = 0;.
2ea0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
2eb0: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2ec0: 75 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  ueValueFunc(sqli
2ed0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2ee0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
2ef0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
2f00: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
2f10: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
2f20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2f30: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2f40: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2f50: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
2f60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f70: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
2f80: 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  Val);.  }.}.stat
2f90: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2fa0: 75 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73  ueFinalizeFunc(s
2fb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2fc0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
2fd0: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b  LastValueCtx *p;
2fe0: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c  .  p = (struct L
2ff0: 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c  astValueCtx*)sql
3000: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3010: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
3020: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
3030: 70 20 26 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a  p && p->pVal ){.
3040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3050: 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 70  lt_value(pCtx, p
3060: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ->pVal);.    sql
3070: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
3080: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
3090: 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d  >pVal = 0;.  }.}
30a0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e  ../*.** Static n
30b0: 61 6d 65 73 20 66 6f 72 20 74 68 65 20 62 75 69  ames for the bui
30c0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
30d0: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
30e0: 65 73 65 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61  ese static.** na
30f0: 6d 65 73 20 61 72 65 20 75 73 65 64 2c 20 72 61  mes are used, ra
3100: 74 68 65 72 20 74 68 61 6e 20 73 74 72 69 6e 67  ther than string
3110: 20 6c 69 74 65 72 61 6c 73 2c 20 73 6f 20 74 68   literals, so th
3120: 61 74 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63  at FuncDef objec
3130: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 61 73 73  ts.** can be ass
3140: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
3150: 61 72 74 69 63 75 6c 61 72 20 77 69 6e 64 6f 77  articular window
3160: 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 64 69 72   function by dir
3170: 65 63 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ect.** compariso
3180: 6e 20 6f 66 20 74 68 65 20 7a 4e 61 6d 65 20 70  n of the zName p
3190: 6f 69 6e 74 65 72 2e 20 20 45 78 61 6d 70 6c 65  ointer.  Example
31a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66  :.**.**       if
31b0: 28 20 70 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d  ( pFuncDef->zNam
31c0: 65 3d 3d 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65  e==row_valueName
31d0: 20 29 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61   ){ ... }.*/.sta
31e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
31f0: 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20  ow_numberName[] 
3200: 3d 20 20 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22  =   "row_number"
3210: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ;.static const c
3220: 68 61 72 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61  har dense_rankNa
3230: 6d 65 5b 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f  me[] =   "dense_
3240: 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f  rank";.static co
3250: 6e 73 74 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d  nst char rankNam
3260: 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 72  e[] =         "r
3270: 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ank";.static con
3280: 73 74 20 63 68 61 72 20 70 65 72 63 65 6e 74 5f  st char percent_
3290: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65  rankName[] = "pe
32a0: 72 63 65 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61  rcent_rank";.sta
32b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 63  tic const char c
32c0: 75 6d 65 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d  ume_distName[] =
32d0: 20 20 20 20 22 63 75 6d 65 5f 64 69 73 74 22 3b      "cume_dist";
32e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
32f0: 61 72 20 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d  ar ntileName[] =
3300: 20 20 20 20 20 20 20 20 22 6e 74 69 6c 65 22 3b          "ntile";
3310: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3320: 61 72 20 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d  ar last_valueNam
3330: 65 5b 5d 20 3d 20 20 20 22 6c 61 73 74 5f 76 61  e[] =   "last_va
3340: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3350: 73 74 20 63 68 61 72 20 6e 74 68 5f 76 61 6c 75  st char nth_valu
3360: 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74  eName[] =    "nt
3370: 68 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  h_value";.static
3380: 20 63 6f 6e 73 74 20 63 68 61 72 20 66 69 72 73   const char firs
3390: 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  t_valueName[] = 
33a0: 20 22 66 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a   "first_value";.
33b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
33c0: 72 20 6c 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20  r leadName[] =  
33d0: 20 20 20 20 20 20 20 22 6c 65 61 64 22 3b 0a 73         "lead";.s
33e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
33f0: 20 6c 61 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20   lagName[] =    
3400: 20 20 20 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a        "lag";../*
3410: 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d  .** No-op implem
3420: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 78 53 74  entations of xSt
3430: 65 70 28 29 20 61 6e 64 20 78 46 69 6e 61 6c 69  ep() and xFinali
3440: 7a 65 28 29 2e 20 20 55 73 65 64 20 61 73 20 70  ze().  Used as p
3450: 6c 61 63 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20  lace-holders.** 
3460: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
3470: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3480: 61 74 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  at never call th
3490: 6f 73 65 20 69 6e 74 65 72 66 61 63 65 73 2e 0a  ose interfaces..
34a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61  **.** The noopVa
34b0: 6c 75 65 46 75 6e 63 28 29 20 69 73 20 63 61 6c  lueFunc() is cal
34c0: 6c 65 64 20 62 75 74 20 69 73 20 65 78 70 65 63  led but is expec
34d0: 74 65 64 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e  ted to do nothin
34e0: 67 2e 20 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53  g.  The.** noopS
34f0: 74 65 70 46 75 6e 63 28 29 20 69 73 20 6e 65 76  tepFunc() is nev
3500: 65 72 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  er called, and s
3510: 6f 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 77  o it is marked w
3520: 69 74 68 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a  ith NO_TEST to.*
3530: 2a 20 6c 65 74 20 74 68 65 20 74 65 73 74 20 63  * let the test c
3540: 6f 76 65 72 61 67 65 20 72 6f 75 74 69 6e 65 20  overage routine 
3550: 6b 6e 6f 77 20 6e 6f 74 20 74 6f 20 65 78 70 65  know not to expe
3560: 63 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ct this function
3570: 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65   to be.** invoke
3580: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3590: 64 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 20  d noopStepFunc( 
35a0: 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
35b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
35c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f   *p,        /*NO
35d0: 5f 54 45 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c  _TEST*/.  int n,
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
3600: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3610: 20 2a 2a 61 20 20 20 20 20 20 20 20 20 20 2f 2a   **a          /*
3620: 4e 4f 5f 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20  NO_TEST*/.){    
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
3650: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
3660: 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
3670: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e  /*NO_TEST*/.  UN
3680: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
3690: 29 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  );       /*NO_TE
36a0: 53 54 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  ST*/.  UNUSED_PA
36b0: 52 41 4d 45 54 45 52 28 61 29 3b 20 20 20 20 20  RAMETER(a);     
36c0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
36d0: 61 73 73 65 72 74 28 30 29 3b 20 20 20 20 20 20  assert(0);      
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
36f0: 54 45 53 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20  TEST*/.}        
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
3720: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70  static void noop
3730: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
3740: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55  3_context *p){ U
3750: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3760: 70 29 3b 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a  p); /*no-op*/ }.
3770: 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74  ./* Window funct
3780: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c  ions that use al
3790: 6c 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61  l window interfa
37a0: 63 65 73 3a 20 78 53 74 65 70 2c 20 78 46 69 6e  ces: xStep, xFin
37b0: 61 6c 2c 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61  al,.** xValue, a
37c0: 6e 64 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23  nd xInverse */.#
37d0: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e  define WINDOWFUN
37e0: 43 41 4c 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  CALL(name,nArg,e
37f0: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41            \.  nA
3820: 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38  rg, (SQLITE_UTF8
3830: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e  |SQLITE_FUNC_WIN
3840: 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30  DOW|extra), 0, 0
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3860: 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20         \.  name 
3870: 23 23 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d  ## StepFunc, nam
3880: 65 20 23 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e  e ## FinalizeFun
3890: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
38a0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
38b0: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
38c0: 49 6e 76 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  InvFunc, name ##
38d0: 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20   Name, {0}      
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20   \.}../* Window 
3910: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
3920: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  re implemented u
3930: 73 69 6e 67 20 62 79 74 65 63 6f 64 65 20 61 6e  sing bytecode an
3940: 64 20 74 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e  d thus have.** n
3950: 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 73 20 66 6f  o-op routines fo
3960: 72 20 74 68 65 69 72 20 6d 65 74 68 6f 64 73 20  r their methods 
3970: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  */.#define WINDO
3980: 57 46 55 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e  WFUNCNOOP(name,n
3990: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
39c0: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
39d0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
39e0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
39f0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
3a00: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3a10: 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f  oopStepFunc, noo
3a20: 70 56 61 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70  pValueFunc, noop
3a30: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
3a60: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
3a70: 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20  # Name, {0}     
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e       \.}../* Win
3ab0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ac0: 61 74 20 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f  at use all windo
3ad0: 77 20 69 6e 74 65 72 66 61 63 65 73 3a 20 78 53  w interfaces: xS
3ae0: 74 65 70 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65  tep, the.** same
3af0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 78 46 69   routine for xFi
3b00: 6e 61 6c 69 7a 65 20 61 6e 64 20 78 56 61 6c 75  nalize and xValu
3b10: 65 20 61 6e 64 20 77 68 69 63 68 20 6e 65 76 65  e and which neve
3b20: 72 20 63 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72  r call.** xInver
3b30: 73 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se. */.#define W
3b40: 49 4e 44 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c  INDOWFUNCX(name,
3b50: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
3b90: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
3ba0: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3bb0: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3bd0: 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46  .  name ## StepF
3be0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
3bf0: 75 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  ueFunc, name ## 
3c00: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3c20: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 61  noopStepFunc, na
3c30: 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20  me ## Name, {0} 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f           \.}.../
3c70: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
3c80: 6f 73 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ose built-in win
3c90: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ca0: 61 74 20 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20  at are not also 
3cb0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76  aggregates..*/.v
3cc0: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
3cd0: 77 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  wFunctions(void)
3ce0: 7b 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63 44  {.  static FuncD
3cf0: 65 66 20 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b  ef aWindowFuncs[
3d00: 5d 20 3d 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57  ] = {.    WINDOW
3d10: 46 55 4e 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72  FUNCX(row_number
3d20: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d30: 44 4f 57 46 55 4e 43 58 28 64 65 6e 73 65 5f 72  DOWFUNCX(dense_r
3d40: 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20  ank, 0, 0),.    
3d50: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b  WINDOWFUNCX(rank
3d60: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d70: 44 4f 57 46 55 4e 43 58 28 70 65 72 63 65 6e 74  DOWFUNCX(percent
3d80: 5f 72 61 6e 6b 2c 20 30 2c 20 53 51 4c 49 54 45  _rank, 0, SQLITE
3d90: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
3da0: 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  E),.    WINDOWFU
3db0: 4e 43 58 28 63 75 6d 65 5f 64 69 73 74 2c 20 30  NCX(cume_dist, 0
3dc0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  , SQLITE_FUNC_WI
3dd0: 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20  NDOW_SIZE),.    
3de0: 57 49 4e 44 4f 57 46 55 4e 43 58 28 6e 74 69 6c  WINDOWFUNCX(ntil
3df0: 65 2c 20 31 2c 20 53 51 4c 49 54 45 5f 46 55 4e  e, 1, SQLITE_FUN
3e00: 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a  C_WINDOW_SIZE),.
3e10: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c      WINDOWFUNCAL
3e20: 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31 2c  L(last_value, 1,
3e30: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
3e40: 55 4e 43 4e 4f 4f 50 28 6e 74 68 5f 76 61 6c 75  UNCNOOP(nth_valu
3e50: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
3e60: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 66 69 72  NDOWFUNCNOOP(fir
3e70: 73 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c  st_value, 1, 0),
3e80: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3e90: 4f 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c  OOP(lead, 1, 0),
3ea0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3eb0: 4f 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c  OOP(lead, 2, 0),
3ec0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ed0: 4f 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c  OOP(lead, 3, 0),
3ee0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ef0: 4f 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a  OOP(lag, 1, 0),.
3f00: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
3f10: 4f 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20  OP(lag, 2, 0),. 
3f20: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
3f30: 50 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20  P(lag, 3, 0),.  
3f40: 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65  };.  sqlite3Inse
3f50: 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61  rtBuiltinFuncs(a
3f60: 57 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72  WindowFuncs, Arr
3f70: 61 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75  aySize(aWindowFu
3f80: 6e 63 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ncs));.}../*.** 
3f90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3fa0: 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
3fb0: 65 6c 79 20 61 66 74 65 72 20 72 65 73 6f 6c 76  ely after resolv
3fc0: 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ing the function
3fd0: 20 6e 61 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77   name.** for a w
3fe0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77  indow function w
3ff0: 69 74 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73  ithin a SELECT s
4000: 74 61 74 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65  tatement. Argume
4010: 6e 74 20 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a  nt pList is a.**
4020: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
4030: 57 49 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f  WINDOW definitio
4040: 6e 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ns for the curre
4050: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
4060: 65 6e 74 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ent..** Argument
4070: 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 66 75   pFunc is the fu
4080: 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
4090: 6e 20 6a 75 73 74 20 72 65 73 6f 6c 76 65 64 20  n just resolved 
40a0: 61 6e 64 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74  and pWin.** is t
40b0: 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  he Window object
40c0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
40d0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 4f 56 45  e associated OVE
40e0: 52 20 63 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a  R clause. This.*
40f0: 2a 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74  * function updat
4100: 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
4110: 6f 66 20 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f  of pWin as follo
4120: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
4130: 20 74 68 65 20 4f 56 45 52 20 63 6c 61 75 73 65   the OVER clause
4140: 20 72 65 66 65 72 65 64 20 74 6f 20 61 20 6e 61   refered to a na
4150: 6d 65 64 20 77 69 6e 64 6f 77 20 28 61 73 20 69  med window (as i
4160: 6e 20 22 6d 61 78 28 78 29 20 4f 56 45 52 20 77  n "max(x) OVER w
4170: 69 6e 22 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61  in"),.**     sea
4180: 72 63 68 20 6c 69 73 74 20 70 4c 69 73 74 20 66  rch list pList f
4190: 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 57 49  or a matching WI
41a0: 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c  NDOW definition,
41b0: 20 61 6e 64 20 75 70 64 61 74 65 20 70 57 69 6e   and update pWin
41c0: 0a 2a 2a 20 20 20 20 20 61 63 63 6f 72 64 69 6e  .**     accordin
41d0: 67 6c 79 2e 20 49 66 20 6e 6f 20 73 75 63 68 20  gly. If no such 
41e0: 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 63 61  WINDOW clause ca
41f0: 6e 20 62 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76  n be found, leav
4200: 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20  e an error.**   
4210: 20 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a    in pParse..**.
4220: 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 66 75  **   * If the fu
4230: 6e 63 74 69 6f 6e 20 69 73 20 61 20 62 75 69 6c  nction is a buil
4240: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
4250: 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72  tion that requir
4260: 65 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 77 69  es the.**     wi
4270: 6e 64 6f 77 20 74 6f 20 62 65 20 63 6f 65 72 63  ndow to be coerc
4280: 65 64 20 28 73 65 65 20 22 42 55 49 4c 54 2d 49  ed (see "BUILT-I
4290: 4e 20 57 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f  N WINDOW FUNCTIO
42a0: 4e 53 22 20 61 74 20 74 68 65 20 74 6f 70 0a 2a  NS" at the top.*
42b0: 2a 20 20 20 20 20 6f 66 20 74 68 69 73 20 66 69  *     of this fi
42c0: 6c 65 29 2c 20 70 57 69 6e 20 69 73 20 75 70 64  le), pWin is upd
42d0: 61 74 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f  ated here..*/.vo
42e0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
42f0: 55 70 64 61 74 65 28 0a 20 20 50 61 72 73 65 20  Update(.  Parse 
4300: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
4310: 6f 77 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  ow *pList,      
4320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4330: 69 73 74 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e  ist of named win
4340: 64 6f 77 73 20 66 6f 72 20 74 68 69 73 20 53 45  dows for this SE
4350: 4c 45 43 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77  LECT */.  Window
4360: 20 2a 70 57 69 6e 2c 20 20 20 20 20 20 20 20 20   *pWin,         
4370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
4380: 64 6f 77 20 66 72 61 6d 65 20 74 6f 20 75 70 64  dow frame to upd
4390: 61 74 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66  ate */.  FuncDef
43a0: 20 2a 70 46 75 6e 63 20 20 20 20 20 20 20 20 20   *pFunc         
43b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64           /* Wind
43c0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  ow function defi
43d0: 6e 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  nition */.){.  i
43e0: 66 28 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26  f( pWin->zName &
43f0: 26 20 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 30  & pWin->eType==0
4400: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
4410: 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  p;.    for(p=pLi
4420: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  st; p; p=p->pNex
4430: 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 69 66 28  tWin){.      if(
4440: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
4450: 70 2d 3e 7a 4e 61 6d 65 2c 20 70 57 69 6e 2d 3e  p->zName, pWin->
4460: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
4470: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
4480: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
4490: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
44a0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
44b0: 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 70 57 69  window: %s", pWi
44c0: 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n->zName);.     
44d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
44e0: 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74     pWin->pPartit
44f0: 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ion = sqlite3Exp
4500: 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
4510: 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69  >db, p->pPartiti
4520: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e  on, 0);.    pWin
4530: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
4540: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4550: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
4560: 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
4570: 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20   pWin->pStart = 
4580: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4590: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53  Parse->db, p->pS
45a0: 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 70 57  tart, 0);.    pW
45b0: 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74  in->pEnd = sqlit
45c0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
45d0: 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30  ->db, p->pEnd, 0
45e0: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 53 74  );.    pWin->eSt
45f0: 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b  art = p->eStart;
4600: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20  .    pWin->eEnd 
4610: 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 70  = p->eEnd;.    p
4620: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e  Win->eType = p->
4630: 65 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eType;.  }.  if(
4640: 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67   pFunc->funcFlag
4650: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
4660: 57 49 4e 44 4f 57 20 29 7b 0a 20 20 20 20 73 71  WINDOW ){.    sq
4670: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4680: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  se->db;.    if( 
4690: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
46a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
46b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
46c0: 20 20 20 20 20 20 20 20 20 20 22 46 49 4c 54 45            "FILTE
46d0: 52 20 63 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c  R clause may onl
46e0: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
46f0: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
4700: 66 75 6e 63 74 69 6f 6e 73 22 0a 20 20 20 20 20  functions".     
4710: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20   );.    }else.  
4720: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
4730: 6d 65 3d 3d 72 6f 77 5f 6e 75 6d 62 65 72 4e 61  me==row_numberNa
4740: 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61  me || pFunc->zNa
4750: 6d 65 3d 3d 6e 74 69 6c 65 4e 61 6d 65 20 29 7b  me==ntileName ){
4760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4770: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4780: 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20  n->pStart);.    
4790: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
47a0: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
47b0: 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nd);.      pWin-
47c0: 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e  >pStart = pWin->
47d0: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  pEnd = 0;.      
47e0: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b  pWin->eType = TK
47f0: 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69  _ROWS;.      pWi
4800: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4810: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4820: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
4830: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  CURRENT;.    }el
4840: 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e  se..    if( pFun
4850: 63 2d 3e 7a 4e 61 6d 65 3d 3d 64 65 6e 73 65 5f  c->zName==dense_
4860: 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  rankName || pFun
4870: 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 61 6e 6b 4e 61  c->zName==rankNa
4880: 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63  me.     || pFunc
4890: 2d 3e 7a 4e 61 6d 65 3d 3d 70 65 72 63 65 6e 74  ->zName==percent
48a0: 5f 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75  _rankName || pFu
48b0: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 63 75 6d 65 5f  nc->zName==cume_
48c0: 64 69 73 74 4e 61 6d 65 0a 20 20 20 20 29 7b 0a  distName.    ){.
48d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
48e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e  rDelete(db, pWin
48f0: 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ->pStart);.     
4900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4910: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45 6e  te(db, pWin->pEn
4920: 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  d);.      pWin->
4930: 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e 70  pStart = pWin->p
4940: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  End = 0;.      p
4950: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b 5f  Win->eType = TK_
4960: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 70 57 69  RANGE;.      pWi
4970: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4980: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4990: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
49a0: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 0a 20  CURRENT;.    }. 
49b0: 20 7d 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63   }.  pWin->pFunc
49c0: 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a   = pFunc;.}../*.
49d0: 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  ** Context objec
49e0: 74 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  t passed through
49f0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
4a00: 4c 69 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c  List() to.** sel
4a10: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
4a20: 45 78 70 72 43 62 28 29 20 62 79 20 73 65 6c 65  ExprCb() by sele
4a30: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
4a40: 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  List()..*/.typed
4a50: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
4a60: 52 65 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65  Rewrite WindowRe
4a70: 77 72 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69  write;.struct Wi
4a80: 6e 64 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20  ndowRewrite {.  
4a90: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
4aa0: 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b 0a  ExprList *pSub;.
4ab0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61  };../*.** Callba
4ac0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 64  ck function used
4ad0: 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77   by selectWindow
4ae0: 52 65 77 72 69 74 65 45 4c 69 73 74 28 29 2e 20  RewriteEList(). 
4af0: 49 66 20 6e 65 63 65 73 73 61 72 79 2c 0a 2a 2a  If necessary,.**
4b00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
4b10: 70 70 65 6e 64 73 20 74 6f 20 74 68 65 20 6f 75  ppends to the ou
4b20: 74 70 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d  tput expression-
4b30: 6c 69 73 74 20 61 6e 64 20 75 70 64 61 74 65 73  list and updates
4b40: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
4b50: 28 2a 70 70 45 78 70 72 29 20 69 6e 20 70 6c 61  (*ppExpr) in pla
4b60: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
4b70: 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  t selectWindowRe
4b80: 77 72 69 74 65 45 78 70 72 43 62 28 57 61 6c 6b  writeExprCb(Walk
4b90: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
4ba0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72  r *pExpr){.  str
4bb0: 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
4bc0: 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  e *p = pWalker->
4bd0: 75 2e 70 52 65 77 72 69 74 65 3b 0a 20 20 50 61  u.pRewrite;.  Pa
4be0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
4bf0: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a  alker->pParse;..
4c00: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
4c10: 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63 61 73 65  >op ){..    case
4c20: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
4c30: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
4c40: 57 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Win==0 ){.      
4c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4c60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 57 69  else{.        Wi
4c70: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20  ndow *pWin;.    
4c80: 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d 3e      for(pWin=p->
4c90: 70 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  pWin; pWin; pWin
4ca0: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
4cb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
4cc0: 70 45 78 70 72 2d 3e 70 57 69 6e 3d 3d 70 57 69  pExpr->pWin==pWi
4cd0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
4ce0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
4cf0: 4f 77 6e 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a  Owner==pExpr );.
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4d10: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
4d20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4d30: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4d40: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
4d50: 68 2e 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  h.  */..    case
4d60: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
4d70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
4d80: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  LUMN: {.      Ex
4d90: 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74  pr *pDup = sqlit
4da0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
4db0: 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
4dc0: 0a 20 20 20 20 20 20 70 2d 3e 70 53 75 62 20 3d  .      p->pSub =
4dd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4de0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
4df0: 2d 3e 70 53 75 62 2c 20 70 44 75 70 29 3b 0a 20  ->pSub, pDup);. 
4e00: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 75 62       if( p->pSub
4e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
4e20: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
4e30: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
4e40: 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20  atic)==0 );.    
4e50: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
4e60: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
4e70: 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 73  atic);.        s
4e80: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4e90: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
4ea0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  pr);.        Exp
4eb0: 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
4ec0: 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
4ed0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
4ee0: 28 70 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f  (pExpr, 0, sizeo
4ef0: 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20  f(Expr));..     
4f00: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
4f10: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
4f20: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4f30: 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70   = p->pSub->nExp
4f40: 72 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78  r-1;.        pEx
4f50: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e  pr->iTable = p->
4f60: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20  pWin->iEphCsr;. 
4f70: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
4f80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
4f90: 64 65 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f  default: /* no-o
4fa0: 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  p */.      break
4fb0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
4fc0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
4fd0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
4fe0: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 53 65  tWindowRewriteSe
4ff0: 6c 65 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70  lectCb(Walker *p
5000: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
5010: 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e 55 53  pSelect){.  UNUS
5020: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61  ED_PARAMETER(pWa
5030: 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f  lker);.  UNUSED_
5040: 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c 65 63  PARAMETER(pSelec
5050: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  t);.  return WRC
5060: 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  _Prune;.}.../*.*
5070: 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
5080: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
5090: 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2d  n in expression-
50a0: 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f 72  list pEList. For
50b0: 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   each:.**.**   *
50c0: 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20   TK_COLUMN,.**  
50d0: 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e   * aggregate fun
50e0: 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a  ction, or.**   *
50f0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
5100: 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20 6f   with a Window o
5110: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e 6f  bject that is no
5120: 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  t a member of th
5130: 65 20 0a 2a 2a 20 20 20 20 20 6c 69 6e 6b 65 64  e .**     linked
5140: 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20   list passed as 
5150: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
5160: 65 6e 74 20 28 70 57 69 6e 29 0a 2a 2a 0a 2a 2a  ent (pWin).**.**
5170: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65   Append the node
5180: 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70 72 65   to output expre
5190: 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70 70 53  ssion-list (*ppS
51a0: 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61 63 65  ub). And replace
51b0: 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20 54 4b   it.** with a TK
51c0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 61  _COLUMN that rea
51d0: 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68 20 65  ds the (N-1)th e
51e0: 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c 65 20  lement of table 
51f0: 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68 43 73  .** pWin->iEphCs
5200: 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  r, where N is th
5210: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
5220: 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75 62 29  ents in (*ppSub)
5230: 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65 6e 64   after.** append
5240: 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e  ing the new one.
5250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5260: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
5270: 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72 73  iteEList(.  Pars
5280: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69  e *pParse, .  Wi
5290: 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 45 78  ndow *pWin,.  Ex
52a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
52c0: 20 52 65 77 72 69 74 65 20 65 78 70 72 65 73 73   Rewrite express
52d0: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ions in this lis
52e0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
52f0: 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20 20 20  **ppSub         
5300: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
5310: 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65 78 70  : Sub-select exp
5320: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a  ression-list */.
5330: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c  ){.  Walker sWal
5340: 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65 77  ker;.  WindowRew
5350: 72 69 74 65 20 73 52 65 77 72 69 74 65 3b 0a 0a  rite sRewrite;..
5360: 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65    memset(&sWalke
5370: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61 6c  r, 0, sizeof(Wal
5380: 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ker));.  memset(
5390: 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73 69  &sRewrite, 0, si
53a0: 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72 69  zeof(WindowRewri
53b0: 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69 74  te));..  sRewrit
53c0: 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62 3b  e.pSub = *ppSub;
53d0: 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69 6e  .  sRewrite.pWin
53e0: 20 3d 20 70 57 69 6e 3b 0a 0a 20 20 73 57 61 6c   = pWin;..  sWal
53f0: 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61  ker.pParse = pPa
5400: 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78  rse;.  sWalker.x
5410: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
5420: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
5430: 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c  teExprCb;.  sWal
5440: 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
5450: 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64  ack = selectWind
5460: 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43  owRewriteSelectC
5470: 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70  b;.  sWalker.u.p
5480: 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77 72  Rewrite = &sRewr
5490: 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73 71  ite;..  (void)sq
54a0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
54b0: 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c 69  t(&sWalker, pELi
54c0: 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20 3d  st);..  *ppSub =
54d0: 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b 0a   sRewrite.pSub;.
54e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
54f0: 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20 65  a copy of each e
5500: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70  xpression in exp
5510: 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41 70  ression-list pAp
5520: 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72 65  pend to.** expre
5530: 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73 74  ssion list pList
5540: 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  . Return a point
5550: 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  er to the result
5560: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
5570: 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72 4c   ExprList *exprL
5580: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a 20  istAppendList(. 
5590: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
55a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
55b0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
55c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
55d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  ,        /* List
55e0: 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70   to which to app
55f0: 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55  end. Might be NU
5600: 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
5610: 20 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20 20   *pAppend       
5620: 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65  /* List of value
5630: 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67  s to append. Mig
5640: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
5650: 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64 20 29  .  if( pAppend )
5660: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
5670: 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c 69   int nInit = pLi
5680: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
5690: 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  r : 0;.    for(i
56a0: 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e 6e  =0; i<pAppend->n
56b0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
56c0: 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73    Expr *pDup = s
56d0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
56e0: 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65 6e  arse->db, pAppen
56f0: 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30  d->a[i].pExpr, 0
5700: 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  );.      pList =
5710: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5720: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
5730: 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  List, pDup);.   
5740: 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70     if( pList ) p
5750: 4c 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d  List->a[nInit+i]
5760: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41 70  .sortOrder = pAp
5770: 70 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  pend->a[i].sortO
5780: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
5790: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
57a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
57b0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
57c0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
57d0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64  econd argument d
57e0: 6f 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a  oes not invoke.*
57f0: 2a 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f 77  * any SQL window
5800: 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73   functions, this
5810: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
5820: 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
5830: 20 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65 73   it .** rewrites
5840: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
5850: 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 69  ement so that wi
5860: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78 53  ndow function xS
5870: 74 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  tep functions.**
5880: 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20   are invoked in 
5890: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
58a0: 72 20 61 73 20 64 65 73 63 72 69 62 65 64 20 75  r as described u
58b0: 6e 64 65 72 20 22 53 45 4c 45 43 54 20 52 45 57  nder "SELECT REW
58c0: 52 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74 68  RITING".** at th
58d0: 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69  e top of this fi
58e0: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
58f0: 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65 28  e3WindowRewrite(
5900: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
5910: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
5920: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5930: 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29  .  if( p->pWin )
5940: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
5950: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
5960: 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  Parse);.    sqli
5970: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5980: 2d 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63 74  ->db;.    Select
5990: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
59a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
59b0: 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 53  ubquery */.    S
59c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
59d0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70 72  ->pSrc;.    Expr
59e0: 20 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57   *pWhere = p->pW
59f0: 68 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c 69  here;.    ExprLi
5a00: 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20 70  st *pGroupBy = p
5a10: 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
5a20: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d 20  Expr *pHaving = 
5a30: 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20 20  p->pHaving;.    
5a40: 45 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74 20  ExprList *pSort 
5a50: 3d 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c 69  = 0;..    ExprLi
5a60: 73 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20 30  st *pSublist = 0
5a70: 3b 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  ;       /* Expre
5a80: 73 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20 73  ssion list for s
5a90: 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  ub-query */.    
5aa0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
5ab0: 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f 2a  p->pWin;      /*
5ac0: 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20 6f   Master window o
5ad0: 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69 6e  bject */.    Win
5ae0: 64 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20 20  dow *pWin;      
5af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
5b00: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65 72  ndow object iter
5b10: 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d 3e  ator */..    p->
5b20: 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pSrc = 0;.    p-
5b30: 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20  >pWhere = 0;.   
5b40: 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30   p->pGroupBy = 0
5b50: 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67  ;.    p->pHaving
5b60: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72   = 0;..    /* Cr
5b70: 65 61 74 65 20 74 68 65 20 4f 52 44 45 52 20 42  eate the ORDER B
5b80: 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65  Y clause for the
5b90: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69   sub-select. Thi
5ba0: 73 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65  s is the concate
5bb0: 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66  nation.    ** of
5bc0: 20 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52 54   the window PART
5bd0: 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20  ITION and ORDER 
5be0: 42 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65 6e  BY clauses. Then
5bf0: 2c 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73 20  , if this makes 
5c00: 69 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e 64  it.    ** redund
5c10: 61 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65 20  ant, remove the 
5c20: 4f 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74 68  ORDER BY from th
5c30: 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 2e  e parent SELECT.
5c40: 20 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20 3d    */.    pSort =
5c50: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5c60: 44 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70  Dup(db, pMWin->p
5c70: 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20  Partition, 0);. 
5c80: 20 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72 4c     pSort = exprL
5c90: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
5ca0: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d 57  arse, pSort, pMW
5cb0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  in->pOrderBy);. 
5cc0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20     if( pSort && 
5cd0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
5ce0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5cf0: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
5d00: 70 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65 72  pSort, p->pOrder
5d10: 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  By, -1)==0 ){.  
5d20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5d30: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
5d40: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
5d50: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
5d60: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
5d70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73 73     }..    /* Ass
5d80: 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75 6d  ign a cursor num
5d90: 62 65 72 20 66 6f 72 20 74 68 65 20 65 70 68 65  ber for the ephe
5da0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64  meral table used
5db0: 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73 2e   to buffer rows.
5dc0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65 6e  .    ** The Open
5dd0: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
5de0: 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20 6c  ction is coded l
5df0: 61 74 65 72 2c 20 61 66 74 65 72 20 69 74 20 69  ater, after it i
5e00: 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20 20  s known how.    
5e10: 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  ** many columns 
5e20: 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20 68  the table will h
5e30: 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d 57  ave.  */.    pMW
5e40: 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70 50  in->iEphCsr = pP
5e50: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a 20  arse->nTab++;.. 
5e60: 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52     selectWindowR
5e70: 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72  ewriteEList(pPar
5e80: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 45  se, pMWin, p->pE
5e90: 4c 69 73 74 2c 20 26 70 53 75 62 6c 69 73 74 29  List, &pSublist)
5ea0: 3b 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64  ;.    selectWind
5eb0: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 70  owRewriteEList(p
5ec0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 2d  Parse, pMWin, p-
5ed0: 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53 75 62  >pOrderBy, &pSub
5ee0: 6c 69 73 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e  list);.    pMWin
5ef0: 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 3d 20 28  ->nBufferCol = (
5f00: 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c  pSublist ? pSubl
5f10: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
5f20: 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
5f30: 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20 42 59  the PARTITION BY
5f40: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78   and ORDER BY ex
5f50: 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 74 68 65  pressions to the
5f60: 20 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   to the .    ** 
5f70: 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65  sub-select expre
5f80: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79  ssion list. They
5f90: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
5fa0: 20 66 69 67 75 72 65 20 6f 75 74 20 77 68 65 72   figure out wher
5fb0: 65 20 0a 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61  e .    ** bounda
5fc0: 72 69 65 73 20 66 6f 72 20 70 61 72 74 69 74 69  ries for partiti
5fd0: 6f 6e 73 20 61 6e 64 20 73 65 74 73 20 6f 66 20  ons and sets of 
5fe0: 70 65 65 72 20 72 6f 77 73 20 6c 69 65 2e 20 20  peer rows lie.  
5ff0: 2a 2f 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20  */.    pSublist 
6000: 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64  = exprListAppend
6010: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75  List(pParse, pSu
6020: 62 6c 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50  blist, pMWin->pP
6030: 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 70  artition);.    p
6040: 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69  Sublist = exprLi
6050: 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61  stAppendList(pPa
6060: 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70  rse, pSublist, p
6070: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b  MWin->pOrderBy);
6080: 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
6090: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 70 61  the arguments pa
60a0: 73 73 65 64 20 74 6f 20 65 61 63 68 20 77 69 6e  ssed to each win
60b0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  dow function to 
60c0: 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73  the.    ** sub-s
60d0: 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e  elect expression
60e0: 20 6c 69 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f   list. Also allo
60f0: 63 61 74 65 20 74 77 6f 20 72 65 67 69 73 74 65  cate two registe
6100: 72 73 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  rs for each.    
6110: 2a 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ** window functi
6120: 6f 6e 20 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65  on - one for the
6130: 20 61 63 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e   accumulator, an
6140: 6f 74 68 65 72 20 66 6f 72 20 69 6e 74 65 72 69  other for interi
6150: 6d 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73  m.    ** results
6160: 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57  .  */.    for(pW
6170: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
6180: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
6190: 57 69 6e 29 7b 0a 20 20 20 20 20 20 70 57 69 6e  Win){.      pWin
61a0: 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28 70 53 75  ->iArgCol = (pSu
61b0: 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74  blist ? pSublist
61c0: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
61d0: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65      pSublist = e
61e0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73  xprListAppendLis
61f0: 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69  t(pParse, pSubli
6200: 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  st, pWin->pOwner
6210: 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
6220: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c    if( pWin->pFil
6230: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ter ){.        E
6240: 78 70 72 20 2a 70 46 69 6c 74 65 72 20 3d 20 73  xpr *pFilter = s
6250: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
6260: 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c  , pWin->pFilter,
6270: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75   0);.        pSu
6280: 62 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  blist = sqlite3E
6290: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
62a0: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
62b0: 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20  pFilter);.      
62c0: 7d 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  }.      pWin->re
62d0: 67 41 63 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73  gAccum = ++pPars
62e0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
62f0: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d  Win->regResult =
6300: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
6310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6320: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6330: 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65  ull, 0, pWin->re
6340: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a  gAccum);.    }..
6350: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
6360: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f  is no ORDER BY o
6370: 72 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 63  r PARTITION BY c
6380: 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20 77  lause, and the w
6390: 69 6e 64 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e  indow.    ** fun
63a0: 63 74 69 6f 6e 20 61 63 63 65 70 74 73 20 7a 65  ction accepts ze
63b0: 72 6f 20 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e  ro arguments, an
63c0: 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  d there are no o
63d0: 74 68 65 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20  ther columns.   
63e0: 20 2a 2a 20 73 65 6c 65 63 74 65 64 20 28 65 2e   ** selected (e.
63f0: 67 2e 20 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e  g. "SELECT row_n
6400: 75 6d 62 65 72 28 29 20 4f 56 45 52 20 28 29 20  umber() OVER () 
6410: 46 52 4f 4d 20 74 31 22 29 2c 20 69 74 20 69 73  FROM t1"), it is
6420: 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
6430: 20 74 68 61 74 20 70 53 75 62 6c 69 73 74 20 69   that pSublist i
6440: 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72  s still NULL her
6450: 65 2e 20 41 64 64 20 61 20 63 6f 6e 73 74 61 6e  e. Add a constan
6460: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 68 65 72  t expression her
6470: 65 20 74 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65  e to .    ** kee
6480: 70 20 65 76 65 72 79 74 68 69 6e 67 20 6c 65 67  p everything leg
6490: 61 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  al in this case.
64a0: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
64b0: 20 70 53 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a   pSublist==0 ){.
64c0: 20 20 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d        pSublist =
64d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
64e0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
64f0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
6500: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62  ite3ExprAlloc(db
6510: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73  , TK_INTEGER, &s
6520: 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
6530: 30 5d 2c 20 30 29 0a 20 20 20 20 20 20 29 3b 0a  0], 0).      );.
6540: 20 20 20 20 7d 0a 0a 20 20 20 20 70 53 75 62 20      }..    pSub 
6550: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
6560: 65 77 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  ew(.        pPar
6570: 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53  se, pSublist, pS
6580: 72 63 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f  rc, pWhere, pGro
6590: 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 70  upBy, pHaving, p
65a0: 53 6f 72 74 2c 20 30 2c 20 30 0a 20 20 20 20 29  Sort, 0, 0.    )
65b0: 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
65c0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
65d0: 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
65e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
65f0: 2d 3e 70 53 72 63 20 7c 7c 20 64 62 2d 3e 6d 61  ->pSrc || db->ma
6600: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6610: 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b    if( p->pSrc ){
6620: 0a 20 20 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e  .      p->pSrc->
6630: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70  a[0].pSelect = p
6640: 53 75 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Sub;.      sqlit
6650: 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
6660: 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
6670: 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 69  ->pSrc);.      i
6680: 66 28 20 73 71 6c 69 74 65 33 45 78 70 61 6e 64  f( sqlite3Expand
6690: 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
66a0: 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 29   &p->pSrc->a[0])
66b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
66c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
66d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
66e0: 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
66f0: 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
6700: 64 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  d;.        p->se
6710: 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67  lFlags &= ~SF_Ag
6720: 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 20  gregate;.       
6730: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
6740: 65 70 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ep(pParse, pSub,
6750: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
6760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6770: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6780: 45 70 68 65 6d 65 72 61 6c 2c 20 70 4d 57 69 6e  Ephemeral, pMWin
6790: 2d 3e 69 45 70 68 43 73 72 2c 20 70 53 75 62 6c  ->iEphCsr, pSubl
67a0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
67b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
67c0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
67d0: 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 20  e(db, pSub);.   
67e0: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
67f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 63  allocFailed ) rc
6800: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6810: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
6820: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
6830: 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65   the Window obje
6840: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
6850: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6860: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6870: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 73 71  3WindowDelete(sq
6880: 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f  lite3 *db, Windo
6890: 77 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  w *p){.  if( p )
68a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
68b0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
68c0: 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  Filter);.    sql
68d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
68e0: 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  te(db, p->pParti
68f0: 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  tion);.    sqlit
6900: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
6910: 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
6920: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6930: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
6940: 70 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  pEnd);.    sqlit
6950: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
6960: 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20   p->pStart);.   
6970: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6980: 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  b, p->zName);.  
6990: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
69a0: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
69b0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 6c 69  *.** Free the li
69c0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69 6e  nked list of Win
69d0: 64 6f 77 20 6f 62 6a 65 63 74 73 20 73 74 61 72  dow objects star
69e0: 74 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f  ting at the seco
69f0: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
6a00: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
6a10: 6f 77 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  owListDelete(sql
6a20: 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77  ite3 *db, Window
6a30: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70   *p){.  while( p
6a40: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
6a50: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
6a60: 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Win;.    sqlite3
6a70: 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 64 62 2c  WindowDelete(db,
6a80: 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e 65   p);.    p = pNe
6a90: 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  xt;.  }.}../*.**
6aa0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 65 78   The argument ex
6ab0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 50  pression is an P
6ac0: 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c  RECEDING or FOLL
6ad0: 4f 57 49 4e 47 20 6f 66 66 73 65 74 2e 20 20 54  OWING offset.  T
6ae0: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 68 6f 75  he.** value shou
6af0: 6c 64 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61  ld be a non-nega
6b00: 74 69 76 65 20 69 6e 74 65 67 65 72 2e 20 20 49  tive integer.  I
6b10: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 6e  f the value is n
6b20: 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  ot a.** constant
6b30: 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f 20 4e  , change it to N
6b40: 55 4c 4c 2e 20 20 54 68 65 20 66 61 63 74 20 74  ULL.  The fact t
6b50: 68 61 74 20 69 74 20 69 73 20 74 68 65 6e 20 61  hat it is then a
6b60: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 0a 2a 2a   non-negative.**
6b70: 20 69 6e 74 65 67 65 72 20 77 69 6c 6c 20 62 65   integer will be
6b80: 20 63 61 75 67 68 74 20 6c 61 74 65 72 2e 20 20   caught later.  
6b90: 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74  But it is import
6ba0: 61 6e 74 20 6e 6f 74 20 74 6f 20 6c 65 61 76 65  ant not to leave
6bb0: 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 76 61 6c  .** variable val
6bc0: 75 65 73 20 69 6e 20 74 68 65 20 65 78 70 72 65  ues in the expre
6bd0: 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73  ssion tree..*/.s
6be0: 74 61 74 69 63 20 45 78 70 72 20 2a 73 71 6c 69  tatic Expr *sqli
6bf0: 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45  te3WindowOffsetE
6c00: 78 70 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  xpr(Parse *pPars
6c10: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
6c20: 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
6c30: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6c40: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 73 71  pExpr) ){.    sq
6c50: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6c60: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70  pParse->db, pExp
6c70: 72 29 3b 0a 20 20 20 20 70 45 78 70 72 20 3d 20  r);.    pExpr = 
6c80: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
6c90: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
6ca0: 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  NULL, 0, 0);.  }
6cb0: 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
6cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
6cd0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
6ce0: 6e 65 77 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63  new Window objec
6cf0: 74 20 64 65 73 63 72 69 62 69 6e 67 20 61 20 57  t describing a W
6d00: 69 6e 64 6f 77 20 44 65 66 69 6e 69 74 69 6f 6e  indow Definition
6d10: 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c  ..*/.Window *sql
6d20: 69 74 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63 28  ite3WindowAlloc(
6d30: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6d40: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
6d50: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
6d60: 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 2f   eType,        /
6d70: 2a 20 46 72 61 6d 65 20 74 79 70 65 2e 20 54 4b  * Frame type. TK
6d80: 5f 52 41 4e 47 45 20 6f 72 20 54 4b 5f 52 4f 57  _RANGE or TK_ROW
6d90: 53 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 72  S */.  int eStar
6da0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  t,       /* Star
6db0: 74 20 74 79 70 65 3a 20 43 55 52 52 45 4e 54 2c  t type: CURRENT,
6dc0: 20 50 52 45 43 45 44 49 4e 47 2c 20 46 4f 4c 4c   PRECEDING, FOLL
6dd0: 4f 57 49 4e 47 2c 20 55 4e 42 4f 55 4e 44 45 44  OWING, UNBOUNDED
6de0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74 61   */.  Expr *pSta
6df0: 72 74 2c 20 20 20 20 20 2f 2a 20 53 74 61 72 74  rt,     /* Start
6e00: 20 77 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20   window size if 
6e10: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 6f 72 20  TK_PRECEDING or 
6e20: 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69  FOLLOWING */.  i
6e30: 6e 74 20 65 45 6e 64 2c 20 20 20 20 20 20 20 20  nt eEnd,        
6e40: 20 2f 2a 20 45 6e 64 20 74 79 70 65 3a 20 43 55   /* End type: CU
6e50: 52 52 45 4e 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47  RRENT, FOLLOWING
6e60: 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20  , TK_UNBOUNDED, 
6e70: 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 45  PRECEDING */.  E
6e80: 78 70 72 20 2a 70 45 6e 64 20 20 20 20 20 20 20  xpr *pEnd       
6e90: 20 2f 2a 20 45 6e 64 20 77 69 6e 64 6f 77 20 73   /* End window s
6ea0: 69 7a 65 20 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57  ize if TK_FOLLOW
6eb0: 49 4e 47 20 6f 72 20 50 52 45 43 45 44 49 4e 47  ING or PRECEDING
6ec0: 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20   */.){.  Window 
6ed0: 2a 70 57 69 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a  *pWin = 0;..  /*
6ee0: 20 50 61 72 73 65 72 20 61 73 73 75 72 65 73 20   Parser assures 
6ef0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
6f00: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
6f10: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 7c 7c 20 65  e==TK_RANGE || e
6f20: 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53 20 29 3b  Type==TK_ROWS );
6f30: 0a 20 20 61 73 73 65 72 74 28 20 65 53 74 61 72  .  assert( eStar
6f40: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c  t==TK_CURRENT ||
6f50: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43   eStart==TK_PREC
6f60: 45 44 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20  EDING.          
6f70: 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 55   || eStart==TK_U
6f80: 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65 53 74 61  NBOUNDED || eSta
6f90: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
6fa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 45   );.  assert( eE
6fb0: 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c  nd==TK_CURRENT |
6fc0: 7c 20 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  | eEnd==TK_FOLLO
6fd0: 57 49 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20  WING.           
6fe0: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  || eEnd==TK_UNBO
6ff0: 55 4e 44 45 44 20 7c 7c 20 65 45 6e 64 3d 3d 54  UNDED || eEnd==T
7000: 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 3b 0a 20  K_PRECEDING );. 
7010: 20 61 73 73 65 72 74 28 20 28 65 53 74 61 72 74   assert( (eStart
7020: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c  ==TK_PRECEDING |
7030: 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  | eStart==TK_FOL
7040: 4c 4f 57 49 4e 47 29 3d 3d 28 70 53 74 61 72 74  LOWING)==(pStart
7050: 21 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  !=0) );.  assert
7060: 28 20 28 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  ( (eEnd==TK_FOLL
7070: 4f 57 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54  OWING || eEnd==T
7080: 4b 5f 50 52 45 43 45 44 49 4e 47 29 3d 3d 28 70  K_PRECEDING)==(p
7090: 45 6e 64 21 3d 30 29 20 29 3b 0a 0a 0a 20 20 2f  End!=0) );...  /
70a0: 2a 20 49 66 20 61 20 66 72 61 6d 65 20 69 73 20  * If a frame is 
70b0: 64 65 63 6c 61 72 65 64 20 22 52 41 4e 47 45 22  declared "RANGE"
70c0: 20 28 6e 6f 74 20 22 52 4f 57 53 22 29 2c 20 74   (not "ROWS"), t
70d0: 68 65 6e 20 69 74 20 6d 61 79 20 6e 6f 74 20 75  hen it may not u
70e0: 73 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 22  se.  ** either "
70f0: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
7100: 22 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c  " or "<expr> FOL
7110: 4c 4f 57 49 4e 47 22 2e 0a 20 20 2a 2f 0a 20 20  LOWING"..  */.  
7120: 69 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41  if( eType==TK_RA
7130: 4e 47 45 20 26 26 20 28 70 53 74 61 72 74 21 3d  NGE && (pStart!=
7140: 30 20 7c 7c 20 70 45 6e 64 21 3d 30 29 20 29 7b  0 || pEnd!=0) ){
7150: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7160: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 52 41  rMsg(pParse, "RA
7170: 4e 47 45 20 6d 75 73 74 20 75 73 65 20 6f 6e 6c  NGE must use onl
7180: 79 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20 43  y UNBOUNDED or C
7190: 55 52 52 45 4e 54 20 52 4f 57 22 29 3b 0a 20 20  URRENT ROW");.  
71a0: 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c    goto windowAll
71b0: 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ocErr;.  }..  /*
71c0: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
71d0: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  he.  ** starting
71e0: 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d   boundary type m
71f0: 61 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72  ay not occur ear
7200: 6c 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c  lier in the foll
7210: 6f 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a  owing list than.
7220: 20 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20    ** the ending 
7230: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20  boundary type:. 
7240: 20 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55   **.  **   UNBOU
7250: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20  NDED PRECEDING. 
7260: 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45   **   <expr> PRE
7270: 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55  CEDING.  **   CU
7280: 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20  RRENT ROW.  **  
7290: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
72a0: 47 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44  G.  **   UNBOUND
72b0: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  ED FOLLOWING.  *
72c0: 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65  *.  ** The parse
72d0: 72 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22  r ensures that "
72e0: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
72f0: 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75  ING" cannot be u
7300: 73 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67  sed as an ending
7310: 0a 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20  .  ** boundary, 
7320: 61 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e  and than "UNBOUN
7330: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63  DED FOLLOWING" c
7340: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73  annot be used as
7350: 20 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a   a starting.  **
7360: 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e   frame boundary.
7370: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74  .  */.  if( (eSt
7380: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
7390: 26 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  && eEnd==TK_PREC
73a0: 45 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53  EDING).   || (eS
73b0: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
73c0: 4e 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f  NG && (eEnd==TK_
73d0: 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e  PRECEDING || eEn
73e0: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a  d==TK_CURRENT)).
73f0: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
7400: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7410: 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72   "unsupported fr
7420: 61 6d 65 20 64 65 6c 69 6d 69 74 65 72 20 66 6f  ame delimiter fo
7430: 72 20 52 4f 57 53 22 29 3b 0a 20 20 20 20 67 6f  r ROWS");.    go
7440: 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72  to windowAllocEr
7450: 72 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e 20 3d  r;.  }..  pWin =
7460: 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65   (Window*)sqlite
7470: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
7480: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
7490: 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28  (Window));.  if(
74a0: 20 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20   pWin==0 ) goto 
74b0: 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a  windowAllocErr;.
74c0: 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20    pWin->eType = 
74d0: 65 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65  eType;.  pWin->e
74e0: 53 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b 0a  Start = eStart;.
74f0: 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65    pWin->eEnd = e
7500: 45 6e 64 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e  End;.  pWin->pEn
7510: 64 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  d = sqlite3Windo
7520: 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61 72  wOffsetExpr(pPar
7530: 73 65 2c 20 70 45 6e 64 29 3b 0a 20 20 70 57 69  se, pEnd);.  pWi
7540: 6e 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69  n->pStart = sqli
7550: 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45  te3WindowOffsetE
7560: 78 70 72 28 70 50 61 72 73 65 2c 20 70 53 74 61  xpr(pParse, pSta
7570: 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57  rt);.  return pW
7580: 69 6e 3b 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63  in;..windowAlloc
7590: 45 72 72 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  Err:.  sqlite3Ex
75a0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
75b0: 3e 64 62 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71  >db, pEnd);.  sq
75c0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
75d0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 74 61  pParse->db, pSta
75e0: 72 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  rt);.  return 0;
75f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68  .}../*.** Attach
7600: 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70   window object p
7610: 57 69 6e 20 74 6f 20 65 78 70 72 65 73 73 69 6f  Win to expressio
7620: 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  n p..*/.void sql
7630: 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61 63 68  ite3WindowAttach
7640: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7650: 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f 77 20  Expr *p, Window 
7660: 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20 70 20  *pWin){.  if( p 
7670: 29 7b 0a 20 20 20 20 69 66 28 20 70 57 69 6e 20  ){.    if( pWin 
7680: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 57 69 6e  ){.      p->pWin
7690: 20 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20 70   = pWin;.      p
76a0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 3b  Win->pOwner = p;
76b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
76c0: 61 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63  ags & EP_Distinc
76d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
76e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
76f0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
7700: 22 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f 74  "DISTINCT is not
7710: 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 77   supported for w
7720: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22  indow functions"
7730: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7740: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
7750: 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74  lite3WindowDelet
7760: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57  e(pParse->db, pW
7770: 69 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  in);.  }.}../*.*
7780: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68  * Return 0 if th
7790: 65 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a  e two window obj
77a0: 65 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63  ects are identic
77b0: 61 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  al, or non-zero 
77c0: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64  otherwise..** Id
77d0: 65 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f  entical window o
77e0: 62 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70 72  bjects can be pr
77f0: 6f 63 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e  ocessed in a sin
7800: 67 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74  gle scan..*/.int
7810: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
7820: 6d 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61  mpare(Parse *pPa
7830: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c  rse, Window *p1,
7840: 20 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20 20   Window *p2){.  
7850: 69 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d 70  if( p1->eType!=p
7860: 32 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75 72  2->eType ) retur
7870: 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65  n 1;.  if( p1->e
7880: 53 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61 72  Start!=p2->eStar
7890: 74 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  t ) return 1;.  
78a0: 69 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70 32  if( p1->eEnd!=p2
78b0: 2d 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e 20  ->eEnd ) return 
78c0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
78d0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72  ExprCompare(pPar
78e0: 73 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c 20  se, p1->pStart, 
78f0: 70 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29 20  p2->pStart, -1) 
7900: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
7910: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
7920: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d  pare(pParse, p1-
7930: 3e 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64 2c  >pEnd, p2->pEnd,
7940: 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b   -1) ) return 1;
7950: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
7960: 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31  prListCompare(p1
7970: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70 32  ->pPartition, p2
7980: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d 31  ->pPartition, -1
7990: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
79a0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
79b0: 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70  istCompare(p1->p
79c0: 4f 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f 72  OrderBy, p2->pOr
79d0: 64 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65 74  derBy, -1) ) ret
79e0: 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
79f0: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0;.}.../*.** Thi
7a00: 73 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 63  s is called by c
7a10: 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 20  ode in select.c 
7a20: 62 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73 20  before it calls 
7a30: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
7a40: 6e 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e 20  n().** to begin 
7a50: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
7a60: 68 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  h the sub-query 
7a70: 72 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20 75  results. It is u
7a80: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  sed to allocate.
7a90: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
7aa0: 65 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20  e registers and 
7ab0: 63 75 72 73 6f 72 73 20 75 73 65 64 20 62 79 20  cursors used by 
7ac0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
7ad0: 65 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64  eStep()..*/.void
7ae0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
7af0: 64 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70 50  deInit(Parse *pP
7b00: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d  arse, Window *pM
7b10: 57 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  Win){.  Window *
7b20: 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  pWin;.  Vdbe *v 
7b30: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
7b40: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
7b50: 6e 50 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d 3e  nPart = (pMWin->
7b60: 70 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d 57  pPartition ? pMW
7b70: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e  in->pPartition->
7b80: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e 50  nExpr : 0);.  nP
7b90: 61 72 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e 70  art += (pMWin->p
7ba0: 4f 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d  OrderBy ? pMWin-
7bb0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
7bc0: 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 50 61   : 0);.  if( nPa
7bd0: 72 74 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d  rt ){.    pMWin-
7be0: 3e 72 65 67 50 61 72 74 20 3d 20 70 50 61 72 73  >regPart = pPars
7bf0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
7c00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
7c10: 50 61 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  Part;.    sqlite
7c20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7c30: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e  P_Null, 0, pMWin
7c40: 2d 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69 6e  ->regPart, pMWin
7c50: 2d 3e 72 65 67 50 61 72 74 2b 6e 50 61 72 74 2d  ->regPart+nPart-
7c60: 31 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70  1);.  }..  for(p
7c70: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
7c80: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
7c90: 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44  tWin){.    FuncD
7ca0: 65 66 20 2a 70 20 3d 20 70 57 69 6e 2d 3e 70 46  ef *p = pWin->pF
7cb0: 75 6e 63 3b 0a 20 20 20 20 69 66 28 20 28 70 2d  unc;.    if( (p-
7cc0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
7cd0: 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29  ITE_FUNC_MINMAX)
7ce0: 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72 74   && pWin->eStart
7cf0: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  !=TK_UNBOUNDED )
7d00: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  {.      /* The i
7d10: 6e 6c 69 6e 65 20 76 65 72 73 69 6f 6e 73 20 6f  nline versions o
7d20: 66 20 6d 69 6e 28 29 20 61 6e 64 20 6d 61 78 28  f min() and max(
7d30: 29 20 72 65 71 75 69 72 65 20 61 20 73 69 6e 67  ) require a sing
7d40: 6c 65 20 65 70 68 65 6d 65 72 61 6c 0a 20 20 20  le ephemeral.   
7d50: 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20     ** table and 
7d60: 33 20 72 65 67 69 73 74 65 72 73 2e 20 54 68 65  3 registers. The
7d70: 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20 75   registers are u
7d80: 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  sed as follows:.
7d90: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
7da0: 2a 20 20 20 72 65 67 41 70 70 2b 30 3a 20 73 6c  *   regApp+0: sl
7db0: 6f 74 20 74 6f 20 63 6f 70 79 20 6d 69 6e 28 29  ot to copy min()
7dc0: 2f 6d 61 78 28 29 20 61 72 67 75 6d 65 6e 74 20  /max() argument 
7dd0: 74 6f 20 66 6f 72 20 4d 61 6b 65 52 65 63 6f 72  to for MakeRecor
7de0: 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  d.      **   reg
7df0: 41 70 70 2b 31 3a 20 69 6e 74 65 67 65 72 20 76  App+1: integer v
7e00: 61 6c 75 65 20 75 73 65 64 20 74 6f 20 65 6e 73  alue used to ens
7e10: 75 72 65 20 6b 65 79 73 20 61 72 65 20 75 6e 69  ure keys are uni
7e20: 71 75 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 72  que.      **   r
7e30: 65 67 41 70 70 2b 32 3a 20 6f 75 74 70 75 74 20  egApp+2: output 
7e40: 6f 66 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20  of MakeRecord.  
7e50: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70      */.      Exp
7e60: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
7e70: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
7e80: 4c 69 73 74 3b 0a 20 20 20 20 20 20 4b 65 79 49  List;.      KeyI
7e90: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
7ea0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
7eb0: 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
7ec0: 65 2c 20 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b  e, pList, 0, 0);
7ed0: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72  .      pWin->csr
7ee0: 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  App = pParse->nT
7ef0: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 57 69 6e  ab++;.      pWin
7f00: 2d 3e 72 65 67 41 70 70 20 3d 20 70 50 61 72 73  ->regApp = pPars
7f10: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
7f20: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
7f30: 20 33 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4b   3;.      if( pK
7f40: 65 79 49 6e 66 6f 20 26 26 20 70 57 69 6e 2d 3e  eyInfo && pWin->
7f50: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d  pFunc->zName[1]=
7f60: 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='i' ){.        
7f70: 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
7f80: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 3d  ->aSortOrder[0]=
7f90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  =0 );.        pK
7fa0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
7fb0: 65 72 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 20  er[0] = 1;.     
7fc0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
7fd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7fe0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
7ff0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 32 29  pWin->csrApp, 2)
8000: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8010: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
8020: 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
8030: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  NFO);.      sqli
8040: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8050: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8060: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b  pWin->regApp+1);
8070: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
8080: 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74  if( p->zName==nt
8090: 68 5f 76 61 6c 75 65 4e 61 6d 65 20 7c 7c 20 70  h_valueName || p
80a0: 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76  ->zName==first_v
80b0: 61 6c 75 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20  alueName ){.    
80c0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 77    /* Allocate tw
80d0: 6f 20 72 65 67 69 73 74 65 72 73 20 61 74 20 70  o registers at p
80e0: 57 69 6e 2d 3e 72 65 67 41 70 70 2e 20 54 68 65  Win->regApp. The
80f0: 73 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  se will be used 
8100: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  to.      ** stor
8110: 65 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20  e the start and 
8120: 65 6e 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  end index of the
8130: 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 20   current frame. 
8140: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
8150: 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  ( pMWin->iEphCsr
8160: 20 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e   );.      pWin->
8170: 72 65 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d  regApp = pParse-
8180: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70  >nMem+1;.      p
8190: 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50  Win->csrApp = pP
81a0: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
81b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
81c0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c   += 2;.      sql
81d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
81e0: 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57  , OP_OpenDup, pW
81f0: 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69  in->csrApp, pMWi
8200: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20  n->iEphCsr);.   
8210: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
8220: 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61  p->zName==leadNa
8230: 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d  me || p->zName==
8240: 6c 61 67 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  lagName ){.     
8250: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
8260: 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20  iEphCsr );.     
8270: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20   pWin->csrApp = 
8280: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
8290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
82a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
82b0: 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72  enDup, pWin->csr
82c0: 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  App, pMWin->iEph
82d0: 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Csr);.    }.  }.
82e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 22 50 52 45 43  }../*.** A "PREC
82f0: 45 44 49 4e 47 20 3c 65 78 70 72 3e 22 20 28 65  EDING <expr>" (e
8300: 43 6f 6e 64 3d 3d 30 29 20 6f 72 20 22 46 4f 4c  Cond==0) or "FOL
8310: 4c 4f 57 49 4e 47 20 3c 65 78 70 72 3e 22 20 28  LOWING <expr>" (
8320: 65 43 6f 6e 64 3d 3d 31 29 20 6f 72 20 74 68 65  eCond==1) or the
8330: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
8340: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
8350: 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 28 29 20   to nth_value() 
8360: 28 65 43 6f 6e 64 3d 3d 32 29 20 68 61 73 20 6a  (eCond==2) has j
8370: 75 73 74 20 62 65 65 6e 0a 2a 2a 20 65 76 61 6c  ust been.** eval
8380: 75 61 74 65 64 20 61 6e 64 20 74 68 65 20 72 65  uated and the re
8390: 73 75 6c 74 20 6c 65 66 74 20 69 6e 20 72 65 67  sult left in reg
83a0: 69 73 74 65 72 20 72 65 67 2e 20 54 68 69 73 20  ister reg. This 
83b0: 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74  function generat
83c0: 65 73 20 56 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f  es VM.** code to
83d0: 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
83e0: 76 61 6c 75 65 20 69 73 20 61 20 6e 6f 6e 2d 6e  value is a non-n
83f0: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 20  egative integer 
8400: 61 6e 64 20 74 68 72 6f 77 73 20 61 6e 0a 2a 2a  and throws an.**
8410: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 69 74   exception if it
8420: 20 69 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   is not..*/.stat
8430: 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 68  ic void windowCh
8440: 65 63 6b 49 6e 74 56 61 6c 75 65 28 50 61 72 73  eckIntValue(Pars
8450: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 72  e *pParse, int r
8460: 65 67 2c 20 69 6e 74 20 65 43 6f 6e 64 29 7b 0a  eg, int eCond){.
8470: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
8480: 68 61 72 20 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b  har *azErr[] = {
8490: 0a 20 20 20 20 22 66 72 61 6d 65 20 73 74 61 72  .    "frame star
84a0: 74 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74  ting offset must
84b0: 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69   be a non-negati
84c0: 76 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20  ve integer",.   
84d0: 20 22 66 72 61 6d 65 20 65 6e 64 69 6e 67 20 6f   "frame ending o
84e0: 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20  ffset must be a 
84f0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
8500: 65 67 65 72 22 2c 0a 20 20 20 20 22 73 65 63 6f  eger",.    "seco
8510: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e  nd argument to n
8520: 74 68 5f 76 61 6c 75 65 20 6d 75 73 74 20 62 65  th_value must be
8530: 20 61 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65   a positive inte
8540: 67 65 72 22 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ger".  };.  stat
8550: 69 63 20 69 6e 74 20 61 4f 70 5b 5d 20 3d 20 7b  ic int aOp[] = {
8560: 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 65 2c 20 4f   OP_Ge, OP_Ge, O
8570: 50 5f 47 74 20 7d 3b 0a 20 20 56 64 62 65 20 2a  P_Gt };.  Vdbe *
8580: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
8590: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
85a0: 74 20 72 65 67 5a 65 72 6f 20 3d 20 73 71 6c 69  t regZero = sqli
85b0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
85c0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
85d0: 20 65 43 6f 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f   eCond==0 || eCo
85e0: 6e 64 3d 3d 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d  nd==1 || eCond==
85f0: 32 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  2 );.  sqlite3Vd
8600: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
8610: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 5a 65  nteger, 0, regZe
8620: 72 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ro);.  sqlite3Vd
8630: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d  beAddOp2(v, OP_M
8640: 75 73 74 42 65 49 6e 74 2c 20 72 65 67 2c 20 73  ustBeInt, reg, s
8650: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
8660: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56  tAddr(v)+2);.  V
8670: 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
8680: 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64   eCond==0);.  Vd
8690: 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
86a0: 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20 20 56 64 62  eCond==1);.  Vdb
86b0: 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65  eCoverageIf(v, e
86c0: 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c 69  Cond==2);.  sqli
86d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
86e0: 20 61 4f 70 5b 65 43 6f 6e 64 5d 2c 20 72 65 67   aOp[eCond], reg
86f0: 5a 65 72 6f 2c 20 73 71 6c 69 74 65 33 56 64 62  Zero, sqlite3Vdb
8700: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
8710: 32 2c 20 72 65 67 29 3b 0a 20 20 56 64 62 65 43  2, reg);.  VdbeC
8720: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
8730: 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f  nd==0);.  VdbeCo
8740: 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e  verageIf(v, eCon
8750: 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==1);.  VdbeCov
8760: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
8770: 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ==2);.  sqlite3V
8780: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8790: 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 45 52 52  Halt, SQLITE_ERR
87a0: 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a 20  OR, OE_Abort);. 
87b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
87c0: 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 61  ndP4(v, (void*)a
87d0: 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c 20 50 34 5f  zErr[eCond], P4_
87e0: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
87f0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
8800: 28 70 50 61 72 73 65 2c 20 72 65 67 5a 65 72 6f  (pParse, regZero
8810: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
8820: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
8830: 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
8840: 64 20 74 6f 20 74 68 65 20 77 69 6e 64 6f 77 2d  d to the window-
8850: 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  function associa
8860: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
8870: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
8880: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
8890: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
88a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
88b0: 6e 74 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e  nt windowArgCoun
88c0: 74 28 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b  t(Window *pWin){
88d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
88e0: 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  st = pWin->pOwne
88f0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 72 65  r->x.pList;.  re
8900: 74 75 72 6e 20 28 70 4c 69 73 74 20 3f 20 70 4c  turn (pList ? pL
8910: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
8920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
8930: 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e  te VM code to in
8940: 76 6f 6b 65 20 65 69 74 68 65 72 20 78 53 74 65  voke either xSte
8950: 70 28 29 20 28 69 66 20 62 49 6e 76 65 72 73 65  p() (if bInverse
8960: 20 69 73 20 30 29 20 6f 72 20 0a 2a 2a 20 78 49   is 0) or .** xI
8970: 6e 76 65 72 73 65 20 28 69 66 20 62 49 6e 76 65  nverse (if bInve
8980: 72 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 29  rse is non-zero)
8990: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
89a0: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
89b0: 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
89c0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 4d 57   starting at pMW
89d0: 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c  in. Or, for buil
89e0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
89f0: 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 64 6f  tions.** that do
8a00: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61   not use the sta
8a10: 6e 64 61 72 64 20 66 75 6e 63 74 69 6f 6e 20 41  ndard function A
8a20: 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  PI, generate the
8a30: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 69 6e 6c   required.** inl
8a40: 69 6e 65 20 56 4d 20 63 6f 64 65 2e 0a 2a 2a 0a  ine VM code..**.
8a50: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 63  ** If argument c
8a60: 73 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  sr is greater th
8a70: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 30  an or equal to 0
8a80: 2c 20 74 68 65 6e 20 61 72 67 75 6d 65 6e 74 20  , then argument 
8a90: 72 65 67 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  reg is.** the fi
8aa0: 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20  rst register in 
8ab0: 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
8ac0: 73 74 65 72 73 20 67 75 61 72 61 6e 74 65 65 64  sters guaranteed
8ad0: 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20   to be large.** 
8ae0: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
8af0: 68 65 20 61 72 72 61 79 20 6f 66 20 61 72 67 75  he array of argu
8b00: 6d 65 6e 74 73 20 66 6f 72 20 65 61 63 68 20 66  ments for each f
8b10: 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  unction. In this
8b20: 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 61 72 67   case.** the arg
8b30: 75 6d 65 6e 74 73 20 61 72 65 20 65 78 74 72 61  uments are extra
8b40: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 63 75  cted from the cu
8b50: 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63 73 72  rrent row of csr
8b60: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 61 72 72   into the.** arr
8b70: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
8b80: 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20  before invoking 
8b90: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
8ba0: 5f 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a 0a 2a  _AggInverse.**.*
8bb0: 2a 20 4f 72 2c 20 69 66 20 63 73 72 20 69 73 20  * Or, if csr is 
8bc0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
8bd0: 74 68 65 6e 20 74 68 65 20 61 72 72 61 79 20 6f  then the array o
8be0: 66 20 72 65 67 69 73 74 65 72 73 20 61 74 20 72  f registers at r
8bf0: 65 67 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  eg is.** already
8c00: 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
8c10: 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  all columns from
8c20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
8c30: 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
8c40: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  y..**.** If argu
8c50: 6d 65 6e 74 20 72 65 67 50 61 72 74 53 69 7a 65  ment regPartSize
8c60: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
8c70: 65 6e 20 69 74 20 69 73 20 61 20 72 65 67 69 73  en it is a regis
8c80: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ter containing t
8c90: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
8ca0: 72 6f 77 73 20 69 6e 20 74 68 65 20 63 75 72 72  rows in the curr
8cb0: 65 6e 74 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a  ent partition..*
8cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
8cd0: 6e 64 6f 77 41 67 67 53 74 65 70 28 0a 20 20 50  ndowAggStep(.  P
8ce0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
8cf0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d10: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
8d20: 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  of window functi
8d30: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 63 73 72  ons */.  int csr
8d40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
8d60: 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
8d70: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20  this cursor */. 
8d80: 20 69 6e 74 20 62 49 6e 76 65 72 73 65 2c 20 20   int bInverse,  
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 76 6f   /* True to invo
8db0: 6b 65 20 78 49 6e 76 65 72 73 65 20 69 6e 73 74  ke xInverse inst
8dc0: 65 61 64 20 6f 66 20 78 53 74 65 70 20 2a 2f 0a  ead of xStep */.
8dd0: 20 20 69 6e 74 20 72 65 67 2c 20 20 20 20 20 20    int reg,      
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8df0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
8e00: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
8e10: 20 72 65 67 50 61 72 74 53 69 7a 65 20 20 20 20   regPartSize    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e30: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
8e40: 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61 72 74  ing size of part
8e50: 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 56 64  ition */.){.  Vd
8e60: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
8e70: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
8e80: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
8e90: 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
8ea0: 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
8eb0: 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
8ec0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 57    int flags = pW
8ed0: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
8ee0: 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 72 65  lags;.    int re
8ef0: 67 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 6e 41  gArg;.    int nA
8f00: 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67 43 6f  rg = windowArgCo
8f10: 75 6e 74 28 70 57 69 6e 29 3b 0a 0a 20 20 20 20  unt(pWin);..    
8f20: 69 66 28 20 63 73 72 3e 3d 30 20 29 7b 0a 20 20  if( csr>=0 ){.  
8f30: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
8f40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
8f50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
8f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8f70: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8f80: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
8f90: 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a 20 20  ol+i, reg+i);.  
8fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 67 41      }.      regA
8fb0: 72 67 20 3d 20 72 65 67 3b 0a 20 20 20 20 20 20  rg = reg;.      
8fc0: 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
8fd0: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53  TE_FUNC_WINDOW_S
8fe0: 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69  IZE ){.        i
8ff0: 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20  f( nArg==0 ){.  
9000: 20 20 20 20 20 20 20 20 72 65 67 41 72 67 20 3d          regArg =
9010: 20 72 65 67 50 61 72 74 53 69 7a 65 3b 0a 20 20   regPartSize;.  
9020: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9040: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
9050: 43 6f 70 79 2c 20 72 65 67 50 61 72 74 53 69 7a  Copy, regPartSiz
9060: 65 2c 20 72 65 67 2b 6e 41 72 67 29 3b 0a 20 20  e, reg+nArg);.  
9070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9080: 6e 41 72 67 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nArg++;.      }.
9090: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
90a0: 20 61 73 73 65 72 74 28 20 21 28 66 6c 61 67 73   assert( !(flags
90b0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57   & SQLITE_FUNC_W
90c0: 49 4e 44 4f 57 5f 53 49 5a 45 29 20 29 3b 0a 20  INDOW_SIZE) );. 
90d0: 20 20 20 20 20 72 65 67 41 72 67 20 3d 20 72 65       regArg = re
90e0: 67 20 2b 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  g + pWin->iArgCo
90f0: 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  l;.    }..    if
9100: 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  ( (pWin->pFunc->
9110: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
9120: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
9130: 0a 20 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e  .      && pWin->
9140: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
9150: 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20  NDED .    ){.   
9160: 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e 75 6c     int addrIsNul
9170: 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  l = sqlite3VdbeA
9180: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
9190: 6c 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20 20 20  ll, regArg);.   
91a0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
91b0: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 49  v);.      if( bI
91c0: 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20  nverse==0 ){.   
91d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
91e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
91f0: 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  Imm, pWin->regAp
9200: 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  p+1, 1);.       
9210: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9220: 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20  p2(v, OP_SCopy, 
9230: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
9240: 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20 20 73  gApp);.        s
9250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
9260: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9270: 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2c  d, pWin->regApp,
9280: 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   2, pWin->regApp
9290: 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2);.        sql
92a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
92b0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
92c0: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 57  pWin->csrApp, pW
92d0: 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a 20  in->regApp+2);. 
92e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
92f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9300: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
9310: 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63 73 72  eekGE, pWin->csr
9320: 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67 2c 20  App, 0, regArg, 
9330: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
9340: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
9350: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9360: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
9370: 65 74 65 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  ete, pWin->csrAp
9380: 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
9390: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
93a0: 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  v, sqlite3VdbeCu
93b0: 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b  rrentAddr(v)-2);
93c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
93d0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
93e0: 72 65 28 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c  re(v, addrIsNull
93f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
9400: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b   pWin->regApp ){
9410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9420: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d  Win->pFunc->zNam
9430: 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
9440: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
9450: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d  Win->pFunc->zNam
9460: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
9470: 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
9480: 20 20 61 73 73 65 72 74 28 20 62 49 6e 76 65 72    assert( bInver
9490: 73 65 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73  se==0 || bInvers
94a0: 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  e==1 );.      sq
94b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
94c0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57  v, OP_AddImm, pW
94d0: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e  in->regApp+1-bIn
94e0: 76 65 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d  verse, 1);.    }
94f0: 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 70  else if( pWin->p
9500: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61  Func->zName==lea
9510: 64 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20  dName.          
9520: 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d   || pWin->pFunc-
9530: 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a  >zName==lagName.
9540: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
9550: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c  no-op */.    }el
9560: 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  se{.      int ad
9570: 64 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  drIf = 0;.      
9580: 69 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65  if( pWin->pFilte
9590: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
95a0: 20 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20   regTmp;.       
95b0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30   assert( nArg==0
95c0: 20 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e   || nArg==pWin->
95d0: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d  pOwner->x.pList-
95e0: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
95f0: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 20 7c    assert( nArg |
9600: 7c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e  | pWin->pOwner->
9610: 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  x.pList==0 );.  
9620: 20 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20        if( csr>0 
9630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67  ){.          reg
9640: 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Tmp = sqlite3Get
9650: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
9660: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9670: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9680: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
9690: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41  pWin->iArgCol+nA
96a0: 72 67 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20 20  rg,regTmp);.    
96b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
96c0: 20 20 20 20 20 72 65 67 54 6d 70 20 3d 20 72 65       regTmp = re
96d0: 67 41 72 67 20 2b 20 6e 41 72 67 3b 0a 20 20 20  gArg + nArg;.   
96e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
96f0: 64 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56  ddrIf = sqlite3V
9700: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9710: 49 66 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30  IfNot, regTmp, 0
9720: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
9730: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
9740: 20 20 20 20 20 20 20 69 66 28 20 63 73 72 3e 30         if( csr>0
9750: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
9760: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
9770: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54  Reg(pParse, regT
9780: 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  mp);.        }. 
9790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
97a0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75   pWin->pFunc->fu
97b0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
97c0: 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
97d0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
97e0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
97f0: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e 30    assert( nArg>0
9800: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   );.        pCol
9810: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e  l = sqlite3ExprN
9820: 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  NCollSeq(pParse,
9830: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
9840: 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
9850: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
9860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
9870: 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c  , OP_CollSeq, 0,
9880: 30 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  0,0, (const char
9890: 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
98a0: 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
98b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
98c0: 64 64 4f 70 33 28 76 2c 20 62 49 6e 76 65 72 73  ddOp3(v, bInvers
98d0: 65 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65  e? OP_AggInverse
98e0: 20 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 0a   : OP_AggStep, .
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 20 20 20 20 20 20 20 62 49 6e 76 65 72 73 65          bInverse
9910: 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e  , regArg, pWin->
9920: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20  regAccum);.     
9930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
9940: 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
9950: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
9960: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9970: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
9980: 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  u8)nArg);.      
9990: 69 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c  if( addrIf ) sql
99a0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
99b0: 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20  (v, addrIf);.   
99c0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
99d0: 47 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65  Generate VM code
99e0: 20 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65   to invoke eithe
99f0: 72 20 78 56 61 6c 75 65 28 29 20 28 62 46 69 6e  r xValue() (bFin
9a00: 61 6c 3d 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c  al==0) or xFinal
9a10: 69 7a 65 28 29 0a 2a 2a 20 28 62 46 69 6e 61 6c  ize().** (bFinal
9a20: 3d 3d 31 29 20 66 6f 72 20 65 61 63 68 20 77 69  ==1) for each wi
9a30: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ndow function in
9a40: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
9a50: 20 73 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20   starting at.** 
9a60: 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62  pMWin. Or, for b
9a70: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66  uilt-in window-f
9a80: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f  unctions that do
9a90: 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61   not use the sta
9aa0: 6e 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65  ndard.** API, ge
9ab0: 6e 65 72 61 74 65 20 74 68 65 20 65 71 75 69 76  nerate the equiv
9ac0: 61 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a  alent VM code..*
9ad0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9ae0: 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 50 61 72  ndowAggFinal(Par
9af0: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
9b00: 6f 77 20 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62  ow *pMWin, int b
9b10: 46 69 6e 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a  Final){.  Vdbe *
9b20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
9b30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69  be(pParse);.  Wi
9b40: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66  ndow *pWin;..  f
9b50: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
9b60: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
9b70: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69  pNextWin){.    i
9b80: 66 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d  f( (pWin->pFunc-
9b90: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
9ba0: 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29  ITE_FUNC_MINMAX)
9bb0: 20 0a 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e   .     && pWin->
9bc0: 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
9bd0: 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20  NDED .    ){.   
9be0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9bf0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
9c00: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73   0, pWin->regRes
9c10: 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ult);.      sqli
9c20: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
9c30: 20 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e   OP_Last, pWin->
9c40: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56  csrApp);.      V
9c50: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9c60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9c70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
9c80: 6c 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41  lumn, pWin->csrA
9c90: 70 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  pp, 0, pWin->reg
9ca0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73  Result);.      s
9cb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
9cc0: 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62  re(v, sqlite3Vdb
9cd0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
9ce0: 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 46  2);.      if( bF
9cf0: 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
9d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9d10: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
9d20: 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  ter, pWin->csrAp
9d30: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
9d40: 7d 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e  }else if( pWin->
9d50: 72 65 67 41 70 70 20 29 7b 0a 20 20 20 20 7d 65  regApp ){.    }e
9d60: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 62  lse{.      if( b
9d70: 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Final ){.       
9d80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9d90: 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
9da0: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  l, pWin->regAccu
9db0: 6d 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e  m, windowArgCoun
9dc0: 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 20 20  t(pWin));.      
9dd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
9de0: 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70  endP4(v, pWin->p
9df0: 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
9e00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9e10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9e20: 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72  OP_Copy, pWin->r
9e30: 65 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72  egAccum, pWin->r
9e40: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
9e50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9e60: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
9e70: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
9e80: 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  um);.      }else
9e90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9ea0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9eb0: 50 5f 41 67 67 56 61 6c 75 65 2c 20 70 57 69 6e  P_AggValue, pWin
9ec0: 2d 3e 72 65 67 41 63 63 75 6d 2c 20 77 69 6e 64  ->regAccum, wind
9ed0: 6f 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29  owArgCount(pWin)
9ee0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9f00: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
9f10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9f20: 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20  VdbeAppendP4(v, 
9f30: 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  pWin->pFunc, P4_
9f40: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
9f50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
9f60: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
9f70: 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 20  on generates VM 
9f80: 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74  code to invoke t
9f90: 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61  he sub-routine a
9fa0: 74 20 61 64 64 72 65 73 73 0a 2a 2a 20 6c 62 6c  t address.** lbl
9fb0: 46 6c 75 73 68 50 61 72 74 20 6f 6e 63 65 20 66  FlushPart once f
9fc0: 6f 72 20 65 61 63 68 20 70 61 72 74 69 74 69 6f  or each partitio
9fd0: 6e 20 77 69 74 68 20 74 68 65 20 65 6e 74 69 72  n with the entir
9fe0: 65 20 70 61 72 74 69 74 69 6f 6e 20 63 61 63 68  e partition cach
9ff0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 57 69 6e  ed in.** the Win
a000: 64 6f 77 2e 69 45 70 68 43 73 72 20 74 65 6d 70  dow.iEphCsr temp
a010: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
a020: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 50 61 72  c void windowPar
a030: 74 69 74 69 6f 6e 43 61 63 68 65 28 0a 20 20 50  titionCache(.  P
a040: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20  arse *pParse,.  
a050: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a070: 2f 2a 20 54 68 65 20 72 65 77 72 69 74 74 65 6e  /* The rewritten
a080: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a090: 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
a0a0: 20 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20   *pWInfo,       
a0b0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 49         /* WhereI
a0c0: 6e 66 6f 20 74 6f 20 63 61 6c 6c 20 57 68 65 72  nfo to call Wher
a0d0: 65 45 6e 64 28 29 20 6f 6e 20 2a 2f 0a 20 20 69  eEnd() on */.  i
a0e0: 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c  nt regFlushPart,
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a100: 2a 20 52 65 67 69 73 74 65 72 20 74 6f 20 75 73  * Register to us
a110: 65 20 77 69 74 68 20 47 6f 73 75 62 20 6c 62 6c  e with Gosub lbl
a120: 46 6c 75 73 68 50 61 72 74 20 2a 2f 0a 20 20 69  FlushPart */.  i
a130: 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c  nt lblFlushPart,
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a150: 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  * Subroutine to 
a160: 47 6f 73 75 62 20 74 6f 20 2a 2f 0a 20 20 69 6e  Gosub to */.  in
a170: 74 20 2a 70 52 65 67 53 69 7a 65 20 20 20 20 20  t *pRegSize     
a180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a190: 20 4f 55 54 3a 20 52 65 67 69 73 74 65 72 20 63   OUT: Register c
a1a0: 6f 6e 74 61 69 6e 69 6e 67 20 70 61 72 74 69 74  ontaining partit
a1b0: 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  ion size */.){. 
a1c0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
a1d0: 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65   p->pWin;.  Vdbe
a1e0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
a1f0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
a200: 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20 70 2d  int iSubCsr = p-
a210: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72  >pSrc->a[0].iCur
a220: 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20  sor;.  int nSub 
a230: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
a240: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e  pTab->nCol;.  in
a250: 74 20 6b 3b 0a 0a 20 20 69 6e 74 20 72 65 67 20  t k;..  int reg 
a260: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
a270: 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  ;.  int regRecor
a280: 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20  d = reg+nSub;.  
a290: 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72  int regRowid = r
a2a0: 65 67 52 65 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a  egRecord+1;..  *
a2b0: 70 52 65 67 53 69 7a 65 20 3d 20 72 65 67 52 6f  pRegSize = regRo
a2c0: 77 69 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  wid;.  pParse->n
a2d0: 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b  Mem += nSub + 2;
a2e0: 0a 0a 20 20 2f 2a 20 4d 61 72 74 69 61 6c 20 74  ..  /* Martial t
a2f0: 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20  he row returned 
a300: 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  by the sub-selec
a310: 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  t into an array 
a320: 6f 66 20 0a 20 20 2a 2a 20 72 65 67 69 73 74 65  of .  ** registe
a330: 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  rs. */.  for(k=0
a340: 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a  ; k<nSub; k++){.
a350: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a360: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
a370: 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20  mn, iSubCsr, k, 
a380: 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73 71  reg+k);.  }.  sq
a390: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a3a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
a3b0: 2c 20 72 65 67 2c 20 6e 53 75 62 2c 20 72 65 67  , reg, nSub, reg
a3c0: 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 43  Record);..  /* C
a3d0: 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
a3e0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e  the start of a n
a3f0: 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 20 49 66  ew partition. If
a400: 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20   so, call the.  
a410: 2a 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  ** flush_partiti
a420: 6f 6e 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20  on sub-routine. 
a430: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
a440: 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20  >pPartition ){. 
a450: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
a460: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
a470: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
a480: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50  tion;.    int nP
a490: 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78  art = pPart->nEx
a4a0: 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e  pr;.    int regN
a4b0: 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70  ewPart = reg + p
a4c0: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
a4d0: 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
a4e0: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
a4f0: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
a500: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61  List(pParse, pPa
a510: 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rt, 0, 0);..    
a520: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
a530: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a540: 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61  ompare, regNewPa
a550: 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  rt, pMWin->regPa
a560: 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20 73  rt,nPart);.    s
a570: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
a580: 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65  P4(v, (void*)pKe
a590: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
a5a0: 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
a5b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a5c0: 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61 64  Jump, addr+2, ad
a5d0: 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20  dr+4, addr+2);. 
a5e0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
a5f0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
a600: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a610: 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 61 72 74  Copy, regNewPart
a620: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
a630: 2c 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20 20 20  , nPart-1);.    
a640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a650: 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
a660: 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c  egFlushPart, lbl
a670: 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 20 20  FlushPart);.    
a680: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
a690: 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72 74  "call flush_part
a6a0: 69 74 69 6f 6e 22 29 29 3b 0a 20 20 7d 0a 0a 20  ition"));.  }.. 
a6b0: 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63   /* Buffer the c
a6c0: 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68  urrent row in th
a6d0: 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
a6e0: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  e. */.  sqlite3V
a6f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a700: 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d  NewRowid, pMWin-
a710: 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f 77  >iEphCsr, regRow
a720: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
a730: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
a740: 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  nsert, pMWin->iE
a750: 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72 64  phCsr, regRecord
a760: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
a770: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 69 6e  /* End of the in
a780: 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 73 71  put loop */.  sq
a790: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
a7a0: 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76  Info);..  /* Inv
a7b0: 6f 6b 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69  oke "flush_parti
a7c0: 74 69 6f 6e 22 20 74 6f 20 64 65 61 6c 20 77 69  tion" to deal wi
a7d0: 74 68 20 74 68 65 20 66 69 6e 61 6c 20 28 6f 72  th the final (or
a7e0: 20 6f 6e 6c 79 29 20 70 61 72 74 69 74 69 6f 6e   only) partition
a7f0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
a800: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
a810: 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72  sub, regFlushPar
a820: 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29  t, lblFlushPart)
a830: 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
a840: 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f  (v, "call flush_
a850: 70 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a 7d 0a  partition"));.}.
a860: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
a870: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
a880: 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e 65 72   regGosub (gener
a890: 61 74 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  ated by code in 
a8a0: 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a 2a 20  select.c) to.** 
a8b0: 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
a8c0: 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64 6f 77  nt row of Window
a8d0: 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61 6c 6c  .iEphCsr. If all
a8e0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
a8f0: 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65 67 61  s are.** aggrega
a900: 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  te window functi
a910: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ons that use the
a920: 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c 20 61   standard API, a
a930: 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f 47 6f   single.** OP_Go
a940: 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  sub instruction 
a950: 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68 69 73  is all that this
a960: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
a970: 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63 6f 64  es. Extra VM cod
a980: 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72 6f 77  e.** for per-row
a990: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6f   processing is o
a9a0: 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
a9b0: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
a9c0: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 0a  built-in window.
a9d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ** functions:.**
a9e0: 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75 65 28  .**   nth_value(
a9f0: 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76 61 6c  ).**   first_val
aa00: 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28 29 0a  ue().**   lag().
aa10: 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f 0a 73  **   lead().*/.s
aa20: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
aa30: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 0a 20  wReturnOneRow(. 
aa40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
aa50: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c    Window *pMWin,
aa60: 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62 2c  .  int regGosub,
aa70: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
aa80: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
aa90: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
aaa0: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
aab0: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
aac0: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
aad0: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
aae0: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
aaf0: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
ab00: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66 28 20  >pFunc;.    if( 
ab10: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74  pFunc->zName==nt
ab20: 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20  h_valueName.    
ab30: 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65   || pFunc->zName
ab40: 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  ==first_valueNam
ab50: 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  e.    ){.      i
ab60: 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d 3e 63  nt csr = pWin->c
ab70: 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69 6e 74  srApp;.      int
ab80: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33 56 64   lbl = sqlite3Vd
ab90: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
aba0: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67        int tmpReg
abb0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
abc0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
abd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
abe0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
abf0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
ac00: 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20 20 69 66  sult);..      if
ac10: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
ac20: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  nth_valueName ){
ac30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ac40: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
ac50: 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e  _Column, pMWin->
ac60: 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69  iEphCsr, pWin->i
ac70: 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29  ArgCol+1,tmpReg)
ac80: 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
ac90: 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70 50  CheckIntValue(pP
aca0: 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32 29  arse, tmpReg, 2)
acb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
acc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
acd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
ace0: 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65  nteger, 1, tmpRe
acf0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
ad00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ad10: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74  Op3(v, OP_Add, t
ad20: 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67  mpReg, pWin->reg
ad30: 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  App, tmpReg);.  
ad40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ad50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20  ddOp3(v, OP_Gt, 
ad60: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20  pWin->regApp+1, 
ad70: 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  lbl, tmpReg);.  
ad80: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
ad90: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
ada0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
adb0: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73  OP_SeekRowid, cs
adc0: 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b  r, lbl, tmpReg);
add0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
ade0: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
adf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ae00: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73  v, OP_Column, cs
ae10: 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  r, pWin->iArgCol
ae20: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
ae30: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
ae40: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
ae50: 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20  l(v, lbl);.     
ae60: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ae70: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 74  empReg(pParse, t
ae80: 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20  mpReg);.    }.  
ae90: 20 20 65 6c 73 65 20 69 66 28 20 70 46 75 6e 63    else if( pFunc
aea0: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
aeb0: 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d  e || pFunc->zNam
aec0: 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20 20  e==lagName ){.  
aed0: 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 70      int nArg = p
aee0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
aef0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
af00: 20 20 20 69 6e 74 20 69 45 70 68 20 3d 20 70 4d     int iEph = pM
af10: 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20 20  Win->iEphCsr;.  
af20: 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57      int csr = pW
af30: 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20  in->csrApp;.    
af40: 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
af50: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
af60: 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  (v);.      int t
af70: 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  mpReg = sqlite3G
af80: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
af90: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 41  );..      if( nA
afa0: 72 67 3c 33 20 29 7b 0a 20 20 20 20 20 20 20 20  rg<3 ){.        
afb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
afc0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
afd0: 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74   pWin->regResult
afe0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
aff0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b000: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b010: 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57  Column, iEph, pW
b020: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 32 2c 20 70  in->iArgCol+2, p
b030: 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
b040: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b060: 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45  (v, OP_Rowid, iE
b070: 70 68 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  ph, tmpReg);.   
b080: 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
b090: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 61 6c  .        int val
b0a0: 20 3d 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65   = (pFunc->zName
b0b0: 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f 20 31 20 3a  ==leadName ? 1 :
b0c0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   -1);.        sq
b0d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b0e0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d  v, OP_AddImm, tm
b0f0: 70 52 65 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20  pReg, val);.    
b100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b110: 20 69 6e 74 20 6f 70 20 3d 20 28 70 46 75 6e 63   int op = (pFunc
b120: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
b130: 65 20 3f 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f  e ? OP_Add : OP_
b140: 53 75 62 74 72 61 63 74 29 3b 0a 20 20 20 20 20  Subtract);.     
b150: 20 20 20 69 6e 74 20 74 6d 70 52 65 67 32 20 3d     int tmpReg2 =
b160: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b170: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
b180: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b190: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
b1a0: 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e  mn, iEph, pWin->
b1b0: 69 41 72 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65  iArgCol+1, tmpRe
b1c0: 67 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  g2);.        sql
b1d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b1e0: 2c 20 6f 70 2c 20 74 6d 70 52 65 67 32 2c 20 74  , op, tmpReg2, t
b1f0: 6d 70 52 65 67 2c 20 74 6d 70 52 65 67 29 3b 0a  mpReg, tmpReg);.
b200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
b210: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
b220: 61 72 73 65 2c 20 74 6d 70 52 65 67 32 29 3b 0a  arse, tmpReg2);.
b230: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
b240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b250: 28 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64  (v, OP_SeekRowid
b260: 2c 20 63 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52  , csr, lbl, tmpR
b270: 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  eg);.      VdbeC
b280: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b2a0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b2b0: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
b2c0: 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52  gCol, pWin->regR
b2d0: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
b2e0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
b2f0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20  Label(v, lbl);. 
b300: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
b310: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
b320: 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  e, tmpReg);.    
b330: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
b340: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b350: 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c  Gosub, regGosub,
b360: 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a   addrGosub);.}..
b370: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
b380: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
b390: 62 79 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f  by windowReturnO
b3a0: 6e 65 52 6f 77 28 29 20 61 6e 64 2c 20 6f 70 74  neRow() and, opt
b3b0: 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a 2a 2a 20  ionally, the.** 
b3c0: 78 49 6e 76 65 72 73 65 28 29 20 66 75 6e 63 74  xInverse() funct
b3d0: 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ion for each win
b3e0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 2c 20 66 6f  dow function, fo
b3f0: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 6f  r one or more ro
b400: 77 73 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 57  ws.** from the W
b410: 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 20 74 65  indow.iEphCsr te
b420: 6d 70 20 74 61 62 6c 65 2e 20 54 68 69 73 20 72  mp table. This r
b430: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
b440: 20 56 4d 20 63 6f 64 65 0a 2a 2a 20 73 69 6d 69   VM code.** simi
b450: 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20  lar to:.**.**   
b460: 77 68 69 6c 65 28 20 72 65 67 43 74 72 3e 30 20  while( regCtr>0 
b470: 29 7b 0a 2a 2a 20 20 20 20 20 72 65 67 43 74 72  ){.**     regCtr
b480: 2d 2d 3b 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f  --;.**     windo
b490: 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 29 0a  wReturnOneRow().
b4a0: 2a 2a 20 20 20 20 20 69 66 28 20 62 49 6e 76 65  **     if( bInve
b4b0: 72 73 65 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  rse ){.**       
b4c0: 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a 20 20 20  AggInverse.**   
b4d0: 20 20 7d 0a 2a 2a 20 20 20 20 20 4e 65 78 74 20    }.**     Next 
b4e0: 28 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 29  (Window.iEphCsr)
b4f0: 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a 73 74 61 74 69  .**   }.*/.stati
b500: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74  c void windowRet
b510: 75 72 6e 52 6f 77 73 28 0a 20 20 50 61 72 73 65  urnRows(.  Parse
b520: 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 69 6e 64   *pParse,.  Wind
b530: 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20  ow *pMWin,      
b540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b550: 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75  ist of window fu
b560: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
b570: 20 72 65 67 43 74 72 2c 20 20 20 20 20 20 20 20   regCtr,        
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b590: 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  Register contain
b5a0: 69 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ing number of ro
b5b0: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47  ws */.  int regG
b5c0: 6f 73 75 62 2c 20 20 20 20 20 20 20 20 20 20 20  osub,           
b5d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
b5e0: 74 65 72 20 66 6f 72 20 47 6f 73 75 62 20 61 64  ter for Gosub ad
b5f0: 64 72 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74  drGosub */.  int
b600: 20 61 64 64 72 47 6f 73 75 62 2c 20 20 20 20 20   addrGosub,     
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b620: 41 64 64 72 65 73 73 20 6f 66 20 73 75 62 2d 72  Address of sub-r
b630: 6f 75 74 69 6e 65 20 66 6f 72 20 52 65 74 75 72  outine for Retur
b640: 6e 4f 6e 65 52 6f 77 20 2a 2f 0a 20 20 69 6e 74  nOneRow */.  int
b650: 20 72 65 67 49 6e 76 41 72 67 2c 20 20 20 20 20   regInvArg,     
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b670: 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  Array of registe
b680: 72 73 20 66 6f 72 20 78 49 6e 76 65 72 73 65 20  rs for xInverse 
b690: 61 72 67 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  args */.  int re
b6a0: 67 49 6e 76 53 69 7a 65 20 20 20 20 20 20 20 20  gInvSize        
b6b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
b6c0: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
b6d0: 20 73 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69   size of partiti
b6e0: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  on */.){.  int a
b6f0: 64 64 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ddr;.  Vdbe *v =
b700: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
b710: 70 50 61 72 73 65 29 3b 0a 20 20 77 69 6e 64 6f  pParse);.  windo
b720: 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
b730: 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 61  , pMWin, 0);.  a
b740: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
b750: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
b760: 50 6f 73 2c 20 72 65 67 43 74 72 2c 20 73 71 6c  Pos, regCtr, sql
b770: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
b780: 64 64 72 28 76 29 2b 32 20 2c 31 29 3b 0a 20 20  ddr(v)+2 ,1);.  
b790: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b7a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
b7b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
b7c0: 20 30 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77   0, 0);.  window
b7d0: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61  ReturnOneRow(pPa
b7e0: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47  rse, pMWin, regG
b7f0: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
b800: 3b 0a 20 20 69 66 28 20 72 65 67 49 6e 76 41 72  ;.  if( regInvAr
b810: 67 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41  g ){.    windowA
b820: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
b830: 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  MWin, pMWin->iEp
b840: 68 43 73 72 2c 20 31 2c 20 72 65 67 49 6e 76 41  hCsr, 1, regInvA
b850: 72 67 2c 20 72 65 67 49 6e 76 53 69 7a 65 29 3b  rg, regInvSize);
b860: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
b870: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
b880: 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ext, pMWin->iEph
b890: 43 73 72 2c 20 61 64 64 72 29 3b 0a 20 20 56 64  Csr, addr);.  Vd
b8a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b8b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
b8c0: 48 65 72 65 28 76 2c 20 61 64 64 72 2b 31 29 3b  Here(v, addr+1);
b8d0: 20 20 20 2f 2a 20 54 68 65 20 4f 50 5f 47 6f 74     /* The OP_Got
b8e0: 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  o */.}../*.** Ge
b8f0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73  nerate code to s
b900: 65 74 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  et the accumulat
b910: 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  or register for 
b920: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
b930: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c  tion.** in the l
b940: 69 6e 6b 65 64 20 6c 69 73 74 20 70 61 73 73 65  inked list passe
b950: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
b960: 61 72 67 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c  argument to NULL
b970: 2e 20 41 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a  . And perform.**
b980: 20 61 6e 79 20 65 71 75 69 76 61 6c 65 6e 74 20   any equivalent 
b990: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72  initialization r
b9a0: 65 71 75 69 72 65 64 20 62 79 20 61 6e 79 20 62  equired by any b
b9b0: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
b9c0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74  unctions.** in t
b9d0: 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
b9e0: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69  ic int windowIni
b9f0: 74 41 63 63 75 6d 28 50 61 72 73 65 20 2a 70 50  tAccum(Parse *pP
ba00: 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d  arse, Window *pM
ba10: 57 69 6e 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  Win){.  Vdbe *v 
ba20: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
ba30: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
ba40: 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41  regArg;.  int nA
ba50: 72 67 20 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77  rg = 0;.  Window
ba60: 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57   *pWin;.  for(pW
ba70: 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20  in=pMWin; pWin; 
ba80: 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
ba90: 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  Win){.    FuncDe
baa0: 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d  f *pFunc = pWin-
bab0: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69  >pFunc;.    sqli
bac0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bad0: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
bae0: 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
baf0: 20 20 6e 41 72 67 20 3d 20 4d 41 58 28 6e 41 72    nArg = MAX(nAr
bb00: 67 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e  g, windowArgCoun
bb10: 74 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 69 66  t(pWin));.    if
bb20: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
bb30: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  nth_valueName.  
bb40: 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61     || pFunc->zNa
bb50: 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e  me==first_valueN
bb60: 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ame.    ){.     
bb70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bb80: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
bb90: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
bba0: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
bbb0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bbc0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
bbd0: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
bbe0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70     }..    if( (p
bbf0: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
bc00: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
bc10: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 63  NMAX) && pWin->c
bc20: 73 72 41 70 70 20 29 7b 0a 20 20 20 20 20 20 61  srApp ){.      a
bc30: 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 65 53 74  ssert( pWin->eSt
bc40: 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art!=TK_UNBOUNDE
bc50: 44 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  D );.      sqlit
bc60: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
bc70: 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20  OP_ResetSorter, 
bc80: 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20  pWin->csrApp);. 
bc90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bca0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
bcb0: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
bcc0: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a  egApp+1);.    }.
bcd0: 20 20 7d 0a 20 20 72 65 67 41 72 67 20 3d 20 70    }.  regArg = p
bce0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
bcf0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
bd00: 20 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20   nArg;.  return 
bd10: 72 65 67 41 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  regArg;.}.../*.*
bd20: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bd30: 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66  does the work of
bd40: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f   sqlite3WindowCo
bd50: 64 65 53 74 65 70 28 29 20 66 6f 72 20 61 6c 6c  deStep() for all
bd60: 20 22 52 4f 57 53 22 0a 2a 2a 20 77 69 6e 64 6f   "ROWS".** windo
bd70: 77 20 66 72 61 6d 65 20 74 79 70 65 73 20 65 78  w frame types ex
bd80: 63 65 70 74 20 66 6f 72 20 22 42 45 54 57 45 45  cept for "BETWEE
bd90: 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
bda0: 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
bdb0: 54 0a 2a 2a 20 52 4f 57 22 2e 20 50 73 65 75 64  T.** ROW". Pseud
bdc0: 6f 2d 63 6f 64 65 20 66 6f 72 20 65 61 63 68 20  o-code for each 
bdd0: 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52  follows..**.** R
bde0: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
bdf0: 72 31 3e 20 50 52 45 43 45 44 49 4e 47 20 41 4e  r1> PRECEDING AN
be00: 44 20 3c 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57  D <expr2> FOLLOW
be10: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  ING.**.**     ..
be20: 2e 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  ..**       if( n
be30: 65 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ew partition ){.
be40: 2a 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62  **         Gosub
be50: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
be60: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
be70: 20 20 20 20 20 49 6e 73 65 72 74 20 28 72 65 63       Insert (rec
be80: 6f 72 64 20 69 6e 20 65 70 68 2d 74 61 62 6c 65  ord in eph-table
be90: 29 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ).**     sqlite3
bea0: 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
beb0: 20 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61    Gosub flush_pa
bec0: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20  rtition.**  .** 
bed0: 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f    flush_partitio
bee0: 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b  n:.**     Once {
bef0: 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75  .**       OpenDu
bf00: 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73  p (iEphCsr -> cs
bf10: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
bf20: 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73   OpenDup (iEphCs
bf30: 72 20 2d 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20  r -> csrEnd).** 
bf40: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67      }.**     reg
bf50: 53 74 61 72 74 20 3d 20 3c 65 78 70 72 31 3e 20  Start = <expr1> 
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bf70: 2f 20 50 52 45 43 45 44 49 4e 47 20 65 78 70 72  / PRECEDING expr
bf80: 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65  ession.**     re
bf90: 67 45 6e 64 20 3d 20 3c 65 78 70 72 32 3e 20 20  gEnd = <expr2>  
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 2f 2f 20 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70  // FOLLOWING exp
bfc0: 72 65 73 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69  ression.**     i
bfd0: 66 28 20 72 65 67 53 74 61 72 74 3c 30 20 7c 7c  f( regStart<0 ||
bfe0: 20 72 65 67 45 6e 64 3c 30 20 29 7b 20 65 72 72   regEnd<0 ){ err
bff0: 6f 72 21 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77  or! }.**     Rew
c000: 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72  ind (csr,csrStar
c010: 74 2c 63 73 72 45 6e 64 29 20 20 20 20 20 20 2f  t,csrEnd)      /
c020: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
c030: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c040: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  ne.**       Next
c050: 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20 20  (csrEnd)        
c060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
c070: 66 20 45 4f 46 20 73 6b 69 70 20 41 67 67 73 74  f EOF skip Aggst
c080: 65 70 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73  ep.**       Aggs
c090: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
c0a0: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 45 6e        if( (regEn
c0b0: 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20  d--)<=0 ){.**   
c0c0: 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28        AggFinal (
c0d0: 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20  xValue).**      
c0e0: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
c0f0: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  ub.**         Ne
c100: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
c110: 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46         // if EOF
c120: 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74   goto flush_part
c130: 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20  ition_done.**   
c140: 20 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74        if( (regSt
c150: 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20  art--)<=0 ){.** 
c160: 20 20 20 20 20 20 20 20 20 20 41 67 67 49 6e 76            AggInv
c170: 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29 0a  erse (csrStart).
c180: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65 78  **           Nex
c190: 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20  t(csrStart).**  
c1a0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
c1b0: 20 20 7d 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70    }.**   flush_p
c1c0: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 0a 2a  artition_done:.*
c1d0: 2a 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65  *     ResetSorte
c1e0: 72 20 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52  r (csr).**     R
c1f0: 65 74 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  eturn.**.** ROWS
c200: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 3e 20   BETWEEN <expr> 
c210: 50 52 45 43 45 44 49 4e 47 20 20 20 20 41 4e 44  PRECEDING    AND
c220: 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20   CURRENT ROW.** 
c230: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55 52  ROWS BETWEEN CUR
c240: 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20 20 20  RENT ROW        
c250: 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c   AND <expr> FOLL
c260: 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45  OWING.** ROWS BE
c270: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
c280: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c 65  PRECEDING AND <e
c290: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  xpr> FOLLOWING.*
c2a0: 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 61 72 65  *.**   These are
c2b0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 20   similar to the 
c2c0: 61 62 6f 76 65 2e 20 46 6f 72 20 22 43 55 52 52  above. For "CURR
c2d0: 45 4e 54 20 52 4f 57 22 2c 20 69 6e 74 69 61 6c  ENT ROW", intial
c2e0: 69 7a 65 20 74 68 65 0a 2a 2a 20 20 20 72 65 67  ize the.**   reg
c2f0: 69 73 74 65 72 20 74 6f 20 30 2e 20 46 6f 72 20  ister to 0. For 
c300: 22 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45  "UNBOUNDED PRECE
c310: 44 49 4e 47 22 20 74 6f 20 69 6e 66 69 6e 69 74  DING" to infinit
c320: 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  y..**.** ROWS BE
c330: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
c340: 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 55 4e  CEDING    AND UN
c350: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
c360: 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  G.** ROWS BETWEE
c370: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20  N CURRENT ROW   
c380: 20 20 20 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e        AND UNBOUN
c390: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  DED FOLLOWING.**
c3a0: 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64 20 28  .**     Rewind (
c3b0: 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72  csr,csrStart,csr
c3c0: 45 6e 64 29 20 20 20 20 2f 2f 20 69 66 20 45 4f  End)    // if EO
c3d0: 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72  F goto flush_par
c3e0: 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20  tition_done.**  
c3f0: 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a     while( 1 ){.*
c400: 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72  *       Next(csr
c410: 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20  End)            
c420: 20 20 20 20 20 20 2f 2f 20 45 78 69 74 20 77 68        // Exit wh
c430: 69 6c 65 28 31 29 20 61 74 20 45 4f 46 0a 2a 2a  ile(1) at EOF.**
c440: 20 20 20 20 20 20 20 41 67 67 73 74 65 70 20 28         Aggstep (
c450: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d  csrEnd).**     }
c460: 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31  .**     while( 1
c470: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
c480: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
c490: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
c4a0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
c4b0: 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20 20   Next(csr)      
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c4d0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
c4e0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c4f0: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ne.**       if( 
c500: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
c510: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
c520: 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61  gInverse (csrSta
c530: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e  rt).**         N
c540: 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
c550: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
c560: 7d 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 74 68  }.**.**   For th
c570: 65 20 22 43 55 52 52 45 4e 54 20 52 4f 57 20 41  e "CURRENT ROW A
c580: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
c590: 4c 4f 57 49 4e 47 22 20 63 61 73 65 2c 20 74 68  LOWING" case, th
c5a0: 65 20 66 69 6e 61 6c 20 69 66 28 29 20 0a 2a 2a  e final if() .**
c5b0: 20 20 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20     condition is 
c5c0: 61 6c 77 61 79 73 20 74 72 75 65 20 28 61 73 20  always true (as 
c5d0: 69 66 20 72 65 67 53 74 61 72 74 20 77 65 72 65  if regStart were
c5e0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
c5f0: 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20  0)..**.** RANGE 
c600: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
c610: 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
c620: 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 0a  D FOLLOWING.** .
c630: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 74 68 65  **   This is the
c640: 20 6f 6e 6c 79 20 52 41 4e 47 45 20 63 61 73 65   only RANGE case
c650: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 69 73   handled by this
c660: 20 72 6f 75 74 69 6e 65 2e 20 49 74 20 6d 6f 64   routine. It mod
c670: 69 66 69 65 73 20 74 68 65 0a 2a 2a 20 20 20 73  ifies the.**   s
c680: 65 63 6f 6e 64 20 77 68 69 6c 65 28 20 31 20 29  econd while( 1 )
c690: 20 6c 6f 6f 70 20 69 6e 20 22 52 4f 57 53 20 42   loop in "ROWS B
c6a0: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 2e  ETWEEN CURRENT .
c6b0: 2e 2e 20 55 4e 42 4f 55 4e 44 45 44 2e 2e 2e 22  .. UNBOUNDED..."
c6c0: 20 74 6f 0a 2a 2a 20 20 20 62 65 3a 0a 2a 2a 0a   to.**   be:.**.
c6d0: 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31 20  **     while( 1 
c6e0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46  ){.**       AggF
c6f0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
c700: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20         while( 1 
c710: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65  ){.**         re
c720: 67 50 65 65 72 2b 2b 0a 2a 2a 20 20 20 20 20 20  gPeer++.**      
c730: 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
c740: 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  ub.**         Ne
c750: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
c760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
c770: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
c780: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
c790: 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  **         if( n
c7a0: 65 77 20 70 65 65 72 20 29 20 62 72 65 61 6b 3b  ew peer ) break;
c7b0: 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
c7c0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 72 65 67       while( (reg
c7d0: 50 65 65 72 2d 2d 29 3e 30 20 29 7b 0a 2a 2a 20  Peer--)>0 ){.** 
c7e0: 20 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72          AggInver
c7f0: 73 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  se (csrStart).**
c800: 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63 73           Next(cs
c810: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20  rStart).**      
c820: 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a   }.**     }.**.*
c830: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
c840: 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20  expr> FOLLOWING 
c850: 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f     AND <expr> FO
c860: 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
c870: 72 65 67 45 6e 64 20 3d 20 72 65 67 45 6e 64 20  regEnd = regEnd 
c880: 2d 20 72 65 67 53 74 61 72 74 0a 2a 2a 20 20 20  - regStart.**   
c890: 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53  Rewind (csr,csrS
c8a0: 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20 20 2f  tart,csrEnd)   /
c8b0: 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c  / if EOF goto fl
c8c0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c8d0: 6e 65 0a 2a 2a 20 20 20 20 20 41 67 67 73 74 65  ne.**     Aggste
c8e0: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
c8f0: 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20    Next(csrEnd)  
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c910: 2f 20 69 66 20 45 4f 46 20 66 61 6c 6c 2d 74 68  / if EOF fall-th
c920: 72 6f 75 67 68 0a 2a 2a 20 20 20 20 20 69 66 28  rough.**     if(
c930: 20 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29   (regEnd--)<=0 )
c940: 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  {.**       if( (
c950: 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29  regStart--)<=0 )
c960: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
c970: 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a  Final (xValue).*
c980: 2a 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20  *         Gosub 
c990: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
c9a0: 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20       Next(csr)  
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
c9c0: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
c9d0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
c9e0: 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20  **       }.**   
c9f0: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
ca00: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
ca10: 20 20 20 4e 65 78 74 20 28 63 73 72 53 74 61 72     Next (csrStar
ca20: 74 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a  t).**     }.**.*
ca30: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
ca40: 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
ca50: 20 20 20 41 4e 44 20 3c 65 78 70 72 3e 20 50 52     AND <expr> PR
ca60: 45 43 45 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  ECEDING.**.**   
ca70: 52 65 70 6c 61 63 65 20 74 68 65 20 62 69 74 20  Replace the bit 
ca80: 61 66 74 65 72 20 22 52 65 77 69 6e 64 22 20 69  after "Rewind" i
ca90: 6e 20 74 68 65 20 61 62 6f 76 65 20 77 69 74 68  n the above with
caa0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 28 20  :.**.**     if( 
cab0: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
cac0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65  .**       AggSte
cad0: 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20  p (csrEnd).**   
cae0: 20 20 20 20 4e 65 78 74 20 28 63 73 72 45 6e 64      Next (csrEnd
caf0: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
cb00: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
cb10: 75 65 29 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62  ue).**     Gosub
cb20: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
cb30: 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20    Next(csr)     
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
cb50: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
cb60: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
cb70: 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65 67  .**     if( (reg
cb80: 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
cb90: 2a 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72  *       AggInver
cba0: 73 65 20 28 63 73 72 32 29 0a 2a 2a 20 20 20 20  se (csr2).**    
cbb0: 20 20 20 4e 65 78 74 20 28 63 73 72 32 29 0a 2a     Next (csr2).*
cbc0: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74  *     }.**.*/.st
cbd0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
cbe0: 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28  CodeRowExprStep(
cbf0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cc00: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
cc10: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
cc20: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
cc30: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
cc40: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
cc50: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
cc60: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
cc70: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
cc80: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65  Parse);.  int re
cc90: 67 46 6c 75 73 68 50 61 72 74 3b 20 20 20 20 20  gFlushPart;     
cca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
ccb0: 69 73 74 65 72 20 66 6f 72 20 22 47 6f 73 75 62  ister for "Gosub
ccc0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
ccd0: 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  " */.  int lblFl
cce0: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
ccf0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
cd00: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
cd10: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
cd20: 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e   int lblFlushDon
cd30: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
cd40: 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 22 47   /* Label for "G
cd50: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
cd60: 74 69 6f 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20  tion_done" */.. 
cd70: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
cd80: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 63  nt addr;.  int c
cd90: 73 72 53 74 61 72 74 20 3d 20 70 50 61 72 73 65  srStart = pParse
cda0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20  ->nTab++;.  int 
cdb0: 63 73 72 45 6e 64 20 3d 20 70 50 61 72 73 65 2d  csrEnd = pParse-
cdc0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 72  >nTab++;.  int r
cdd0: 65 67 53 74 61 72 74 3b 20 20 20 20 20 20 20 20  egStart;        
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
cdf0: 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 50  alue of <expr> P
ce00: 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e  RECEDING */.  in
ce10: 74 20 72 65 67 45 6e 64 3b 20 20 20 20 20 20 20  t regEnd;       
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce30: 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72  * Value of <expr
ce40: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20  > FOLLOWING */. 
ce50: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 0a 20   int addrGoto;. 
ce60: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a 20 20   int addrTop;.  
ce70: 69 6e 74 20 61 64 64 72 49 66 50 6f 73 31 20 3d  int addrIfPos1 =
ce80: 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66   0;.  int addrIf
ce90: 50 6f 73 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Pos2 = 0;.  int 
cea0: 72 65 67 53 69 7a 65 20 3d 20 30 3b 0a 0a 20 20  regSize = 0;..  
ceb0: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
cec0: 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
ced0: 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ING .       || p
cee0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
cef0: 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20  _CURRENT .      
cf00: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
cf10: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
cf20: 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e  .       || pMWin
cf30: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42  ->eStart==TK_UNB
cf40: 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a 20 20 61  OUNDED .  );.  a
cf50: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45  ssert( pMWin->eE
cf60: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
cf70: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
cf80: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
cf90: 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ENT .       || p
cfa0: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
cfb0: 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 20 20  NBOUNDED .      
cfc0: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
cfd0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20  =TK_PRECEDING . 
cfe0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
cff0: 74 65 20 72 65 67 69 73 74 65 72 20 61 6e 64 20  te register and 
d000: 6c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 22 66  label for the "f
d010: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20  lush_partition" 
d020: 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a  sub-routine. */.
d030: 20 20 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d    regFlushPart =
d040: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
d050: 0a 20 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20  .  lblFlushPart 
d060: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d070: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 62 6c  eLabel(v);.  lbl
d080: 46 6c 75 73 68 44 6f 6e 65 20 3d 20 73 71 6c 69  FlushDone = sqli
d090: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
d0a0: 28 76 29 3b 0a 0a 20 20 72 65 67 53 74 61 72 74  (v);..  regStart
d0b0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d0c0: 6d 3b 0a 20 20 72 65 67 45 6e 64 20 3d 20 2b 2b  m;.  regEnd = ++
d0d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
d0e0: 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e   windowPartition
d0f0: 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 2c  Cache(pParse, p,
d100: 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75 73   pWInfo, regFlus
d110: 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50  hPart, lblFlushP
d120: 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29 3b 0a  art, &regSize);.
d130: 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71  .  addrGoto = sq
d140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
d150: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20  v, OP_Goto);..  
d160: 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c 75  /* Start of "flu
d170: 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f  sh_partition" */
d180: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
d190: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
d1a0: 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 73  lFlushPart);.  s
d1b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d1c0: 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20  (v, OP_Once, 0, 
d1d0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d1e0: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
d1f0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d200: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
d210: 76 2c 20 22 46 6c 75 73 68 5f 70 61 72 74 69 74  v, "Flush_partit
d220: 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 22 29  ion subroutine")
d230: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d240: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
d250: 6e 44 75 70 2c 20 63 73 72 53 74 61 72 74 2c 20  nDup, csrStart, 
d260: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
d270: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d280: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
d290: 75 70 2c 20 63 73 72 45 6e 64 2c 20 70 4d 57 69  up, csrEnd, pMWi
d2a0: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20  n->iEphCsr);..  
d2b0: 2f 2a 20 49 66 20 65 69 74 68 65 72 20 72 65 67  /* If either reg
d2c0: 53 74 61 72 74 20 6f 72 20 72 65 67 45 6e 64 20  Start or regEnd 
d2d0: 61 72 65 20 6e 6f 74 20 6e 6f 6e 2d 6e 65 67 61  are not non-nega
d2e0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2c 20 74  tive integers, t
d2f0: 68 72 6f 77 20 0a 20 20 2a 2a 20 61 6e 20 65 78  hrow .  ** an ex
d300: 63 65 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ception.  */.  i
d310: 66 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74  f( pMWin->pStart
d320: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d330: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d340: 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72  pMWin->pStart, r
d350: 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20 77 69  egStart);.    wi
d360: 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75  ndowCheckIntValu
d370: 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74 61  e(pParse, regSta
d380: 72 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  rt, 0);.  }.  if
d390: 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 20 29 7b  ( pMWin->pEnd ){
d3a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
d3b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57  Code(pParse, pMW
d3c0: 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64  in->pEnd, regEnd
d3d0: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65  );.    windowChe
d3e0: 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73  ckIntValue(pPars
d3f0: 65 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a 20  e, regEnd, 1);. 
d400: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
d410: 20 69 73 20 22 52 4f 57 53 20 3c 65 78 70 72 31   is "ROWS <expr1
d420: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
d430: 52 4f 57 53 20 3c 65 78 70 72 32 3e 20 46 4f 4c  ROWS <expr2> FOL
d440: 4c 4f 57 49 4e 47 22 2c 20 64 6f 3a 0a 20 20 2a  LOWING", do:.  *
d450: 2a 0a 20 20 2a 2a 20 20 20 69 66 28 20 72 65 67  *.  **   if( reg
d460: 45 6e 64 3c 72 65 67 53 74 61 72 74 20 29 7b 0a  End<regStart ){.
d470: 20 20 2a 2a 20 20 20 20 20 2f 2f 20 54 68 65 20    **     // The 
d480: 66 72 61 6d 65 20 61 6c 77 61 79 73 20 63 6f 6e  frame always con
d490: 73 69 73 74 73 20 6f 66 20 30 20 72 6f 77 73 0a  sists of 0 rows.
d4a0: 20 20 2a 2a 20 20 20 20 20 72 65 67 53 74 61 72    **     regStar
d4b0: 74 20 3d 20 72 65 67 53 69 7a 65 3b 0a 20 20 2a  t = regSize;.  *
d4c0: 2a 20 20 20 7d 0a 20 20 2a 2a 20 20 20 72 65 67  *   }.  **   reg
d4d0: 45 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d 20 72  End = regEnd - r
d4e0: 65 67 53 74 61 72 74 3b 0a 20 20 2a 2f 0a 20 20  egStart;.  */.  
d4f0: 69 66 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 20  if( pMWin->pEnd 
d500: 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  && pMWin->eStart
d510: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
d520: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
d530: 57 69 6e 2d 3e 70 53 74 61 72 74 21 3d 30 20 29  Win->pStart!=0 )
d540: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
d550: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
d560: 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 73  LLOWING );.    s
d570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
d580: 28 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53 74  (v, OP_Ge, regSt
d590: 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  art, sqlite3Vdbe
d5a0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
d5b0: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 56  , regEnd);.    V
d5c0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d5d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d5e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
d5f0: 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53 74  , regSize, regSt
d600: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
d610: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d620: 50 5f 53 75 62 74 72 61 63 74 2c 20 72 65 67 53  P_Subtract, regS
d630: 74 61 72 74 2c 20 72 65 67 45 6e 64 2c 20 72 65  tart, regEnd, re
d640: 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  gEnd);.  }..  if
d650: 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 20  ( pMWin->pStart 
d660: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
d670: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
d680: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
d690: 6e 2d 3e 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  n->pEnd!=0 );.  
d6a0: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
d6b0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43  >eStart==TK_PREC
d6c0: 45 44 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c  EDING );.    sql
d6d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d6e0: 2c 20 4f 50 5f 4c 65 2c 20 72 65 67 53 74 61 72  , OP_Le, regStar
d6f0: 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
d700: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 2c 20  rrentAddr(v)+3, 
d710: 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 56 64 62  regEnd);.    Vdb
d720: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d740: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
d750: 72 65 67 53 69 7a 65 2c 20 72 65 67 53 74 61 72  regSize, regStar
d760: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
d770: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d780: 43 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c 20 72  Copy, regSize, r
d790: 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f  egEnd);.  }..  /
d7a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
d7b0: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
d7c0: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
d7d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
d7e0: 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41  o NULL */.  regA
d7f0: 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41  rg = windowInitA
d800: 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57  ccum(pParse, pMW
d810: 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  in);..  sqlite3V
d820: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d830: 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69  Rewind, pMWin->i
d840: 45 70 68 43 73 72 2c 20 6c 62 6c 46 6c 75 73 68  EphCsr, lblFlush
d850: 44 6f 6e 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  Done);.  VdbeCov
d860: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
d870: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d880: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 53   OP_Rewind, csrS
d890: 74 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 44 6f  tart, lblFlushDo
d8a0: 6e 65 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  ne);.  VdbeCover
d8b0: 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
d8c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
d8d0: 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
d8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d8f0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
d900: 20 63 73 72 45 6e 64 2c 20 6c 62 6c 46 6c 75 73   csrEnd, lblFlus
d910: 68 44 6f 6e 65 29 3b 0a 20 20 56 64 62 65 43 6f  hDone);.  VdbeCo
d920: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
d930: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
d940: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29  beChangeP5(v, 1)
d950: 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 41  ;..  /* Invoke A
d960: 67 67 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 20  ggStep function 
d970: 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20  for each window 
d980: 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74  function using t
d990: 68 65 20 72 6f 77 20 74 68 61 74 0a 20 20 2a 2a  he row that.  **
d9a0: 20 63 73 72 45 6e 64 20 63 75 72 72 65 6e 74 6c   csrEnd currentl
d9b0: 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 4f 72 2c  y points to. Or,
d9c0: 20 69 66 20 63 73 72 45 6e 64 20 69 73 20 61 6c   if csrEnd is al
d9d0: 72 65 61 64 79 20 61 74 20 45 4f 46 2c 0a 20 20  ready at EOF,.  
d9e0: 2a 2a 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 20  ** do nothing.  
d9f0: 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
da00: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
da10: 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
da20: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
da30: 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20  PRECEDING ){.   
da40: 20 61 64 64 72 49 66 50 6f 73 31 20 3d 20 73 71   addrIfPos1 = sq
da50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
da60: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
da70: 45 6e 64 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20  End, 0 , 1);.   
da80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
da90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
daa0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dab0: 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c 20 73 71  Next, csrEnd, sq
dac0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
dad0: 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56 64  Addr(v)+2);.  Vd
dae0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
daf0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
db00: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
db10: 47 6f 74 6f 29 3b 0a 20 20 77 69 6e 64 6f 77 41  Goto);.  windowA
db20: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
db30: 4d 57 69 6e 2c 20 63 73 72 45 6e 64 2c 20 30 2c  MWin, csrEnd, 0,
db40: 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65   regArg, regSize
db50: 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
db60: 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
db70: 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
db80: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
db90: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54  P_Goto, 0, addrT
dba0: 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  op);.    sqlite3
dbb0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
dbc0: 61 64 64 72 29 3b 0a 20 20 20 20 61 64 64 72 54  addr);.    addrT
dbd0: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
dbe0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
dbf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
dc00: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
dc10: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 69  (v, addr);.    i
dc20: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
dc30: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
dc40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dc50: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
dc60: 72 49 66 50 6f 73 31 29 3b 0a 20 20 20 20 7d 0a  rIfPos1);.    }.
dc70: 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e    }..  if( pMWin
dc80: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f  ->eEnd==TK_FOLLO
dc90: 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72  WING ){.    addr
dca0: 49 66 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33  IfPos1 = sqlite3
dcb0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
dcc0: 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20  _IfPos, regEnd, 
dcd0: 30 20 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  0 , 1);.    Vdbe
dce0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
dcf0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53  .  if( pMWin->eS
dd00: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
dd10: 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66  NG ){.    addrIf
dd20: 50 6f 73 32 20 3d 20 73 71 6c 69 74 65 33 56 64  Pos2 = sqlite3Vd
dd30: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
dd40: 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c 20  fPos, regStart, 
dd50: 30 20 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65  0 , 1);.    Vdbe
dd60: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
dd70: 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61  .  windowAggFina
dd80: 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  l(pParse, pMWin,
dd90: 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 74   0);.  windowRet
dda0: 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65  urnOneRow(pParse
ddb0: 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75  , pMWin, regGosu
ddc0: 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
ddd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dde0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70  p2(v, OP_Next, p
ddf0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73  MWin->iEphCsr, s
de00: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
de10: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56  tAddr(v)+2);.  V
de20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
de30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de40: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
de50: 30 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29  0, lblFlushDone)
de60: 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ;.  if( pMWin->e
de70: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
de80: 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ING ){.    sqlit
de90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
dea0: 2c 20 61 64 64 72 49 66 50 6f 73 32 29 3b 0a 20  , addrIfPos2);. 
deb0: 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   }..  if( pMWin-
dec0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
ded0: 45 4e 54 20 0a 20 20 20 7c 7c 20 70 4d 57 69 6e  ENT .   || pMWin
dee0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45  ->eStart==TK_PRE
def0: 43 45 44 49 4e 47 20 0a 20 20 20 7c 7c 20 70 4d  CEDING .   || pM
df00: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
df10: 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 29 7b 0a  FOLLOWING .  ){.
df20: 20 20 20 20 69 6e 74 20 6c 62 6c 53 6b 69 70 49      int lblSkipI
df30: 6e 76 65 72 73 65 20 3d 20 73 71 6c 69 74 65 33  nverse = sqlite3
df40: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
df50: 3b 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  ;;.    if( pMWin
df60: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45  ->eStart==TK_PRE
df70: 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  CEDING ){.      
df80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
df90: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
dfa0: 65 67 53 74 61 72 74 2c 20 6c 62 6c 53 6b 69 70  egStart, lblSkip
dfb0: 49 6e 76 65 72 73 65 2c 20 31 29 3b 0a 20 20 20  Inverse, 1);.   
dfc0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
dfd0: 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  v);.    }.    if
dfe0: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
dff0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
e000: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e010: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
e020: 65 78 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73  ext, csrStart, s
e030: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
e040: 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20  tAddr(v)+2);.   
e050: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
e060: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
e070: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e080: 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 53 6b  P_Goto, 0, lblSk
e090: 69 70 49 6e 76 65 72 73 65 29 3b 0a 20 20 20 20  ipInverse);.    
e0a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
e0b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e0c0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74  , OP_Next, csrSt
e0d0: 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  art, sqlite3Vdbe
e0e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
e0f0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
e100: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
e110: 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65      windowAggSte
e120: 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  p(pParse, pMWin,
e130: 20 63 73 72 53 74 61 72 74 2c 20 31 2c 20 72 65   csrStart, 1, re
e140: 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a  gArg, regSize);.
e150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
e160: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
e170: 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 29 3b 0a  blSkipInverse);.
e180: 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d    }.  if( pMWin-
e190: 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  >eEnd==TK_FOLLOW
e1a0: 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ING ){.    sqlit
e1b0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e1c0: 2c 20 61 64 64 72 49 66 50 6f 73 31 29 3b 0a 20  , addrIfPos1);. 
e1d0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
e1e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
e1f0: 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  o, 0, addrTop);.
e200: 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70 61 72 74  .  /* flush_part
e210: 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a 2f 0a 20  ition_done: */. 
e220: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
e230: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46  lveLabel(v, lblF
e240: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73 71 6c  lushDone);.  sql
e250: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e260: 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
e270: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
e280: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
e290: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
e2a0: 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50 61 72  urn, regFlushPar
e2b0: 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  t);.  VdbeCommen
e2c0: 74 28 28 76 2c 20 22 65 6e 64 20 66 6c 75 73 68  t((v, "end flush
e2d0: 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62 72 6f  _partition subro
e2e0: 75 74 69 6e 65 22 29 29 3b 0a 0a 20 20 2f 2a 20  utine"));..  /* 
e2f0: 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f 20  Jump to here to 
e300: 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68 5f  skip over flush_
e310: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73  partition */.  s
e320: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
e330: 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b  re(v, addrGoto);
e340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
e350: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
e360: 20 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74 65 33   work of sqlite3
e370: 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29  WindowCodeStep()
e380: 20 66 6f 72 20 63 61 73 65 73 20 74 68 61 74 0a   for cases that.
e390: 2a 2a 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  ** would normall
e3a0: 79 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20  y be handled by 
e3b0: 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c  windowCodeDefaul
e3c0: 74 53 74 65 70 28 29 20 77 68 65 6e 20 74 68 65  tStep() when the
e3d0: 72 65 20 61 72 65 0a 2a 2a 20 6f 6e 65 20 6f 72  re are.** one or
e3e0: 20 6d 6f 72 65 20 62 75 69 6c 74 2d 69 6e 20 77   more built-in w
e3f0: 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20  indow-functions 
e400: 74 68 61 74 20 72 65 71 75 69 72 65 20 74 68 65  that require the
e410: 20 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f   entire partitio
e420: 6e 0a 2a 2a 20 74 6f 20 62 65 20 63 61 63 68 65  n.** to be cache
e430: 64 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c  d in a temp tabl
e440: 65 20 62 65 66 6f 72 65 20 61 6e 79 20 72 6f 77  e before any row
e450: 73 20 63 61 6e 20 62 65 20 72 65 74 75 72 6e 65  s can be returne
e460: 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2e  d. Additionally.
e470: 0a 2a 2a 20 22 52 41 4e 47 45 20 42 45 54 57 45  .** "RANGE BETWE
e480: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
e490: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
e4a0: 4c 4f 57 49 4e 47 22 20 69 73 20 61 6c 77 61 79  LOWING" is alway
e4b0: 73 20 68 61 6e 64 6c 65 64 20 62 79 0a 2a 2a 20  s handled by.** 
e4c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
e4d0: 2a 0a 2a 2a 20 50 73 65 75 64 6f 2d 63 6f 64 65  *.** Pseudo-code
e4e0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
e4f0: 6f 20 74 68 65 20 56 4d 20 63 6f 64 65 20 67 65  o the VM code ge
e500: 6e 65 72 61 74 65 64 20 62 79 20 74 68 69 73 20  nerated by this 
e510: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
e520: 65 61 63 68 20 74 79 70 65 20 6f 66 20 77 69 6e  each type of win
e530: 64 6f 77 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a  dow follows..**.
e540: 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e  ** RANGE BETWEEN
e550: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
e560: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
e570: 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75   ROW.**.**   flu
e580: 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a  sh_partition:.**
e590: 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20       Once {.**  
e5a0: 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45       OpenDup (iE
e5b0: 70 68 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64  phCsr -> csrLead
e5c0: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
e5d0: 20 20 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a    Integer ctr 0.
e5e0: 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  **     foreach r
e5f0: 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a 2a 2a  ow (csrLead){.**
e600: 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70         if( new p
e610: 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  eer ){.**       
e620: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
e630: 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ue).**         f
e640: 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69  or(i=0; i<ctr; i
e650: 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ++){.**         
e660: 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
e670: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e  b.**           N
e680: 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20  ext iEphCsr.**  
e690: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
e6a0: 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20      Integer ctr 
e6b0: 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20  0.**       }.** 
e6c0: 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63        AggStep (c
e6d0: 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 20  srLead).**      
e6e0: 20 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20 20   Incr ctr.**    
e6f0: 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67 67   }.**.**     Agg
e700: 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65  Final (xFinalize
e710: 29 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d 30  ).**     for(i=0
e720: 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a  ; i<ctr; i++){.*
e730: 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64  *       Gosub ad
e740: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
e750: 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a   Next iEphCsr.**
e760: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20       }.**.**    
e770: 20 52 65 73 65 74 53 6f 72 74 65 72 20 28 63 73   ResetSorter (cs
e780: 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e  r).**     Return
e790: 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  .**.** ROWS BETW
e7a0: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
e7b0: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
e7c0: 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20  ENT ROW.**.**   
e7d0: 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  As above, except
e7e0: 20 74 68 61 74 20 74 68 65 20 22 69 66 28 20 6e   that the "if( n
e7f0: 65 77 20 70 65 65 72 20 29 22 20 62 72 61 6e 63  ew peer )" branc
e800: 68 20 69 73 20 61 6c 77 61 79 73 20 74 61 6b 65  h is always take
e810: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42  n..**.** RANGE B
e820: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
e830: 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  OW AND CURRENT R
e840: 4f 57 20 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61  OW .**.**   As a
e850: 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61  bove, except tha
e860: 74 20 65 61 63 68 20 6f 66 20 74 68 65 20 66 6f  t each of the fo
e870: 72 28 29 20 6c 6f 6f 70 73 20 62 65 63 6f 6d 65  r() loops become
e880: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
e890: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
e8a0: 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
e8b0: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
e8c0: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  sub.**          
e8d0: 20 41 67 67 49 6e 76 65 72 73 65 20 28 69 45 70   AggInverse (iEp
e8e0: 68 43 73 72 29 0a 2a 2a 20 20 20 20 20 20 20 20  hCsr).**        
e8f0: 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a     Next iEphCsr.
e900: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  **         }.**.
e910: 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e  ** RANGE BETWEEN
e920: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
e930: 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44  DING AND UNBOUND
e940: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  ED FOLLOWING.**.
e950: 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69  **   flush_parti
e960: 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63  tion:.**     Onc
e970: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65  e {.**       Ope
e980: 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e  nDup (iEphCsr ->
e990: 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20   csrLead).**    
e9a0: 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63   }.**     foreac
e9b0: 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 20  h row (csrLead) 
e9c0: 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74  {.**       AggSt
e9d0: 65 70 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20  ep (csrLead).** 
e9e0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72      }.**     for
e9f0: 65 61 63 68 20 72 6f 77 20 28 69 45 70 68 43 73  each row (iEphCs
ea00: 72 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f  r) {.**       Go
ea10: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
ea20: 20 20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a 20 52 41       }.** .** RA
ea30: 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52  NGE BETWEEN CURR
ea40: 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f  ENT ROW AND UNBO
ea50: 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
ea60: 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61  **.**   flush_pa
ea70: 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20  rtition:.**     
ea80: 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Once {.**       
ea90: 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72  OpenDup (iEphCsr
eaa0: 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20   -> csrLead).** 
eab0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72      }.**     for
eac0: 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61  each row (csrLea
ead0: 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67  d){.**       Agg
eae0: 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a 2a  Step (csrLead).*
eaf0: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 52  *     }.**     R
eb00: 65 77 69 6e 64 20 28 63 73 72 4c 65 61 64 29 0a  ewind (csrLead).
eb10: 2a 2a 20 20 20 20 20 49 6e 74 65 67 65 72 20 63  **     Integer c
eb20: 74 72 20 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65  tr 0.**     fore
eb30: 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64  ach row (csrLead
eb40: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
eb50: 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20  new peer ){.**  
eb60: 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20         AggFinal 
eb70: 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20  (xValue).**     
eb80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63      for(i=0; i<c
eb90: 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20  tr; i++){.**    
eba0: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
ebb0: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
ebc0: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
ebd0: 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20  iEphCsr).**     
ebe0: 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43        Next iEphC
ebf0: 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  sr.**         }.
ec00: 2a 2a 20 20 20 20 20 20 20 20 20 49 6e 74 65 67  **         Integ
ec10: 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20  er ctr 0.**     
ec20: 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63    }.**       Inc
ec30: 72 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a  r ctr.**     }.*
ec40: 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61  *.**     AggFina
ec50: 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a  l (xFinalize).**
ec60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ec70: 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20  ctr; i++){.**   
ec80: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
ec90: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78  sub.**       Nex
eca0: 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20  t iEphCsr.**    
ecb0: 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73   }.**.**     Res
ecc0: 65 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a  etSorter (csr).*
ecd0: 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2f 0a  *     Return.*/.
ece0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
ecf0: 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65 70 28  owCodeCacheStep(
ed00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ed10: 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
ed20: 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
ed30: 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
ed40: 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
ed50: 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
ed60: 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
ed70: 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
ed80: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
ed90: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b  Parse);.  int k;
eda0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 45  .  int addr;.  E
edb0: 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d  xprList *pPart =
edc0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
edd0: 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  on;.  ExprList *
ede0: 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e  pOrderBy = pMWin
edf0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
ee00: 74 20 6e 50 65 65 72 20 3d 20 70 4f 72 64 65 72  t nPeer = pOrder
ee10: 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By ? pOrderBy->n
ee20: 45 78 70 72 20 3a 20 30 3b 0a 20 20 69 6e 74 20  Expr : 0;.  int 
ee30: 72 65 67 4e 65 77 50 65 65 72 3b 0a 0a 20 20 69  regNewPeer;..  i
ee40: 6e 74 20 61 64 64 72 47 6f 74 6f 3b 20 20 20 20  nt addrGoto;    
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee60: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 47 6f 74  * Address of Got
ee70: 6f 20 75 73 65 64 20 74 6f 20 6a 75 6d 70 20 66  o used to jump f
ee80: 6c 75 73 68 5f 70 61 72 2e 2e 20 2a 2f 0a 20 20  lush_par.. */.  
ee90: 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 20 20 20  int addrNext;   
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72  /* Jump here for
eec0: 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
eed0: 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  of loop */.  int
eee0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 3b 0a 20   regFlushPart;. 
eef0: 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72   int lblFlushPar
ef00: 74 3b 0a 20 20 69 6e 74 20 63 73 72 4c 65 61 64  t;.  int csrLead
ef10: 3b 0a 20 20 69 6e 74 20 72 65 67 43 74 72 3b 0a  ;.  int regCtr;.
ef20: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 20 20 20    int regArg;   
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 72    /* Register ar
ef50: 72 61 79 20 74 6f 20 6d 61 72 74 69 61 6c 20 66  ray to martial f
ef60: 75 6e 63 74 69 6f 6e 20 61 72 67 73 20 2a 2f 0a  unction args */.
ef70: 20 20 69 6e 74 20 72 65 67 53 69 7a 65 3b 0a 20    int regSize;. 
ef80: 20 69 6e 74 20 6c 62 6c 45 6d 70 74 79 3b 0a 20   int lblEmpty;. 
ef90: 20 69 6e 74 20 62 52 65 76 65 72 73 65 20 3d 20   int bReverse = 
efa0: 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20  pMWin->pOrderBy 
efb0: 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  && pMWin->eStart
efc0: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20  ==TK_CURRENT .  
efd0: 20 20 20 20 20 20 20 20 26 26 20 70 4d 57 69 6e          && pMWin
efe0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
eff0: 4e 44 45 44 3b 0a 0a 20 20 61 73 73 65 72 74 28  NDED;..  assert(
f000: 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
f010: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26  =TK_UNBOUNDED &&
f020: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
f030: 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 20 20 20  _CURRENT) .     
f040: 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
f050: 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
f060: 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
f070: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 20  ==TK_UNBOUNDED) 
f080: 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
f090: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
f0a0: 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e  RRENT && pMWin->
f0b0: 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
f0c0: 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  ) .       || (pM
f0d0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
f0e0: 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
f0f0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
f100: 4e 44 45 44 29 20 0a 20 20 29 3b 0a 0a 20 20 6c  NDED) .  );..  l
f110: 62 6c 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65  blEmpty = sqlite
f120: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
f130: 29 3b 0a 20 20 72 65 67 4e 65 77 50 65 65 72 20  );.  regNewPeer 
f140: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
f150: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
f160: 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a 20 20 2f 2a   += nPeer;..  /*
f170: 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74   Allocate regist
f180: 65 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f 72  er and label for
f190: 20 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72 74   the "flush_part
f1a0: 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74 69  ition" sub-routi
f1b0: 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75 73  ne. */.  regFlus
f1c0: 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  hPart = ++pParse
f1d0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75  ->nMem;.  lblFlu
f1e0: 73 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65 33  shPart = sqlite3
f1f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
f200: 3b 0a 0a 20 20 63 73 72 4c 65 61 64 20 3d 20 70  ;..  csrLead = p
f210: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
f220: 20 72 65 67 43 74 72 20 3d 20 2b 2b 70 50 61 72   regCtr = ++pPar
f230: 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e  se->nMem;..  win
f240: 64 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68  dowPartitionCach
f250: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57 49  e(pParse, p, pWI
f260: 6e 66 6f 2c 20 72 65 67 46 6c 75 73 68 50 61 72  nfo, regFlushPar
f270: 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c  t, lblFlushPart,
f280: 20 26 72 65 67 53 69 7a 65 29 3b 0a 20 20 61 64   &regSize);.  ad
f290: 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
f2a0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
f2b0: 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74  _Goto);..  /* St
f2c0: 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f 70 61  art of "flush_pa
f2d0: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 73 71  rtition" */.  sq
f2e0: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
f2f0: 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c 75 73  Label(v, lblFlus
f300: 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65  hPart);.  sqlite
f310: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f320: 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c 69 74  P_Once, 0, sqlit
f330: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
f340: 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43  r(v)+2);.  VdbeC
f350: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
f360: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f370: 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63  v, OP_OpenDup, c
f380: 73 72 4c 65 61 64 2c 20 70 4d 57 69 6e 2d 3e 69  srLead, pMWin->i
f390: 45 70 68 43 73 72 29 3b 0a 0a 20 20 2f 2a 20 49  EphCsr);..  /* I
f3a0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 63  nitialize the ac
f3b0: 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
f3c0: 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  er for each wind
f3d0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 4e  ow function to N
f3e0: 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41 72 67 20  ULL */.  regArg 
f3f0: 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63 63 75  = windowInitAccu
f400: 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 29  m(pParse, pMWin)
f410: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
f420: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
f430: 65 67 65 72 2c 20 30 2c 20 72 65 67 43 74 72 29  eger, 0, regCtr)
f440: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f450: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
f460: 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20 6c 62 6c  nd, csrLead, lbl
f470: 45 6d 70 74 79 29 3b 0a 20 20 56 64 62 65 43 6f  Empty);.  VdbeCo
f480: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
f490: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f4a0: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57  , OP_Rewind, pMW
f4b0: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c  in->iEphCsr, lbl
f4c0: 45 6d 70 74 79 29 3b 0a 20 20 56 64 62 65 43 6f  Empty);.  VdbeCo
f4d0: 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e  verageNeverTaken
f4e0: 28 76 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76  (v);..  if( bRev
f4f0: 65 72 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  erse ){.    int 
f500: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
f510: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
f520: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67  );.    windowAgg
f530: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
f540: 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20 30 2c 20  in, csrLead, 0, 
f550: 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29  regArg, regSize)
f560: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f570: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
f580: 78 74 2c 20 63 73 72 4c 65 61 64 2c 20 61 64 64  xt, csrLead, add
f590: 72 32 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  r2);.    VdbeCov
f5a0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
f5b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f5c0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73  v, OP_Rewind, cs
f5d0: 72 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74 79 29  rLead, lblEmpty)
f5e0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
f5f0: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
f600: 0a 20 20 7d 0a 20 20 61 64 64 72 4e 65 78 74 20  .  }.  addrNext 
f610: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
f620: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
f630: 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20  if( pOrderBy && 
f640: 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b  (pMWin->eEnd==TK
f650: 5f 43 55 52 52 45 4e 54 20 7c 7c 20 70 4d 57 69  _CURRENT || pMWi
f660: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
f670: 52 52 45 4e 54 29 20 29 7b 0a 20 20 20 20 69 6e  RRENT) ){.    in
f680: 74 20 62 43 75 72 72 65 6e 74 20 3d 20 28 70 4d  t bCurrent = (pM
f690: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
f6a0: 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20 69 6e  CURRENT);.    in
f6b0: 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 20  t addrJump = 0; 
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f6d0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4a 75 6d  ddress of OP_Jum
f6e0: 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 69  p below */.    i
f6f0: 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d  f( pMWin->eType=
f700: 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  =TK_RANGE ){.   
f710: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4d     int iOff = pM
f720: 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20  Win->nBufferCol 
f730: 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61 72 74  + (pPart ? pPart
f740: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
f750: 20 20 20 20 69 6e 74 20 72 65 67 50 65 65 72 20      int regPeer 
f760: 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  = pMWin->regPart
f770: 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61 72   + (pPart ? pPar
f780: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
f790: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
f7a0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
f7b0: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
f7c0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
f7d0: 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  erBy, 0, 0);.   
f7e0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 50     for(k=0; k<nP
f7f0: 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  eer; k++){.     
f800: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f810: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
f820: 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69 4f 66 66  n, csrLead, iOff
f830: 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65 72 2b 6b  +k, regNewPeer+k
f840: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f850: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
f860: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
f870: 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
f880: 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50  eer, regPeer, nP
f890: 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eer);.      sqli
f8a0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
f8b0: 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
f8c0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
f8d0: 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20  .      addrJump 
f8e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f8f0: 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
f900: 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
f910: 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
f920: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
f930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f940: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
f950: 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67 50 65  egNewPeer, regPe
f960: 65 72 2c 20 6e 50 65 65 72 2d 31 29 3b 0a 20 20  er, nPeer-1);.  
f970: 20 20 7d 0a 0a 20 20 20 20 77 69 6e 64 6f 77 52    }..    windowR
f980: 65 74 75 72 6e 52 6f 77 73 28 70 50 61 72 73 65  eturnRows(pParse
f990: 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43 74 72 2c  , pMWin, regCtr,
f9a0: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
f9b0: 6f 73 75 62 2c 20 0a 20 20 20 20 20 20 20 20 28  osub, .        (
f9c0: 62 43 75 72 72 65 6e 74 20 3f 20 72 65 67 41 72  bCurrent ? regAr
f9d0: 67 20 3a 20 30 29 2c 20 28 62 43 75 72 72 65 6e  g : 0), (bCurren
f9e0: 74 20 3f 20 72 65 67 53 69 7a 65 20 3a 20 30 29  t ? regSize : 0)
f9f0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
fa00: 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c 69 74  addrJump ) sqlit
fa10: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
fa20: 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20 7d  , addrJump);.  }
fa30: 0a 0a 20 20 69 66 28 20 62 52 65 76 65 72 73 65  ..  if( bReverse
fa40: 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 64 6f  ==0 ){.    windo
fa50: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
fa60: 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c   pMWin, csrLead,
fa70: 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53   0, regArg, regS
fa80: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ize);.  }.  sqli
fa90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
faa0: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65 67 43   OP_AddImm, regC
fab0: 74 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  tr, 1);.  sqlite
fac0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fad0: 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61 64 2c  P_Next, csrLead,
fae0: 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 56 64   addrNext);.  Vd
faf0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
fb00: 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f    windowReturnRo
fb10: 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ws(pParse, pMWin
fb20: 2c 20 72 65 67 43 74 72 2c 20 72 65 67 47 6f 73  , regCtr, regGos
fb30: 75 62 2c 20 61 64 64 72 47 6f 73 75 62 2c 20 30  ub, addrGosub, 0
fb40: 2c 20 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  , 0);..  sqlite3
fb50: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
fb60: 28 76 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20  (v, lblEmpty);. 
fb70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb80: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
fb90: 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rter, pMWin->iEp
fba0: 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  hCsr);.  sqlite3
fbb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
fbc0: 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73  _Return, regFlus
fbd0: 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a 20 4a 75  hPart);..  /* Ju
fbe0: 6d 70 20 74 6f 20 68 65 72 65 20 74 6f 20 73 6b  mp to here to sk
fbf0: 69 70 20 6f 76 65 72 20 66 6c 75 73 68 5f 70 61  ip over flush_pa
fc00: 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  rtition */.  sql
fc10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fc20: 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 7d  (v, addrGoto);.}
fc30: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47 45 20 42  .../*.** RANGE B
fc40: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
fc50: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
fc60: 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a  URRENT ROW.**.**
fc70: 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 69 66     ....**     if
fc80: 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  ( new partition 
fc90: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46  ){.**       AggF
fca0: 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29  inal (xFinalize)
fcb0: 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
fcc0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
fcd0: 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 65     ResetSorter e
fce0: 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ph-table.**     
fcf0: 7d 0a 2a 2a 20 20 20 20 20 65 6c 73 65 20 69 66  }.**     else if
fd00: 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a  ( new peer ){.**
fd10: 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20         AggFinal 
fd20: 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20  (xValue).**     
fd30: 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75    Gosub addrGosu
fd40: 62 0a 2a 2a 20 20 20 20 20 20 20 52 65 73 65 74  b.**       Reset
fd50: 53 6f 72 74 65 72 20 65 70 68 2d 74 61 62 6c 65  Sorter eph-table
fd60: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
fd70: 20 41 67 67 53 74 65 70 0a 2a 2a 20 20 20 20 20   AggStep.**     
fd80: 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64 20 69  Insert (record i
fd90: 6e 74 6f 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a  nto eph-table).*
fda0: 2a 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  *   sqlite3Where
fdb0: 45 6e 64 28 29 0a 2a 2a 20 20 20 41 67 67 46 69  End().**   AggFi
fdc0: 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a  nal (xFinalize).
fdd0: 2a 2a 20 20 20 47 6f 73 75 62 20 61 64 64 72 47  **   Gosub addrG
fde0: 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45  osub.**.** RANGE
fdf0: 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
fe00: 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
fe10: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
fe20: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20  WING.**.**   As 
fe30: 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 61  above, except ta
fe40: 6b 65 20 6e 6f 20 61 63 74 69 6f 6e 20 66 6f 72  ke no action for
fe50: 20 61 20 22 6e 65 77 20 70 65 65 72 22 2e 20 49   a "new peer". I
fe60: 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74 68 65 20 73  nvoke.**   the s
fe70: 75 62 2d 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  ub-routine once 
fe80: 6f 6e 6c 79 20 66 6f 72 20 65 61 63 68 20 70 61  only for each pa
fe90: 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52  rtition..**.** R
fea0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52  ANGE BETWEEN CUR
feb0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52  RENT ROW AND CUR
fec0: 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20  RENT ROW.**.**  
fed0: 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   As above, excep
fee0: 74 20 74 68 61 74 20 74 68 65 20 22 6e 65 77 20  t that the "new 
fef0: 70 65 65 72 22 20 63 6f 6e 64 69 74 69 6f 6e 20  peer" condition 
ff00: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 74 68  is handled in th
ff10: 65 0a 2a 2a 20 20 20 73 61 6d 65 20 77 61 79 20  e.**   same way 
ff20: 61 73 20 22 6e 65 77 20 70 61 72 74 69 74 69 6f  as "new partitio
ff30: 6e 22 20 28 73 6f 20 74 68 65 72 65 20 69 73 20  n" (so there is 
ff40: 6e 6f 20 22 65 6c 73 65 20 69 66 22 20 62 6c 6f  no "else if" blo
ff50: 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20  ck)..**.** ROWS 
ff60: 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
ff70: 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
ff80: 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 0a  CURRENT ROW.** .
ff90: 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65  **   As above, e
ffa0: 78 63 65 70 74 20 61 73 73 75 6d 65 20 65 76 65  xcept assume eve
ffb0: 72 79 20 72 6f 77 20 69 73 20 61 20 22 6e 65 77  ry row is a "new
ffc0: 20 70 65 65 72 22 2e 0a 2a 2f 0a 73 74 61 74 69   peer"..*/.stati
ffd0: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64  c void windowCod
ffe0: 65 44 65 66 61 75 6c 74 53 74 65 70 28 0a 20 20  eDefaultStep(.  
fff0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
10000 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57    Select *p,.  W
10010 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
10020 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ,.  int regGosub
10030 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  , .  int addrGos
10040 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ub.){.  Window *
10050 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
10060 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
10070 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
10080 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20  se);.  int k;.  
10090 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20 70 2d  int iSubCsr = p-
100a0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72  >pSrc->a[0].iCur
100b0 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20  sor;.  int nSub 
100c0 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
100d0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e  pTab->nCol;.  in
100e0 74 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  t reg = pParse->
100f0 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72 65  nMem+1;.  int re
10100 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e 53  gRecord = reg+nS
10110 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  ub;.  int regRow
10120 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b 31  id = regRecord+1
10130 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
10140 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20  ExprList *pPart 
10150 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  = pMWin->pPartit
10160 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ion;.  ExprList 
10170 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57 69  *pOrderBy = pMWi
10180 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  n->pOrderBy;..  
10190 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
101a0 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 0a  Type==TK_RANGE .
101b0 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d        || (pMWin-
101c0 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f  >eStart==TK_UNBO
101d0 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e  UNDED && pMWin->
101e0 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
101f0 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ).  );..  assert
10200 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  ( (pMWin->eStart
10210 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26  ==TK_UNBOUNDED &
10220 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
10230 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 20 20 20  K_CURRENT).     
10240 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
10250 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
10260 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
10270 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 0a  ==TK_UNBOUNDED).
10280 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e         || (pMWin
10290 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
102a0 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65  RENT && pMWin->e
102b0 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  End==TK_CURRENT)
102c0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69  .       || (pMWi
102d0 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
102e0 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e  RRENT && pMWin->
102f0 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
10300 45 44 20 26 26 20 21 70 4f 72 64 65 72 42 79 29  ED && !pOrderBy)
10310 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 57  .  );..  if( pMW
10320 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
10330 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 70 4f  OUNDED ){.    pO
10340 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
10350 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
10360 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20 20  += nSub + 2;..  
10370 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20 72  /* Martial the r
10380 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ow returned by t
10390 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  he sub-select in
103a0 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 0a  to an array of .
103b0 20 20 2a 2a 20 72 65 67 69 73 74 65 72 73 2e 20    ** registers. 
103c0 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
103d0 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  nSub; k++){.    
103e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
103f0 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
10400 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b  iSubCsr, k, reg+
10410 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  k);.  }..  /* Ch
10420 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74  eck if this is t
10430 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65  he start of a ne
10440 77 20 70 61 72 74 69 74 69 6f 6e 20 6f 72 20 70  w partition or p
10450 65 65 72 20 67 72 6f 75 70 2e 20 2a 2f 0a 20 20  eer group. */.  
10460 69 66 28 20 70 50 61 72 74 20 7c 7c 20 70 4f 72  if( pPart || pOr
10470 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74  derBy ){.    int
10480 20 6e 50 61 72 74 20 3d 20 28 70 50 61 72 74 20   nPart = (pPart 
10490 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a  ? pPart->nExpr :
104a0 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64   0);.    int add
104b0 72 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20 69  rGoto = 0;.    i
104c0 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b  nt addrJump = 0;
104d0 0a 20 20 20 20 69 6e 74 20 6e 50 65 65 72 20 3d  .    int nPeer =
104e0 20 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72   (pOrderBy ? pOr
104f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  derBy->nExpr : 0
10500 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72  );..    if( pPar
10510 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  t ){.      int r
10520 65 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20  egNewPart = reg 
10530 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  + pMWin->nBuffer
10540 43 6f 6c 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  Col;.      KeyIn
10550 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73  fo *pKeyInfo = s
10560 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f  qlite3KeyInfoFro
10570 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
10580 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a  , pPart, 0, 0);.
10590 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
105a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
105b0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65  , OP_Compare, re
105c0 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d  gNewPart, pMWin-
105d0 3e 72 65 67 50 61 72 74 2c 6e 50 61 72 74 29 3b  >regPart,nPart);
105e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
105f0 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
10600 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
10610 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
10620 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c    addrJump = sql
10630 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
10640 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b  , OP_Jump, addr+
10650 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20  2, 0, addr+2);. 
10660 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
10670 65 28 76 29 3b 0a 20 20 20 20 20 20 77 69 6e 64  e(v);.      wind
10680 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73  owAggFinal(pPars
10690 65 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20 20  e, pMWin, 1);.  
106a0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
106b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72   ){.        addr
106c0 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
106d0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
106e0 6f 74 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oto);.      }.  
106f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 72    }..    if( pOr
10700 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
10710 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20 3d 20  nt regNewPeer = 
10720 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75  reg + pMWin->nBu
10730 66 66 65 72 43 6f 6c 20 2b 20 6e 50 61 72 74 3b  fferCol + nPart;
10740 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 65  .      int regPe
10750 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50  er = pMWin->regP
10760 61 72 74 20 2b 20 6e 50 61 72 74 3b 0a 0a 20 20  art + nPart;..  
10770 20 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d 70      if( addrJump
10780 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
10790 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75  mpHere(v, addrJu
107a0 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  mp);.      if( p
107b0 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f  MWin->eType==TK_
107c0 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 20  RANGE ){.       
107d0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
107e0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
107f0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
10800 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
10810 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
10820 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
10830 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10840 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
10850 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50  eer, regPeer, nP
10860 65 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eer);.        sq
10870 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
10880 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
10890 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
108a0 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a  );.        addrJ
108b0 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ump = sqlite3Vdb
108c0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
108d0 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61  mp, addr+2, 0, a
108e0 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 20 20  ddr+2);.        
108f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10900 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10910 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d        addrJump =
10920 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
10930 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
10940 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
10950 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
10960 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20  K_CURRENT);.    
10970 20 20 69 66 28 20 61 64 64 72 47 6f 74 6f 20 29    if( addrGoto )
10980 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
10990 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f  Here(v, addrGoto
109a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  );.    }..    sq
109b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
109c0 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d  v, OP_Rewind, pM
109d0 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71 6c  Win->iEphCsr,sql
109e0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
109f0 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20 20 56  ddr(v)+3);.    V
10a00 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10a10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10a20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
10a30 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  b, regGosub, add
10a40 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 73 71 6c  rGosub);.    sql
10a50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10a60 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e  , OP_Next, pMWin
10a70 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74  ->iEphCsr, sqlit
10a80 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10a90 72 28 76 29 2d 31 29 3b 0a 20 20 20 20 56 64 62  r(v)-1);.    Vdb
10aa0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
10ab0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10ac0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
10ad0 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69  Sorter, pMWin->i
10ae0 45 70 68 43 73 72 29 3b 0a 20 20 20 20 73 71 6c  EphCsr);.    sql
10af0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 0a  ite3VdbeAddOp3(.
10b00 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f 43 6f          v, OP_Co
10b10 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e 2d 3e 6e  py, reg+pMWin->n
10b20 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d 57 69 6e  BufferCol, pMWin
10b30 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74  ->regPart, nPart
10b40 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20 29 3b 0a  +nPeer-1.    );.
10b50 0a 20 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d  .    if( addrJum
10b60 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  p ) sqlite3VdbeJ
10b70 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a  umpHere(v, addrJ
10b80 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ump);.  }..  /* 
10b90 49 6e 76 6f 6b 65 20 73 74 65 70 20 66 75 6e 63  Invoke step func
10ba0 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64 6f 77 20  tion for window 
10bb0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 77  functions */.  w
10bc0 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
10bd0 72 73 65 2c 20 70 4d 57 69 6e 2c 20 2d 31 2c 20  rse, pMWin, -1, 
10be0 30 2c 20 72 65 67 2c 20 30 29 3b 0a 0a 20 20 2f  0, reg, 0);..  /
10bf0 2a 20 42 75 66 66 65 72 20 74 68 65 20 63 75 72  * Buffer the cur
10c00 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68 65 20  rent row in the 
10c10 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e  ephemeral table.
10c20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
10c30 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30 20 29 7b  >nBufferCol>0 ){
10c40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10c50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
10c60 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20 70 4d  eRecord, reg, pM
10c70 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 2c  Win->nBufferCol,
10c80 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 7d   regRecord);.  }
10c90 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
10ca0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10cb0 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65 67 52 65  P_Blob, 0, regRe
10cc0 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  cord);.    sqlit
10cd0 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
10ce0 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20 30 29 3b  , (void*)"", 0);
10cf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
10d00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
10d10 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e 2d 3e  ewRowid, pMWin->
10d20 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f 77 69  iEphCsr, regRowi
10d30 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
10d40 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
10d50 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  sert, pMWin->iEp
10d60 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  hCsr, regRecord,
10d70 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f   regRowid);..  /
10d80 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
10d90 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 20 2a 2f  se scan loop. */
10da0 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
10db0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 77  nd(pWInfo);..  w
10dc0 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
10dd0 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29 3b  arse, pMWin, 1);
10de0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10df0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
10e00 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
10e10 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  r,sqlite3VdbeCur
10e20 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
10e30 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
10e40 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10e50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
10e60 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  ub, regGosub, ad
10e70 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69  drGosub);.  sqli
10e80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10e90 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d   OP_Next, pMWin-
10ea0 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65  >iEphCsr, sqlite
10eb0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
10ec0 28 76 29 2d 31 29 3b 0a 20 20 56 64 62 65 43 6f  (v)-1);.  VdbeCo
10ed0 76 65 72 61 67 65 28 76 29 3b 0a 7d 0a 0a 2f 2a  verage(v);.}../*
10ee0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
10ef0 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c 69 63   return a duplic
10f00 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e 64 6f  ate of the Windo
10f10 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63 61 74  w object indicat
10f20 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74 68 69  ed by the.** thi
10f30 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53 65 74  rd argument. Set
10f40 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f 77 6e   the Window.pOwn
10f50 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  er field of the 
10f60 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a  new object to.**
10f70 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69 6e 64   pOwner..*/.Wind
10f80 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f  ow *sqlite3Windo
10f90 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  wDup(sqlite3 *db
10fa0 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72 2c 20  , Expr *pOwner, 
10fb0 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57 69  Window *p){.  Wi
10fc0 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ndow *pNew = 0;.
10fd0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
10fe0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
10ff0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
11000 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20  zeof(Window));. 
11010 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
11020 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65       pNew->zName
11030 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
11040 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29  up(db, p->zName)
11050 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 46  ;.      pNew->pF
11060 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 45  ilter = sqlite3E
11070 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 46  xprDup(db, p->pF
11080 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  ilter, 0);.     
11090 20 70 4e 65 77 2d 3e 70 50 61 72 74 69 74 69 6f   pNew->pPartitio
110a0 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  n = sqlite3ExprL
110b0 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50  istDup(db, p->pP
110c0 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20  artition, 0);.  
110d0 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72      pNew->pOrder
110e0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
110f0 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70  ListDup(db, p->p
11100 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
11110 20 20 20 70 4e 65 77 2d 3e 65 54 79 70 65 20 3d     pNew->eType =
11120 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20   p->eType;.     
11130 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d   pNew->eEnd = p-
11140 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65  >eEnd;.      pNe
11150 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65  w->eStart = p->e
11160 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65  Start;.      pNe
11170 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69  w->pStart = sqli
11180 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
11190 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  ->pStart, 0);.  
111a0 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20 3d      pNew->pEnd =
111b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
111c0 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b  db, p->pEnd, 0);
111d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 77  .      pNew->pOw
111e0 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20 20  ner = pOwner;.  
111f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11200 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
11210 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  Return a copy of
11220 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
11230 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63   of Window objec
11240 74 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ts passed as the
11250 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  .** second argum
11260 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a  ent..*/.Window *
11270 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73  sqlite3WindowLis
11280 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  tDup(sqlite3 *db
11290 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20  , Window *p){.  
112a0 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
112b0 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20 30  Window *pRet = 0
112c0 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70 20  ;.  Window **pp 
112d0 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72 28  = &pRet;..  for(
112e0 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70 57  pWin=p; pWin; pW
112f0 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69  in=pWin->pNextWi
11300 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71  n){.    *pp = sq
11310 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64  lite3WindowDup(d
11320 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20 20  b, 0, pWin);.   
11330 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20 62 72   if( *pp==0 ) br
11340 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26 28  eak;.    pp = &(
11350 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e 29  (*pp)->pNextWin)
11360 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
11370 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73  pRet;.}../*.** s
11380 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
11390 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  () has already b
113a0 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  een called for t
113b0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
113c0 65 6e 74 20 0a 2a 2a 20 70 61 73 73 65 64 20 61  ent .** passed a
113d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
113e0 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 69 73 20  ument when this 
113f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
11400 6b 65 64 2e 20 49 74 20 67 65 6e 65 72 61 74 65  ked. It generate
11410 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 70 6f 70  s.** code to pop
11420 75 6c 61 74 65 20 74 68 65 20 57 69 6e 64 6f 77  ulate the Window
11430 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67 69 73  .regResult regis
11440 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e  ter for each win
11450 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  dow function and
11460 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 73  .** invoke the s
11470 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 69 6e  ub-routine at in
11480 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 47 6f  struction addrGo
11490 73 75 62 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  sub once for eac
114a0 68 20 72 6f 77 2e 0a 2a 2a 20 54 68 69 73 20 66  h row..** This f
114b0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71  unction calls sq
114c0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
114d0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
114e0 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
114f0 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
11500 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
11510 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
11520 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
11530 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
11540 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77            /* Rew
11560 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74  ritten SELECT st
11570 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65  atement */.  Whe
11580 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115a0 43 6f 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64  Context returned
115b0 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
115c0 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  Begin() */.  int
115d0 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20   regGosub,      
115e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
115f0 52 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f  Register for OP_
11600 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61  Gosub */.  int a
11610 64 64 72 47 6f 73 75 62 20 20 20 20 20 20 20 20  ddrGosub        
11620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50             /* OP
11630 5f 47 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72  _Gosub here to r
11640 65 74 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a  eturn each row *
11650 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  /.){.  Window *p
11660 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a  MWin = p->pWin;.
11670 0a 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20  .  /* There are 
11680 74 68 72 65 65 20 64 69 66 66 65 72 65 6e 74 20  three different 
11690 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  functions that m
116a0 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 64 6f  ay be used to do
116b0 20 74 68 65 20 77 6f 72 6b 0a 20 20 2a 2a 20 6f   the work.  ** o
116c0 66 20 74 68 69 73 20 6f 6e 65 2c 20 64 65 70 65  f this one, depe
116d0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 77 69 6e  nding on the win
116e0 64 6f 77 20 66 72 61 6d 65 20 61 6e 64 20 74 68  dow frame and th
116f0 65 20 73 70 65 63 69 66 69 63 20 62 75 69 6c 74  e specific built
11700 2d 69 6e 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 20  -in.  ** window 
11710 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 28  functions used (
11720 69 66 20 61 6e 79 29 2e 0a 20 20 2a 2a 0a 20 20  if any)..  **.  
11730 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77  ** windowCodeRow
11740 45 78 70 72 53 74 65 70 28 29 20 68 61 6e 64 6c  ExprStep() handl
11750 65 73 20 61 6c 6c 20 22 52 4f 57 53 22 20 77 69  es all "ROWS" wi
11760 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20 65 78 63  ndow frames, exc
11770 65 70 74 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20  ept for:.  **.  
11780 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45  **   ROWS BETWEE
11790 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
117a0 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
117b0 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20  T ROW.  **.  ** 
117c0 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
117d0 20 62 65 63 61 75 73 65 20 77 69 6e 64 6f 77 43   because windowC
117e0 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 29  odeRowExprStep()
117f0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6c 6c 20   implements all 
11800 77 69 6e 64 6f 77 0a 20 20 2a 2a 20 66 72 61 6d  window.  ** fram
11810 65 20 74 79 70 65 73 20 62 79 20 63 61 63 68 69  e types by cachi
11820 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  ng the entire pa
11830 72 74 69 74 69 6f 6e 20 69 6e 20 61 20 74 65 6d  rtition in a tem
11840 70 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20 20 2a  p table, and.  *
11850 2a 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20  * "ROWS BETWEEN 
11860 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
11870 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
11880 52 4f 57 22 20 69 73 20 65 61 73 79 20 65 6e 6f  ROW" is easy eno
11890 75 67 68 20 74 6f 0a 20 20 2a 2a 20 69 6d 70 6c  ugh to.  ** impl
118a0 65 6d 65 6e 74 20 77 69 74 68 6f 75 74 20 73 75  ement without su
118b0 63 68 20 61 20 63 61 63 68 65 2e 0a 20 20 2a 2a  ch a cache..  **
118c0 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65  .  ** windowCode
118d0 43 61 63 68 65 53 74 65 70 28 29 20 69 73 20 75  CacheStep() is u
118e0 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20  sed for:.  **.  
118f0 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
11900 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41  EN CURRENT ROW A
11910 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
11920 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a  LOWING.  **.  **
11930 20 49 74 20 69 73 20 61 6c 73 6f 20 75 73 65 64   It is also used
11940 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 20 6e 6f   for anything no
11950 74 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69 6e  t handled by win
11960 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74  dowCodeRowExprSt
11970 65 70 28 29 20 0a 20 20 2a 2a 20 74 68 61 74 20  ep() .  ** that 
11980 69 6e 76 6f 6b 65 73 20 61 20 62 75 69 6c 74 2d  invokes a built-
11990 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
119a0 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73  on that requires
119b0 20 74 68 65 20 65 6e 74 69 72 65 20 0a 20 20 2a   the entire .  *
119c0 2a 20 70 61 72 74 69 74 69 6f 6e 20 74 6f 20 62  * partition to b
119d0 65 20 63 61 63 68 65 64 20 69 6e 20 61 20 74 65  e cached in a te
119e0 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20  mp table before 
119f0 61 6e 79 20 72 6f 77 73 20 61 72 65 20 72 65 74  any rows are ret
11a00 75 72 6e 65 64 0a 20 20 2a 2a 20 28 65 2e 67 2e  urned.  ** (e.g.
11a10 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 6f 72 20   nth_value() or 
11a20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28 29 29 2e  percent_rank()).
11a30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 6e 61 6c  .  **.  ** Final
11a40 6c 79 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65  ly, assuming the
11a50 72 65 20 69 73 20 6e 6f 20 62 75 69 6c 74 2d 69  re is no built-i
11a60 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
11a70 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a  n that requires.
11a80 20 20 2a 2a 20 74 68 65 20 70 61 72 74 69 74 69    ** the partiti
11a90 6f 6e 20 74 6f 20 62 65 20 63 61 63 68 65 64 2c  on to be cached,
11aa0 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75   windowCodeDefau
11ab0 6c 74 53 74 65 70 28 29 20 69 73 20 75 73 65 64  ltStep() is used
11ac0 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   for:.  **.  ** 
11ad0 20 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20    RANGE BETWEEN 
11ae0 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
11af0 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
11b00 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52 41 4e 47  ROW .  **   RANG
11b10 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
11b20 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
11b30 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
11b40 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 52 41 4e  OWING.  **   RAN
11b50 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  GE BETWEEN CURRE
11b60 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45  NT ROW AND CURRE
11b70 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52  NT ROW .  **   R
11b80 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
11b90 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
11ba0 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  AND CURRENT ROW.
11bb0 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77    **.  ** window
11bc0 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
11bd0 29 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 6f 6e  ) is the only on
11be0 65 20 6f 66 20 74 68 65 20 74 68 72 65 65 20 66  e of the three f
11bf0 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 20 20  unctions that.  
11c00 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 61 63 68  ** does not cach
11c10 65 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e  e each partition
11c20 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65   in a temp table
11c30 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
11c40 67 20 74 6f 0a 20 20 2a 2a 20 72 65 74 75 72 6e  g to.  ** return
11c50 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   rows..  */.  if
11c60 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d  ( pMWin->eType==
11c70 54 4b 5f 52 4f 57 53 20 0a 20 20 20 26 26 20 28  TK_ROWS .   && (
11c80 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54  pMWin->eStart!=T
11c90 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c 7c 70 4d 57  K_UNBOUNDED||pMW
11ca0 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43 55 52  in->eEnd!=TK_CUR
11cb0 52 45 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e 70 4f  RENT||!pMWin->pO
11cc0 72 64 65 72 42 79 29 0a 20 20 29 7b 0a 20 20 20  rderBy).  ){.   
11cd0 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78   windowCodeRowEx
11ce0 70 72 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  prStep(pParse, p
11cf0 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73  , pWInfo, regGos
11d00 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
11d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 57 69 6e    }else{.    Win
11d20 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20 69  dow *pWin;.    i
11d30 6e 74 20 62 43 61 63 68 65 20 3d 20 30 3b 20 20  nt bCache = 0;  
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d50 54 72 75 65 20 74 6f 20 75 73 65 20 43 61 63 68  True to use Cach
11d60 65 53 74 65 70 28 29 20 2a 2f 0a 0a 20 20 20 20  eStep() */..    
11d70 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
11d80 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26  t==TK_CURRENT &&
11d90 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
11da0 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
11db0 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b 0a      bCache = 1;.
11dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11dd0 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b   for(pWin=pMWin;
11de0 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
11df0 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
11e00 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46       FuncDef *pF
11e10 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e  unc = pWin->pFun
11e20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  c;.        if( (
11e30 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
11e40 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57   & SQLITE_FUNC_W
11e50 49 4e 44 4f 57 5f 53 49 5a 45 29 0a 20 20 20 20  INDOW_SIZE).    
11e60 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
11e70 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
11e80 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 7c  Name).         |
11e90 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  | (pFunc->zName=
11ea0 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
11eb0 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  ).         || (p
11ec0 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61  Func->zName==lea
11ed0 64 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  dName).         
11ee0 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  || (pFunc->zName
11ef0 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20 20 20  ==lagName).     
11f00 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
11f10 62 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20  bCache = 1;.    
11f20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11f40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 68     }..    /* Oth
11f50 65 72 77 69 73 65 2c 20 63 61 6c 6c 20 77 69 6e  erwise, call win
11f60 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74  dowCodeDefaultSt
11f70 65 70 28 29 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ep().  */.    if
11f80 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20 20 20  ( bCache ){.    
11f90 20 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68    windowCodeCach
11fa0 65 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c  eStep(pParse, p,
11fb0 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75   pWInfo, regGosu
11fc0 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
11fd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11fe0 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c  windowCodeDefaul
11ff0 74 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tStep(pParse, p,
12000 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75   pWInfo, regGosu
12010 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
12020 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64     }.  }.}..#end
12030 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12040 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.