/ Hex Artifact Content
Login

Artifact ea81ecd031ed2cbc14b7db6fd7f4bee2471b894feae5fea0547b15b1e2dd8fb2:


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: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
4ab0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b   ExprList *pSub;
4ac0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53  .  Select *pSubS
4ad0: 65 6c 65 63 74 3b 20 20 20 20 20 20 20 20 20 20  elect;          
4ae0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75     /* Current su
4af0: 62 2d 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79  b-select, if any
4b00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   */.};../*.** Ca
4b10: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
4b20: 75 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69  used by selectWi
4b30: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
4b40: 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  (). If necessary
4b50: 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
4b60: 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  on appends to th
4b70: 65 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73  e output express
4b80: 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64  ion-list and upd
4b90: 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73  ates .** express
4ba0: 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e  ion (*ppExpr) in
4bb0: 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   place..*/.stati
4bc0: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4bd0: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28  owRewriteExprCb(
4be0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
4bf0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4c00: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
4c10: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
4c20: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
4c30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
4c40: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
4c50: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
4c60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
4c70: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
4c80: 69 74 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73  ithin a scalar s
4c90: 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74  ub-select.  ** t
4ca0: 68 61 74 20 75 73 65 64 20 62 79 20 74 68 65 20  hat used by the 
4cb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4cc0: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
4cd0: 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20  , only process. 
4ce0: 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78   ** TK_COLUMN ex
4cf0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
4d00: 65 66 65 72 20 74 6f 20 69 74 20 28 74 68 65 20  efer to it (the 
4d10: 6f 75 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44  outer SELECT). D
4d20: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65  o.  ** not proce
4d30: 73 73 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  ss aggregates or
4d40: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4d50: 73 20 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65  s at all, as the
4d60: 79 20 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f  y belong.  ** to
4d70: 20 74 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d   the scalar sub-
4d80: 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66  select.  */.  if
4d90: 28 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20  ( p->pSubSelect 
4da0: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
4db0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
4dc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4dd0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4df0: 6e 74 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72  nt nSrc = p->pSr
4e00: 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69  c->nSrc;.      i
4e10: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
4e20: 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
4e30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4e40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d  Expr->iTable==p-
4e50: 3e 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  >pSrc->a[i].iCur
4e60: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
4e70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
4e80: 3d 3d 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20  ==nSrc ) return 
4e90: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4ea0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
4eb0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
4ec0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
4ed0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
4ee0: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
4ef0: 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  y(pExpr, EP_WinF
4f00: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
4f10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
4f20: 73 65 7b 0a 20 20 20 20 20 20 20 20 57 69 6e 64  se{.        Wind
4f30: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20  ow *pWin;.      
4f40: 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70 57    for(pWin=p->pW
4f50: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
4f60: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
4f70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
4f80: 78 70 72 2d 3e 79 2e 70 57 69 6e 3d 3d 70 57 69  xpr->y.pWin==pWi
4f90: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
4fa0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
4fb0: 4f 77 6e 65 72 3d 3d 70 45 78 70 72 20 29 3b 0a  Owner==pExpr );.
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4fd0: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
4fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4ff0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5000: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
5010: 68 2e 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  h.  */..    case
5020: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
5030: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
5040: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  LUMN: {.      Ex
5050: 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74  pr *pDup = sqlit
5060: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
5070: 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29 3b  ->db, pExpr, 0);
5080: 0a 20 20 20 20 20 20 70 2d 3e 70 53 75 62 20 3d  .      p->pSub =
5090: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
50a0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
50b0: 2d 3e 70 53 75 62 2c 20 70 44 75 70 29 3b 0a 20  ->pSub, pDup);. 
50c0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 75 62       if( p->pSub
50d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
50e0: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
50f0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
5100: 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20 20  atic)==0 );.    
5110: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
5120: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74  rty(pExpr, EP_St
5130: 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 73  atic);.        s
5140: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
5150: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
5160: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  pr);.        Exp
5170: 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 70  rClearProperty(p
5180: 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
5190: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
51a0: 28 70 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f  (pExpr, 0, sizeo
51b0: 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20  f(Expr));..     
51c0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
51d0: 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
51e0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
51f0: 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78 70   = p->pSub->nExp
5200: 72 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45 78  r-1;.        pEx
5210: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d 3e  pr->iTable = p->
5220: 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20  pWin->iEphCsr;. 
5230: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72       }..      br
5240: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5250: 64 65 66 61 75 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f  default: /* no-o
5260: 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  p */.      break
5270: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
5280: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
5290: 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
52a0: 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 53 65  tWindowRewriteSe
52b0: 6c 65 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70  lectCb(Walker *p
52c0: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
52d0: 70 53 65 6c 65 63 74 29 7b 0a 20 20 73 74 72 75  pSelect){.  stru
52e0: 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ct WindowRewrite
52f0: 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
5300: 2e 70 52 65 77 72 69 74 65 3b 0a 20 20 53 65 6c  .pRewrite;.  Sel
5310: 65 63 74 20 2a 70 53 61 76 65 20 3d 20 70 2d 3e  ect *pSave = p->
5320: 70 53 75 62 53 65 6c 65 63 74 3b 0a 20 20 69 66  pSubSelect;.  if
5330: 28 20 70 53 61 76 65 3d 3d 70 53 65 6c 65 63 74  ( pSave==pSelect
5340: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
5350: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d  RC_Continue;.  }
5360: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 53 75  else{.    p->pSu
5370: 62 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  bSelect = pSelec
5380: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  t;.    sqlite3Wa
5390: 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
53a0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
53b0: 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20 3d 20  p->pSubSelect = 
53c0: 70 53 61 76 65 3b 0a 20 20 7d 0a 20 20 72 65 74  pSave;.  }.  ret
53d0: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d  urn WRC_Prune;.}
53e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 65  .../*.** Iterate
53f0: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
5400: 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78 70 72  pression in expr
5410: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 45 4c 69  ession-list pELi
5420: 73 74 2e 20 46 6f 72 20 65 61 63 68 3a 0a 2a 2a  st. For each:.**
5430: 0a 2a 2a 20 20 20 2a 20 54 4b 5f 43 4f 4c 55 4d  .**   * TK_COLUM
5440: 4e 2c 0a 2a 2a 20 20 20 2a 20 61 67 67 72 65 67  N,.**   * aggreg
5450: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72  ate function, or
5460: 0a 2a 2a 20 20 20 2a 20 77 69 6e 64 6f 77 20 66  .**   * window f
5470: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 57  unction with a W
5480: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 74 68 61  indow object tha
5490: 74 20 69 73 20 6e 6f 74 20 61 20 6d 65 6d 62 65  t is not a membe
54a0: 72 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  r of the .**    
54b0: 20 57 69 6e 64 6f 77 20 6c 69 73 74 20 70 61 73   Window list pas
54c0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
54d0: 64 20 61 72 67 75 6d 65 6e 74 20 28 70 57 69 6e  d argument (pWin
54e0: 29 2e 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  )..**.** Append 
54f0: 74 68 65 20 6e 6f 64 65 20 74 6f 20 6f 75 74 70  the node to outp
5500: 75 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69  ut expression-li
5510: 73 74 20 28 2a 70 70 53 75 62 29 2e 20 41 6e 64  st (*ppSub). And
5520: 20 72 65 70 6c 61 63 65 20 69 74 0a 2a 2a 20 77   replace it.** w
5530: 69 74 68 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20  ith a TK_COLUMN 
5540: 74 68 61 74 20 72 65 61 64 73 20 74 68 65 20 28  that reads the (
5550: 4e 2d 31 29 74 68 20 65 6c 65 6d 65 6e 74 20 6f  N-1)th element o
5560: 66 20 74 61 62 6c 65 20 0a 2a 2a 20 70 57 69 6e  f table .** pWin
5570: 2d 3e 69 45 70 68 43 73 72 2c 20 77 68 65 72 65  ->iEphCsr, where
5580: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
5590: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
55a0: 28 2a 70 70 53 75 62 29 20 61 66 74 65 72 0a 2a  (*ppSub) after.*
55b0: 2a 20 61 70 70 65 6e 64 69 6e 67 20 74 68 65 20  * appending the 
55c0: 6e 65 77 20 6f 6e 65 2e 0a 2a 2f 0a 73 74 61 74  new one..*/.stat
55d0: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 57 69  ic void selectWi
55e0: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
55f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5600: 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e, .  Window *pW
5610: 69 6e 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  in,.  SrcList *p
5620: 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74 20  Src,.  ExprList 
5630: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 20  *pEList,        
5640: 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72 69 74         /* Rewrit
5650: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
5660: 20 74 68 69 73 20 6c 69 73 74 20 2a 2f 0a 20 20   this list */.  
5670: 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 53 75 62  ExprList **ppSub
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 75 62 2d 73  /* IN/OUT: Sub-s
56a0: 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e  elect expression
56b0: 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 57 61  -list */.){.  Wa
56c0: 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20  lker sWalker;.  
56d0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 73 52  WindowRewrite sR
56e0: 65 77 72 69 74 65 3b 0a 0a 20 20 6d 65 6d 73 65  ewrite;..  memse
56f0: 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73  t(&sWalker, 0, s
5700: 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a  izeof(Walker));.
5710: 20 20 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69    memset(&sRewri
5720: 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69  te, 0, sizeof(Wi
5730: 6e 64 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a  ndowRewrite));..
5740: 20 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 20    sRewrite.pSub 
5750: 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77  = *ppSub;.  sRew
5760: 72 69 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e  rite.pWin = pWin
5770: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53 72  ;.  sRewrite.pSr
5780: 63 20 3d 20 70 53 72 63 3b 0a 0a 20 20 73 57 61  c = pSrc;..  sWa
5790: 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
57a0: 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
57b0: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
57c0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
57d0: 69 74 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  iteExprCb;.  sWa
57e0: 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
57f0: 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e  back = selectWin
5800: 64 6f 77 52 65 77 72 69 74 65 53 65 6c 65 63 74  dowRewriteSelect
5810: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e  Cb;.  sWalker.u.
5820: 70 52 65 77 72 69 74 65 20 3d 20 26 73 52 65 77  pRewrite = &sRew
5830: 72 69 74 65 3b 0a 0a 20 20 28 76 6f 69 64 29 73  rite;..  (void)s
5840: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
5850: 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c  st(&sWalker, pEL
5860: 69 73 74 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20  ist);..  *ppSub 
5870: 3d 20 73 52 65 77 72 69 74 65 2e 70 53 75 62 3b  = sRewrite.pSub;
5880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
5890: 20 61 20 63 6f 70 79 20 6f 66 20 65 61 63 68 20   a copy of each 
58a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 65 78  expression in ex
58b0: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70 41  pression-list pA
58c0: 70 70 65 6e 64 20 74 6f 0a 2a 2a 20 65 78 70 72  ppend to.** expr
58d0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 4c 69 73  ession list pLis
58e0: 74 2e 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  t. Return a poin
58f0: 74 65 72 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ter to the resul
5900: 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
5910: 63 20 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72  c ExprList *expr
5920: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a  ListAppendList(.
5930: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
5950: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5960: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5970: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
5980: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
5990: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
59a0: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
59b0: 74 20 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20  t *pAppend      
59c0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75   /* List of valu
59d0: 65 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  es to append. Mi
59e0: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
59f0: 7b 0a 20 20 69 66 28 20 70 41 70 70 65 6e 64 20  {.  if( pAppend 
5a00: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5a10: 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c    int nInit = pL
5a20: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
5a30: 70 72 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28  pr : 0;.    for(
5a40: 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e  i=0; i<pAppend->
5a50: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
5a60: 20 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20     Expr *pDup = 
5a70: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5a80: 50 61 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65  Parse->db, pAppe
5a90: 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  nd->a[i].pExpr, 
5aa0: 30 29 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  0);.      pList 
5ab0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5ac0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
5ad0: 70 4c 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20  pList, pDup);.  
5ae0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20      if( pList ) 
5af0: 70 4c 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69  pList->a[nInit+i
5b00: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41  ].sortOrder = pA
5b10: 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74  ppend->a[i].sort
5b20: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
5b30: 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
5b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
5b50: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5b60: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
5b70: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
5b80: 64 6f 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a  does not invoke.
5b90: 2a 2a 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f  ** any SQL windo
5ba0: 77 20 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69  w functions, thi
5bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
5bc0: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
5bd0: 2c 20 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65  , it .** rewrite
5be0: 73 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  s the SELECT sta
5bf0: 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
5c00: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78  indow function x
5c10: 53 74 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  Step functions.*
5c20: 2a 20 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e  * are invoked in
5c30: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
5c40: 65 72 20 61 73 20 64 65 73 63 72 69 62 65 64 20  er as described 
5c50: 75 6e 64 65 72 20 22 53 45 4c 45 43 54 20 52 45  under "SELECT RE
5c60: 57 52 49 54 49 4e 47 22 0a 2a 2a 20 61 74 20 74  WRITING".** at t
5c70: 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
5c80: 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ile..*/.int sqli
5c90: 74 65 33 57 69 6e 64 6f 77 52 65 77 72 69 74 65  te3WindowRewrite
5ca0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5cb0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
5cc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5cd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  ;.  if( p->pWin 
5ce0: 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  && p->pPrior==0 
5cf0: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
5d00: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
5d10: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 73 71 6c  pParse);.    sql
5d20: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5d30: 65 2d 3e 64 62 3b 0a 20 20 20 20 53 65 6c 65 63  e->db;.    Selec
5d40: 74 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  t *pSub = 0;    
5d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5d60: 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
5d70: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
5d80: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 45 78 70  p->pSrc;.    Exp
5d90: 72 20 2a 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  r *pWhere = p->p
5da0: 57 68 65 72 65 3b 0a 20 20 20 20 45 78 70 72 4c  Where;.    ExprL
5db0: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 20 3d 20  ist *pGroupBy = 
5dc0: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
5dd0: 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 20 3d   Expr *pHaving =
5de0: 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 20   p->pHaving;.   
5df0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 6f 72 74   ExprList *pSort
5e00: 20 3d 20 30 3b 0a 0a 20 20 20 20 45 78 70 72 4c   = 0;..    ExprL
5e10: 69 73 74 20 2a 70 53 75 62 6c 69 73 74 20 3d 20  ist *pSublist = 
5e20: 30 3b 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  0;       /* Expr
5e30: 65 73 73 69 6f 6e 20 6c 69 73 74 20 66 6f 72 20  ession list for 
5e40: 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 20  sub-query */.   
5e50: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
5e60: 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20 20 20 2f   p->pWin;      /
5e70: 2a 20 4d 61 73 74 65 72 20 77 69 6e 64 6f 77 20  * Master window 
5e80: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 57 69  object */.    Wi
5e90: 6e 64 6f 77 20 2a 70 57 69 6e 3b 20 20 20 20 20  ndow *pWin;     
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
5eb0: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 74 65  indow object ite
5ec0: 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 70 2d  rator */..    p-
5ed0: 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
5ee0: 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
5ef0: 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
5f00: 30 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  0;.    p->pHavin
5f10: 67 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  g = 0;..    /* C
5f20: 72 65 61 74 65 20 74 68 65 20 4f 52 44 45 52 20  reate the ORDER 
5f30: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 74 68  BY clause for th
5f40: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 54 68  e sub-select. Th
5f50: 69 73 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74  is is the concat
5f60: 65 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f  enation.    ** o
5f70: 66 20 74 68 65 20 77 69 6e 64 6f 77 20 50 41 52  f the window PAR
5f80: 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52  TITION and ORDER
5f90: 20 42 59 20 63 6c 61 75 73 65 73 2e 20 54 68 65   BY clauses. The
5fa0: 6e 2c 20 69 66 20 74 68 69 73 20 6d 61 6b 65 73  n, if this makes
5fb0: 20 69 74 0a 20 20 20 20 2a 2a 20 72 65 64 75 6e   it.    ** redun
5fc0: 64 61 6e 74 2c 20 72 65 6d 6f 76 65 20 74 68 65  dant, remove the
5fd0: 20 4f 52 44 45 52 20 42 59 20 66 72 6f 6d 20 74   ORDER BY from t
5fe0: 68 65 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  he parent SELECT
5ff0: 2e 20 20 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20  .  */.    pSort 
6000: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
6010: 74 44 75 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e  tDup(db, pMWin->
6020: 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
6030: 20 20 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72      pSort = expr
6040: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
6050: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 4d  Parse, pSort, pM
6060: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  Win->pOrderBy);.
6070: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26 26      if( pSort &&
6080: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
6090: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
60a0: 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
60b0: 28 70 53 6f 72 74 2c 20 70 2d 3e 70 4f 72 64 65  (pSort, p->pOrde
60c0: 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
60d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
60e0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
60f0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
6100: 20 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72         p->pOrder
6110: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
6120: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 73      }..    /* As
6130: 73 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e 75  sign a cursor nu
6140: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 65 70 68  mber for the eph
6150: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
6160: 64 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77 73  d to buffer rows
6170: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70 65  ..    ** The Ope
6180: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
6190: 75 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64 20  uction is coded 
61a0: 6c 61 74 65 72 2c 20 61 66 74 65 72 20 69 74 20  later, after it 
61b0: 69 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20 20  is known how.   
61c0: 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   ** many columns
61d0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c 20   the table will 
61e0: 68 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70 4d  have.  */.    pM
61f0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70  Win->iEphCsr = p
6200: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a  Parse->nTab++;..
6210: 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77      selectWindow
6220: 52 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61  RewriteEList(pPa
6230: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63  rse, pMWin, pSrc
6240: 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 53  , p->pEList, &pS
6250: 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65 6c  ublist);.    sel
6260: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
6270: 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d  EList(pParse, pM
6280: 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 4f  Win, pSrc, p->pO
6290: 72 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73  rderBy, &pSublis
62a0: 74 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e  t);.    pMWin->n
62b0: 42 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75  BufferCol = (pSu
62c0: 62 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74  blist ? pSublist
62d0: 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20  ->nExpr : 0);.. 
62e0: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
62f0: 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e   PARTITION BY an
6300: 64 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  d ORDER BY expre
6310: 73 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74 6f  ssions to the to
6320: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
6330: 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69  -select expressi
6340: 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72  on list. They ar
6350: 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69  e required to fi
6360: 67 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 0a  gure out where .
6370: 20 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69 65      ** boundarie
6380: 73 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73  s for partitions
6390: 20 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65   and sets of pee
63a0: 72 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f 0a  r rows lie.  */.
63b0: 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65      pSublist = e
63c0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73  xprListAppendLis
63d0: 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69  t(pParse, pSubli
63e0: 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  st, pMWin->pPart
63f0: 69 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75 62  ition);.    pSub
6400: 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41  list = exprListA
6410: 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65  ppendList(pParse
6420: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69  , pSublist, pMWi
6430: 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20  n->pOrderBy);.. 
6440: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
6450: 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
6460: 64 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77  d to each window
6470: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65   function to the
6480: 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65  .    ** sub-sele
6490: 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ct expression li
64a0: 73 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74  st. Also allocat
64b0: 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20  e two registers 
64c0: 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20  for each.    ** 
64d0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
64e0: 2d 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63  - one for the ac
64f0: 63 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68  cumulator, anoth
6500: 65 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20  er for interim. 
6510: 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20     ** results.  
6520: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d  */.    for(pWin=
6530: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
6540: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
6550: 29 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69  ){.      pWin->i
6560: 41 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69  ArgCol = (pSubli
6570: 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e  st ? pSublist->n
6580: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20  Expr : 0);.     
6590: 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72   pSublist = expr
65a0: 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
65b0: 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c  Parse, pSublist,
65c0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
65d0: 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69  .pList);.      i
65e0: 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  f( pWin->pFilter
65f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
6600: 20 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69   *pFilter = sqli
6610: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
6620: 57 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29  Win->pFilter, 0)
6630: 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c 69  ;.        pSubli
6640: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6650: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
6660: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69  e, pSublist, pFi
6670: 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lter);.      }. 
6680: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63       pWin->regAc
6690: 63 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  cum = ++pParse->
66a0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e  nMem;.      pWin
66b0: 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b  ->regResult = ++
66c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
66d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
66e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
66f0: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  , 0, pWin->regAc
6700: 63 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  cum);.    }..   
6710: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
6720: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 50  no ORDER BY or P
6730: 41 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61 75  ARTITION BY clau
6740: 73 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e 64  se, and the wind
6750: 6f 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  ow.    ** functi
6760: 6f 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f 20  on accepts zero 
6770: 61 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20 74  arguments, and t
6780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65  here are no othe
6790: 72 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a  r columns.    **
67a0: 20 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e 20   selected (e.g. 
67b0: 22 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62  "SELECT row_numb
67c0: 65 72 28 29 20 4f 56 45 52 20 28 29 20 46 52 4f  er() OVER () FRO
67d0: 4d 20 74 31 22 29 2c 20 69 74 20 69 73 20 70 6f  M t1"), it is po
67e0: 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 68  ssible.    ** th
67f0: 61 74 20 70 53 75 62 6c 69 73 74 20 69 73 20 73  at pSublist is s
6800: 74 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e 20  till NULL here. 
6810: 41 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20 65  Add a constant e
6820: 78 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20 74  xpression here t
6830: 6f 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20 65  o .    ** keep e
6840: 76 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c 20  verything legal 
6850: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a 20  in this case. . 
6860: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
6870: 75 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  ublist==0 ){.   
6880: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71     pSublist = sq
6890: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
68a0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a  end(pParse, 0, .
68b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
68c0: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
68d0: 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
68e0: 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c  te3IntTokens[0],
68f0: 20 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   0).      );.   
6900: 20 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20 73   }..    pSub = s
6910: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
6920: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c  .        pParse,
6930: 20 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63 2c   pSublist, pSrc,
6940: 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
6950: 79 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f 72  y, pHaving, pSor
6960: 74 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  t, 0, 0.    );. 
6970: 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c     p->pSrc = sql
6980: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
6990: 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
69a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
69b0: 53 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Src || db->mallo
69c0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
69d0: 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20  f( p->pSrc ){.  
69e0: 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30      p->pSrc->a[0
69f0: 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ].pSelect = pSub
6a00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
6a10: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
6a20: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ors(pParse, p->p
6a30: 53 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Src);.      if( 
6a40: 73 71 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62  sqlite3ExpandSub
6a50: 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 26 70  query(pParse, &p
6a60: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b  ->pSrc->a[0]) ){
6a70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
6a80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6a90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6aa0: 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
6ab0: 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
6ac0: 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
6ad0: 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65  ags &= ~SF_Aggre
6ae0: 67 61 74 65 3b 0a 20 20 20 20 20 20 20 20 73 71  gate;.        sq
6af0: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
6b00: 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 30 29  pParse, pSub, 0)
6b10: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6b20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6b30: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
6b40: 65 6d 65 72 61 6c 2c 20 70 4d 57 69 6e 2d 3e 69  emeral, pMWin->i
6b50: 45 70 68 43 73 72 2c 20 70 53 75 62 6c 69 73 74  EphCsr, pSublist
6b60: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 7d 65  ->nExpr);.    }e
6b70: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
6b80: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
6b90: 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a  b, pSub);.    }.
6ba0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
6bb0: 6f 63 46 61 69 6c 65 64 20 29 20 72 63 20 3d 20  ocFailed ) rc = 
6bc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6bd0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
6be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
6bf0: 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  e Window object 
6c00: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
6c10: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6c20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
6c30: 6e 64 6f 77 44 65 6c 65 74 65 28 73 71 6c 69 74  ndowDelete(sqlit
6c40: 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a  e3 *db, Window *
6c50: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
6c60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6c70: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 46 69 6c  lete(db, p->pFil
6c80: 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
6c90: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
6ca0: 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f  db, p->pPartitio
6cb0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  n);.    sqlite3E
6cc0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
6cd0: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
6ce0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6cf0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 6e  elete(db, p->pEn
6d00: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  d);.    sqlite3E
6d10: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
6d20: 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71  >pStart);.    sq
6d30: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6d40: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  p->zName);.    s
6d50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6d60: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
6d70: 2a 20 46 72 65 65 20 74 68 65 20 6c 69 6e 6b 65  * Free the linke
6d80: 64 20 6c 69 73 74 20 6f 66 20 57 69 6e 64 6f 77  d list of Window
6d90: 20 6f 62 6a 65 63 74 73 20 73 74 61 72 74 69 6e   objects startin
6da0: 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20  g at the second 
6db0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
6dc0: 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c  d sqlite3WindowL
6dd0: 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
6de0: 33 20 2a 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70  3 *db, Window *p
6df0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
6e00: 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 4e 65  .    Window *pNe
6e10: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 57 69 6e  xt = p->pNextWin
6e20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  ;.    sqlite3Win
6e30: 64 6f 77 44 65 6c 65 74 65 28 64 62 2c 20 70 29  dowDelete(db, p)
6e40: 3b 0a 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b  ;.    p = pNext;
6e50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
6e60: 65 20 61 72 67 75 6d 65 6e 74 20 65 78 70 72 65  e argument expre
6e70: 73 73 69 6f 6e 20 69 73 20 61 6e 20 50 52 45 43  ssion is an PREC
6e80: 45 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49  EDING or FOLLOWI
6e90: 4e 47 20 6f 66 66 73 65 74 2e 20 20 54 68 65 0a  NG offset.  The.
6ea0: 2a 2a 20 76 61 6c 75 65 20 73 68 6f 75 6c 64 20  ** value should 
6eb0: 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  be a non-negativ
6ec0: 65 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 74  e integer.  If t
6ed0: 68 65 20 76 61 6c 75 65 20 69 73 20 6e 6f 74 20  he value is not 
6ee0: 61 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 2c 20 63  a.** constant, c
6ef0: 68 61 6e 67 65 20 69 74 20 74 6f 20 4e 55 4c 4c  hange it to NULL
6f00: 2e 20 20 54 68 65 20 66 61 63 74 20 74 68 61 74  .  The fact that
6f10: 20 69 74 20 69 73 20 74 68 65 6e 20 61 20 6e 6f   it is then a no
6f20: 6e 2d 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 6e  n-negative.** in
6f30: 74 65 67 65 72 20 77 69 6c 6c 20 62 65 20 63 61  teger will be ca
6f40: 75 67 68 74 20 6c 61 74 65 72 2e 20 20 42 75 74  ught later.  But
6f50: 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
6f60: 20 6e 6f 74 20 74 6f 20 6c 65 61 76 65 0a 2a 2a   not to leave.**
6f70: 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 73   variable values
6f80: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
6f90: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  on tree..*/.stat
6fa0: 69 63 20 45 78 70 72 20 2a 73 71 6c 69 74 65 33  ic Expr *sqlite3
6fb0: 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72  WindowOffsetExpr
6fc0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6fd0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
6fe0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 45 78  if( 0==sqlite3Ex
6ff0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 78  prIsConstant(pEx
7000: 70 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pr) ){.    sqlit
7010: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7020: 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b  rse->db, pExpr);
7030: 0a 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c  .    pExpr = sql
7040: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
7050: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 4e 55 4c  arse->db, TK_NUL
7060: 4c 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  L, 0, 0);.  }.  
7070: 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
7080: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
7090: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 6e 65 77  and return a new
70a0: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 64   Window object d
70b0: 65 73 63 72 69 62 69 6e 67 20 61 20 57 69 6e 64  escribing a Wind
70c0: 6f 77 20 44 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  ow Definition..*
70d0: 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65  /.Window *sqlite
70e0: 33 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 0a 20 20  3WindowAlloc(.  
70f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7100: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
7110: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 54  text */.  int eT
7120: 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 46  ype,        /* F
7130: 72 61 6d 65 20 74 79 70 65 2e 20 54 4b 5f 52 41  rame type. TK_RA
7140: 4e 47 45 20 6f 72 20 54 4b 5f 52 4f 57 53 20 2a  NGE or TK_ROWS *
7150: 2f 0a 20 20 69 6e 74 20 65 53 74 61 72 74 2c 20  /.  int eStart, 
7160: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74        /* Start t
7170: 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 50 52  ype: CURRENT, PR
7180: 45 43 45 44 49 4e 47 2c 20 46 4f 4c 4c 4f 57 49  ECEDING, FOLLOWI
7190: 4e 47 2c 20 55 4e 42 4f 55 4e 44 45 44 20 2a 2f  NG, UNBOUNDED */
71a0: 0a 20 20 45 78 70 72 20 2a 70 53 74 61 72 74 2c  .  Expr *pStart,
71b0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77 69       /* Start wi
71c0: 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f  ndow size if TK_
71d0: 50 52 45 43 45 44 49 4e 47 20 6f 72 20 46 4f 4c  PRECEDING or FOL
71e0: 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20  LOWING */.  int 
71f0: 65 45 6e 64 2c 20 20 20 20 20 20 20 20 20 2f 2a  eEnd,         /*
7200: 20 45 6e 64 20 74 79 70 65 3a 20 43 55 52 52 45   End type: CURRE
7210: 4e 54 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 54  NT, FOLLOWING, T
7220: 4b 5f 55 4e 42 4f 55 4e 44 45 44 2c 20 50 52 45  K_UNBOUNDED, PRE
7230: 43 45 44 49 4e 47 20 2a 2f 0a 20 20 45 78 70 72  CEDING */.  Expr
7240: 20 2a 70 45 6e 64 20 20 20 20 20 20 20 20 2f 2a   *pEnd        /*
7250: 20 45 6e 64 20 77 69 6e 64 6f 77 20 73 69 7a 65   End window size
7260: 20 69 66 20 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47   if TK_FOLLOWING
7270: 20 6f 72 20 50 52 45 43 45 44 49 4e 47 20 2a 2f   or PRECEDING */
7280: 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  .){.  Window *pW
7290: 69 6e 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61  in = 0;..  /* Pa
72a0: 72 73 65 72 20 61 73 73 75 72 65 73 20 74 68 65  rser assures the
72b0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 20   following: */. 
72c0: 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
72d0: 54 4b 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70  TK_RANGE || eTyp
72e0: 65 3d 3d 54 4b 5f 52 4f 57 53 20 29 3b 0a 20 20  e==TK_ROWS );.  
72f0: 61 73 73 65 72 74 28 20 65 53 74 61 72 74 3d 3d  assert( eStart==
7300: 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 53  TK_CURRENT || eS
7310: 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49  tart==TK_PRECEDI
7320: 4e 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  NG.           ||
7330: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f   eStart==TK_UNBO
7340: 55 4e 44 45 44 20 7c 7c 20 65 53 74 61 72 74 3d  UNDED || eStart=
7350: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b  =TK_FOLLOWING );
7360: 0a 20 20 61 73 73 65 72 74 28 20 65 45 6e 64 3d  .  assert( eEnd=
7370: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65  =TK_CURRENT || e
7380: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
7390: 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  G.           || 
73a0: 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
73b0: 45 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50  ED || eEnd==TK_P
73c0: 52 45 43 45 44 49 4e 47 20 29 3b 0a 20 20 61 73  RECEDING );.  as
73d0: 73 65 72 74 28 20 28 65 53 74 61 72 74 3d 3d 54  sert( (eStart==T
73e0: 4b 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65  K_PRECEDING || e
73f0: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
7400: 49 4e 47 29 3d 3d 28 70 53 74 61 72 74 21 3d 30  ING)==(pStart!=0
7410: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
7420: 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  eEnd==TK_FOLLOWI
7430: 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50  NG || eEnd==TK_P
7440: 52 45 43 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64  RECEDING)==(pEnd
7450: 21 3d 30 29 20 29 3b 0a 0a 0a 20 20 2f 2a 20 49  !=0) );...  /* I
7460: 66 20 61 20 66 72 61 6d 65 20 69 73 20 64 65 63  f a frame is dec
7470: 6c 61 72 65 64 20 22 52 41 4e 47 45 22 20 28 6e  lared "RANGE" (n
7480: 6f 74 20 22 52 4f 57 53 22 29 2c 20 74 68 65 6e  ot "ROWS"), then
7490: 20 69 74 20 6d 61 79 20 6e 6f 74 20 75 73 65 0a   it may not use.
74a0: 20 20 2a 2a 20 65 69 74 68 65 72 20 22 3c 65 78    ** either "<ex
74b0: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 22 20 6f  pr> PRECEDING" o
74c0: 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  r "<expr> FOLLOW
74d0: 49 4e 47 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ING"..  */.  if(
74e0: 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45   eType==TK_RANGE
74f0: 20 26 26 20 28 70 53 74 61 72 74 21 3d 30 20 7c   && (pStart!=0 |
7500: 7c 20 70 45 6e 64 21 3d 30 29 20 29 7b 0a 20 20  | pEnd!=0) ){.  
7510: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7520: 67 28 70 50 61 72 73 65 2c 20 22 52 41 4e 47 45  g(pParse, "RANGE
7530: 20 6d 75 73 74 20 75 73 65 20 6f 6e 6c 79 20 55   must use only U
7540: 4e 42 4f 55 4e 44 45 44 20 6f 72 20 43 55 52 52  NBOUNDED or CURR
7550: 45 4e 54 20 52 4f 57 22 29 3b 0a 20 20 20 20 67  ENT ROW");.    g
7560: 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45  oto windowAllocE
7570: 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  rr;.  }..  /* Ad
7580: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 0a  ditionally, the.
7590: 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 62 6f    ** starting bo
75a0: 75 6e 64 61 72 79 20 74 79 70 65 20 6d 61 79 20  undary type may 
75b0: 6e 6f 74 20 6f 63 63 75 72 20 65 61 72 6c 69 65  not occur earlie
75c0: 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r in the followi
75d0: 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a 20 20 2a  ng list than.  *
75e0: 2a 20 74 68 65 20 65 6e 64 69 6e 67 20 62 6f 75  * the ending bou
75f0: 6e 64 61 72 79 20 74 79 70 65 3a 0a 20 20 2a 2a  ndary type:.  **
7600: 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45  .  **   UNBOUNDE
7610: 44 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a 2a  D PRECEDING.  **
7620: 20 20 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44     <expr> PRECED
7630: 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55 52 52 45  ING.  **   CURRE
7640: 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20 20 3c 65  NT ROW.  **   <e
7650: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20  xpr> FOLLOWING. 
7660: 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44 45 44 20   **   UNBOUNDED 
7670: 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20  FOLLOWING.  **. 
7680: 20 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 65   ** The parser e
7690: 6e 73 75 72 65 73 20 74 68 61 74 20 22 55 4e 42  nsures that "UNB
76a0: 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47  OUNDED PRECEDING
76b0: 22 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  " cannot be used
76c0: 20 61 73 20 61 6e 20 65 6e 64 69 6e 67 0a 20 20   as an ending.  
76d0: 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20 61 6e 64  ** boundary, and
76e0: 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e 44 45 44   than "UNBOUNDED
76f0: 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 6e 6e   FOLLOWING" cann
7700: 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ot be used as a 
7710: 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 66 72  starting.  ** fr
7720: 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e 0a 20 20  ame boundary..  
7730: 2a 2f 0a 20 20 69 66 28 20 28 65 53 74 61 72 74  */.  if( (eStart
7740: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20  ==TK_CURRENT && 
7750: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
7760: 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53 74 61 72  NG).   || (eStar
7770: 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
7780: 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f 50 52 45  && (eEnd==TK_PRE
7790: 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e 64 3d 3d  CEDING || eEnd==
77a0: 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a 20 20 29  TK_CURRENT)).  )
77b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
77c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
77d0: 6e 73 75 70 70 6f 72 74 65 64 20 66 72 61 6d 65  nsupported frame
77e0: 20 64 65 6c 69 6d 69 74 65 72 20 66 6f 72 20 52   delimiter for R
77f0: 4f 57 53 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  OWS");.    goto 
7800: 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a  windowAllocErr;.
7810: 20 20 7d 0a 0a 20 20 70 57 69 6e 20 3d 20 28 57    }..  pWin = (W
7820: 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65 33 44 62  indow*)sqlite3Db
7830: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
7840: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 57 69  e->db, sizeof(Wi
7850: 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28 20 70 57  ndow));.  if( pW
7860: 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20 77 69 6e  in==0 ) goto win
7870: 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 70  dowAllocErr;.  p
7880: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 65 54 79  Win->eType = eTy
7890: 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65 53 74 61  pe;.  pWin->eSta
78a0: 72 74 20 3d 20 65 53 74 61 72 74 3b 0a 20 20 70  rt = eStart;.  p
78b0: 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65 45 6e 64  Win->eEnd = eEnd
78c0: 3b 0a 20 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d  ;.  pWin->pEnd =
78d0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66   sqlite3WindowOf
78e0: 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65 2c  fsetExpr(pParse,
78f0: 20 70 45 6e 64 29 3b 0a 20 20 70 57 69 6e 2d 3e   pEnd);.  pWin->
7900: 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
7910: 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70 72  WindowOffsetExpr
7920: 28 70 50 61 72 73 65 2c 20 70 53 74 61 72 74 29  (pParse, pStart)
7930: 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 69 6e 3b  ;.  return pWin;
7940: 0a 0a 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72  ..windowAllocErr
7950: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  :.  sqlite3ExprD
7960: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7970: 2c 20 70 45 6e 64 29 3b 0a 20 20 73 71 6c 69 74  , pEnd);.  sqlit
7980: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7990: 72 73 65 2d 3e 64 62 2c 20 70 53 74 61 72 74 29  rse->db, pStart)
79a0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
79b0: 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63 68 20 77 69  ./*.** Attach wi
79c0: 6e 64 6f 77 20 6f 62 6a 65 63 74 20 70 57 69 6e  ndow object pWin
79d0: 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 70   to expression p
79e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
79f0: 33 57 69 6e 64 6f 77 41 74 74 61 63 68 28 50 61  3WindowAttach(Pa
7a00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
7a10: 72 20 2a 70 2c 20 57 69 6e 64 6f 77 20 2a 70 57  r *p, Window *pW
7a20: 69 6e 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  in){.  if( p ){.
7a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
7a40: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
7a50: 3b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  ;.    /* This ro
7a60: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
7a70: 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 61 72  lled for the par
7a80: 73 65 72 2e 20 20 49 66 20 70 57 69 6e 20 77 61  ser.  If pWin wa
7a90: 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 6c 6c  s not.    ** all
7aa0: 6f 63 61 74 65 64 20 64 75 65 20 74 6f 20 61 6e  ocated due to an
7ab0: 20 4f 4f 4d 2c 20 74 68 65 6e 20 74 68 65 20 70   OOM, then the p
7ac0: 61 72 73 65 72 20 77 6f 75 6c 64 20 66 61 69 6c  arser would fail
7ad0: 20 62 65 66 6f 72 65 20 65 76 65 72 0a 20 20 20   before ever.   
7ae0: 20 2a 2a 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   ** invoking thi
7af0: 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  s routine */.   
7b00: 20 69 66 28 20 41 4c 57 41 59 53 28 70 57 69 6e   if( ALWAYS(pWin
7b10: 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 79 2e  ) ){.      p->y.
7b20: 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 20  pWin = pWin;.   
7b30: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
7b40: 74 79 28 70 2c 20 45 50 5f 57 69 6e 46 75 6e 63  ty(p, EP_WinFunc
7b50: 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 70  );.      pWin->p
7b60: 4f 77 6e 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  Owner = p;.     
7b70: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
7b80: 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  EP_Distinct ){. 
7b90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7ba0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
7bb0: 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49            "DISTI
7bc0: 4e 43 54 20 69 73 20 6e 6f 74 20 73 75 70 70 6f  NCT is not suppo
7bd0: 72 74 65 64 20 66 6f 72 20 77 69 6e 64 6f 77 20  rted for window 
7be0: 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20  functions");.   
7bf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
7c00: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  se{.    sqlite3W
7c10: 69 6e 64 6f 77 44 65 6c 65 74 65 28 70 50 61 72  indowDelete(pPar
7c20: 73 65 2d 3e 64 62 2c 20 70 57 69 6e 29 3b 0a 20  se->db, pWin);. 
7c30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
7c40: 72 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20  rn 0 if the two 
7c50: 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 61  window objects a
7c60: 72 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72  re identical, or
7c70: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 74 68 65 72 77   non-zero otherw
7c80: 69 73 65 2e 0a 2a 2a 20 49 64 65 6e 74 69 63 61  ise..** Identica
7c90: 6c 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73  l window objects
7ca0: 20 63 61 6e 20 62 65 20 70 72 6f 63 65 73 73 65   can be processe
7cb0: 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 73 63  d in a single sc
7cc0: 61 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  an..*/.int sqlit
7cd0: 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28  e3WindowCompare(
7ce0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
7cf0: 69 6e 64 6f 77 20 2a 70 31 2c 20 57 69 6e 64 6f  indow *p1, Windo
7d00: 77 20 2a 70 32 29 7b 0a 20 20 69 66 28 20 70 31  w *p2){.  if( p1
7d10: 2d 3e 65 54 79 70 65 21 3d 70 32 2d 3e 65 54 79  ->eType!=p2->eTy
7d20: 70 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  pe ) return 1;. 
7d30: 20 69 66 28 20 70 31 2d 3e 65 53 74 61 72 74 21   if( p1->eStart!
7d40: 3d 70 32 2d 3e 65 53 74 61 72 74 20 29 20 72 65  =p2->eStart ) re
7d50: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31  turn 1;.  if( p1
7d60: 2d 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64  ->eEnd!=p2->eEnd
7d70: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
7d80: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
7d90: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31  mpare(pParse, p1
7da0: 2d 3e 70 53 74 61 72 74 2c 20 70 32 2d 3e 70 53  ->pStart, p2->pS
7db0: 74 61 72 74 2c 20 2d 31 29 20 29 20 72 65 74 75  tart, -1) ) retu
7dc0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
7dd0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
7de0: 50 61 72 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c  Parse, p1->pEnd,
7df0: 20 70 32 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29   p2->pEnd, -1) )
7e00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7e10: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7e20: 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 50 61 72  Compare(p1->pPar
7e30: 74 69 74 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72  tition, p2->pPar
7e40: 74 69 74 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65  tition, -1) ) re
7e50: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7e60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
7e70: 70 61 72 65 28 70 31 2d 3e 70 4f 72 64 65 72 42  pare(p1->pOrderB
7e80: 79 2c 20 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c  y, p2->pOrderBy,
7e90: 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b   -1) ) return 1;
7ea0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7eb0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
7ec0: 61 6c 6c 65 64 20 62 79 20 63 6f 64 65 20 69 6e  alled by code in
7ed0: 20 73 65 6c 65 63 74 2e 63 20 62 65 66 6f 72 65   select.c before
7ee0: 20 69 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65   it calls sqlite
7ef0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
7f00: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
7f10: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
7f20: 73 75 62 2d 71 75 65 72 79 20 72 65 73 75 6c 74  sub-query result
7f30: 73 2e 20 49 74 20 69 73 20 75 73 65 64 20 74 6f  s. It is used to
7f40: 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64   allocate.** and
7f50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 69   initialize regi
7f60: 73 74 65 72 73 20 61 6e 64 20 63 75 72 73 6f 72  sters and cursor
7f70: 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65  s used by sqlite
7f80: 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28  3WindowCodeStep(
7f90: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
7fa0: 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74  e3WindowCodeInit
7fb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7fc0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a  Window *pMWin){.
7fd0: 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
7fe0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
7ff0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
8000: 65 29 3b 0a 20 20 69 6e 74 20 6e 50 61 72 74 20  e);.  int nPart 
8010: 3d 20 28 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  = (pMWin->pParti
8020: 74 69 6f 6e 20 3f 20 70 4d 57 69 6e 2d 3e 70 50  tion ? pMWin->pP
8030: 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 20  artition->nExpr 
8040: 3a 20 30 29 3b 0a 20 20 6e 50 61 72 74 20 2b 3d  : 0);.  nPart +=
8050: 20 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42   (pMWin->pOrderB
8060: 79 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65  y ? pMWin->pOrde
8070: 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  rBy->nExpr : 0);
8080: 0a 20 20 69 66 28 20 6e 50 61 72 74 20 29 7b 0a  .  if( nPart ){.
8090: 20 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61      pMWin->regPa
80a0: 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  rt = pParse->nMe
80b0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
80c0: 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 61 72 74 3b 0a  >nMem += nPart;.
80d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
80e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
80f0: 2c 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  , 0, pMWin->regP
8100: 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
8110: 61 72 74 2b 6e 50 61 72 74 2d 31 29 3b 0a 20 20  art+nPart-1);.  
8120: 7d 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  }..  for(pWin=pM
8130: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
8140: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
8150: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 20  .    FuncDef *p 
8160: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20  = pWin->pFunc;. 
8170: 20 20 20 69 66 28 20 28 70 2d 3e 66 75 6e 63 46     if( (p->funcF
8180: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
8190: 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57  NC_MINMAX) && pW
81a0: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
81b0: 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
81c0: 20 20 2f 2a 20 54 68 65 20 69 6e 6c 69 6e 65 20    /* The inline 
81d0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d 69 6e 28  versions of min(
81e0: 29 20 61 6e 64 20 6d 61 78 28 29 20 72 65 71 75  ) and max() requ
81f0: 69 72 65 20 61 20 73 69 6e 67 6c 65 20 65 70 68  ire a single eph
8200: 65 6d 65 72 61 6c 0a 20 20 20 20 20 20 2a 2a 20  emeral.      ** 
8210: 74 61 62 6c 65 20 61 6e 64 20 33 20 72 65 67 69  table and 3 regi
8220: 73 74 65 72 73 2e 20 54 68 65 20 72 65 67 69 73  sters. The regis
8230: 74 65 72 73 20 61 72 65 20 75 73 65 64 20 61 73  ters are used as
8240: 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
8250: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65  **.      **   re
8260: 67 41 70 70 2b 30 3a 20 73 6c 6f 74 20 74 6f 20  gApp+0: slot to 
8270: 63 6f 70 79 20 6d 69 6e 28 29 2f 6d 61 78 28 29  copy min()/max()
8280: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f 72   argument to for
8290: 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20   MakeRecord.    
82a0: 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 31 3a    **   regApp+1:
82b0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 75   integer value u
82c0: 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 6b 65  sed to ensure ke
82d0: 79 73 20 61 72 65 20 75 6e 69 71 75 65 0a 20 20  ys are unique.  
82e0: 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b      **   regApp+
82f0: 32 3a 20 6f 75 74 70 75 74 20 6f 66 20 4d 61 6b  2: output of Mak
8300: 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2f  eRecord.      */
8310: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
8320: 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70  *pList = pWin->p
8330: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  Owner->x.pList;.
8340: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
8350: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
8360: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
8370: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
8380: 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  st, 0, 0);.     
8390: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20   pWin->csrApp = 
83a0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
83b0: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
83c0: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  pp = pParse->nMe
83d0: 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  m+1;.      pPars
83e0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20  e->nMem += 3;.  
83f0: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
8400: 20 26 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d   && pWin->pFunc-
8410: 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20 29  >zName[1]=='i' )
8420: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8430: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
8440: 74 4f 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a  tOrder[0]==0 );.
8450: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
8460: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
8470: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8490: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
84a0: 70 68 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e  phemeral, pWin->
84b0: 63 73 72 41 70 70 2c 20 32 29 3b 0a 20 20 20 20  csrApp, 2);.    
84c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
84d0: 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66  endP4(v, pKeyInf
84e0: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
84f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8500: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8510: 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e  teger, 0, pWin->
8520: 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d  regApp+1);.    }
8530: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d  .    else if( p-
8540: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
8550: 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d  eName || p->zNam
8560: 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61  e==first_valueNa
8570: 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  me ){.      /* A
8580: 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69  llocate two regi
8590: 73 74 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72  sters at pWin->r
85a0: 65 67 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c  egApp. These wil
85b0: 6c 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20  l be used to.   
85c0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
85d0: 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e  start and end in
85e0: 64 65 78 20 6f 66 20 74 68 65 20 63 75 72 72 65  dex of the curre
85f0: 6e 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20  nt frame.  */.  
8600: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
8610: 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20  n->iEphCsr );.  
8620: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70      pWin->regApp
8630: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
8640: 31 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63  1;.      pWin->c
8650: 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e  srApp = pParse->
8660: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50  nTab++;.      pP
8670: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b  arse->nMem += 2;
8680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8690: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
86a0: 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73  penDup, pWin->cs
86b0: 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  rApp, pMWin->iEp
86c0: 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hCsr);.    }.   
86d0: 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61   else if( p->zNa
86e0: 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20  me==leadName || 
86f0: 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  p->zName==lagNam
8700: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
8710: 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t( pMWin->iEphCs
8720: 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  r );.      pWin-
8730: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
8740: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
8750: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8760: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
8770: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70   pWin->csrApp, p
8780: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
8790: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
87a0: 2a 2a 20 41 20 22 50 52 45 43 45 44 49 4e 47 20  ** A "PRECEDING 
87b0: 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d  <expr>" (eCond==
87c0: 30 29 20 6f 72 20 22 46 4f 4c 4c 4f 57 49 4e 47  0) or "FOLLOWING
87d0: 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d   <expr>" (eCond=
87e0: 3d 31 29 20 6f 72 20 74 68 65 0a 2a 2a 20 76 61  =1) or the.** va
87f0: 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  lue of the secon
8800: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74  d argument to nt
8810: 68 5f 76 61 6c 75 65 28 29 20 28 65 43 6f 6e 64  h_value() (eCond
8820: 3d 3d 32 29 20 68 61 73 20 6a 75 73 74 20 62 65  ==2) has just be
8830: 65 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20  en.** evaluated 
8840: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 6c  and the result l
8850: 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
8860: 72 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  reg. This functi
8870: 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 0a  on generates VM.
8880: 2a 2a 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b  ** code to check
8890: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
88a0: 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  is a non-negativ
88b0: 65 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74 68  e integer and th
88c0: 72 6f 77 73 20 61 6e 0a 2a 2a 20 65 78 63 65 70  rows an.** excep
88d0: 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20 6e 6f  tion if it is no
88e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
88f0: 64 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74  d windowCheckInt
8900: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
8910: 72 73 65 2c 20 69 6e 74 20 72 65 67 2c 20 69 6e  rse, int reg, in
8920: 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73 74 61 74  t eCond){.  stat
8930: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
8940: 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  zErr[] = {.    "
8950: 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67 20 6f  frame starting o
8960: 66 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20  ffset must be a 
8970: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
8980: 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d  eger",.    "fram
8990: 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65 74 20  e ending offset 
89a0: 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65  must be a non-ne
89b0: 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c  gative integer",
89c0: 0a 20 20 20 20 22 73 65 63 6f 6e 64 20 61 72 67  .    "second arg
89d0: 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c  ument to nth_val
89e0: 75 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73  ue must be a pos
89f0: 69 74 69 76 65 20 69 6e 74 65 67 65 72 22 0a 20  itive integer". 
8a00: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   };.  static int
8a10: 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65   aOp[] = { OP_Ge
8a20: 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 74 20 7d  , OP_Ge, OP_Gt }
8a30: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
8a40: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
8a50: 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a  rse);.  int regZ
8a60: 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ero = sqlite3Get
8a70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8a80: 0a 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e 64  .  assert( eCond
8a90: 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64 3d 3d 31 20  ==0 || eCond==1 
8aa0: 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20 29 3b 0a 20  || eCond==2 );. 
8ab0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ac0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8ad0: 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 20  , 0, regZero);. 
8ae0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8af0: 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p2(v, OP_MustBeI
8b00: 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74 65 33  nt, reg, sqlite3
8b10: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
8b20: 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76  v)+2);.  VdbeCov
8b30: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
8b40: 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==0);.  VdbeCove
8b50: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
8b60: 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  =1);.  VdbeCover
8b70: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
8b80: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  2);.  sqlite3Vdb
8b90: 65 41 64 64 4f 70 33 28 76 2c 20 61 4f 70 5b 65  eAddOp3(v, aOp[e
8ba0: 43 6f 6e 64 5d 2c 20 72 65 67 5a 65 72 6f 2c 20  Cond], regZero, 
8bb0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
8bc0: 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67  ntAddr(v)+2, reg
8bd0: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
8be0: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
8bf0: 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62  eCond==0);.  Vdb
8c00: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
8c10: 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31  llIf(v, eCond==1
8c20: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
8c30: 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20  eNeverNullIf(v, 
8c40: 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c  eCond==2);.  sql
8c50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8c60: 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
8c70: 45 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72  E_ERROR, OE_Abor
8c80: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
8c90: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
8ca0: 69 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d  id*)azErr[eCond]
8cb0: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
8cc0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
8cd0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
8ce0: 67 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gZero);.}../*.**
8cf0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
8d00: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8d10: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69  passed to the wi
8d20: 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73  ndow-function as
8d30: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
8d40: 20 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73   the object pass
8d50: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
8d60: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
8d70: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
8d80: 74 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 41 72  tic int windowAr
8d90: 67 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70  gCount(Window *p
8da0: 57 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  Win){.  ExprList
8db0: 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e   *pList = pWin->
8dc0: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b  pOwner->x.pList;
8dd0: 0a 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73 74  .  return (pList
8de0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
8df0: 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  : 0);.}../*.** G
8e00: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
8e10: 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72  to invoke either
8e20: 20 78 53 74 65 70 28 29 20 28 69 66 20 62 49 6e   xStep() (if bIn
8e30: 76 65 72 73 65 20 69 73 20 30 29 20 6f 72 20 0a  verse is 0) or .
8e40: 2a 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66 20  ** xInverse (if 
8e50: 62 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d  bInverse is non-
8e60: 7a 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20 77  zero) for each w
8e70: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69  indow function i
8e80: 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
8e90: 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
8ea0: 74 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72  t pMWin. Or, for
8eb0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
8ec0: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68   functions.** th
8ed0: 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  at do not use th
8ee0: 65 20 73 74 61 6e 64 61 72 64 20 66 75 6e 63 74  e standard funct
8ef0: 69 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72 61 74  ion API, generat
8f00: 65 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 2a  e the required.*
8f10: 2a 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65  * inline VM code
8f20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
8f30: 65 6e 74 20 63 73 72 20 69 73 20 67 72 65 61 74  ent csr is great
8f40: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
8f50: 20 74 6f 20 30 2c 20 74 68 65 6e 20 61 72 67 75   to 0, then argu
8f60: 6d 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20 74  ment reg is.** t
8f70: 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
8f80: 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
8f90: 20 72 65 67 69 73 74 65 72 73 20 67 75 61 72 61   registers guara
8fa0: 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67  nteed to be larg
8fb0: 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68  e.** enough to h
8fc0: 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 6f 66  old the array of
8fd0: 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 65   arguments for e
8fe0: 61 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  ach function. In
8ff0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
9000: 65 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  e arguments are 
9010: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
9020: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
9030: 66 20 63 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a  f csr into the.*
9040: 2a 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  * array of regis
9050: 74 65 72 73 20 62 65 66 6f 72 65 20 69 6e 76 6f  ters before invo
9060: 6b 69 6e 67 20 4f 50 5f 41 67 67 53 74 65 70 20  king OP_AggStep 
9070: 6f 72 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65  or OP_AggInverse
9080: 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73  .**.** Or, if cs
9090: 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  r is less than z
90a0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 61 72  ero, then the ar
90b0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
90c0: 20 61 74 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c   at reg is.** al
90d0: 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20  ready populated 
90e0: 77 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  with all columns
90f0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
9100: 74 20 72 6f 77 20 6f 66 20 74 68 65 20 73 75 62  t row of the sub
9110: 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  -query..**.** If
9120: 20 61 72 67 75 6d 65 6e 74 20 72 65 67 50 61 72   argument regPar
9130: 74 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  tSize is non-zer
9140: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  o, then it is a 
9150: 72 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e  register contain
9160: 69 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65  ing the.** numbe
9170: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
9180: 20 63 75 72 72 65 6e 74 20 70 61 72 74 69 74 69   current partiti
9190: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
91a0: 69 64 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70  id windowAggStep
91b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
91c0: 65 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  e, .  Window *pM
91d0: 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  Win,            
91e0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20        /* Linked 
91f0: 6c 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66  list of window f
9200: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
9210: 74 20 63 73 72 2c 20 20 20 20 20 20 20 20 20 20  t csr,          
9220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9230: 20 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20   Read arguments 
9240: 66 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f 72  from this cursor
9250: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65 72   */.  int bInver
9260: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
9270: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
9280: 20 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73 65   invoke xInverse
9290: 20 69 6e 73 74 65 61 64 20 6f 66 20 78 53 74 65   instead of xSte
92a0: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20  p */.  int reg, 
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92c0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
92d0: 6f 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  of registers */.
92e0: 20 20 69 6e 74 20 72 65 67 50 61 72 74 53 69 7a    int regPartSiz
92f0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
9300: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
9310: 6e 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66  ntaining size of
9320: 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b   partition */.){
9330: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
9340: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
9350: 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  se);.  Window *p
9360: 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d  Win;.  for(pWin=
9370: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
9380: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
9390: 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ){.    int flags
93a0: 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e   = pWin->pFunc->
93b0: 66 75 6e 63 46 6c 61 67 73 3b 0a 20 20 20 20 69  funcFlags;.    i
93c0: 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 20 20 69  nt regArg;.    i
93d0: 6e 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77  nt nArg = window
93e0: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a  ArgCount(pWin);.
93f0: 0a 20 20 20 20 69 66 28 20 63 73 72 3e 3d 30 20  .    if( csr>=0 
9400: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
9410: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9420: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
9430: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9440: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
9450: 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e  umn, csr, pWin->
9460: 69 41 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69  iArgCol+i, reg+i
9470: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9480: 20 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 20   regArg = reg;. 
9490: 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
94a0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e   SQLITE_FUNC_WIN
94b0: 44 4f 57 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  DOW_SIZE ){.    
94c0: 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20      if( nArg==0 
94d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67  ){.          reg
94e0: 41 72 67 20 3d 20 72 65 67 50 61 72 74 53 69 7a  Arg = regPartSiz
94f0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
9500: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9510: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9520: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 50 61   OP_SCopy, regPa
9530: 72 74 53 69 7a 65 2c 20 72 65 67 2b 6e 41 72 67  rtSize, reg+nArg
9540: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9550: 20 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 20       nArg++;.   
9560: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9570: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
9580: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
9590: 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29  UNC_WINDOW_SIZE)
95a0: 20 29 3b 0a 20 20 20 20 20 20 72 65 67 41 72 67   );.      regArg
95b0: 20 3d 20 72 65 67 20 2b 20 70 57 69 6e 2d 3e 69   = reg + pWin->i
95c0: 41 72 67 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20  ArgCol;.    }.. 
95d0: 20 20 20 69 66 28 20 28 70 57 69 6e 2d 3e 70 46     if( (pWin->pF
95e0: 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
95f0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
9600: 4d 41 58 29 20 0a 20 20 20 20 20 20 26 26 20 70  MAX) .      && p
9610: 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f  Win->eStart!=TK_
9620: 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 29  UNBOUNDED .    )
9630: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
9640: 49 73 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IsNull = sqlite3
9650: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
9660: 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 41 72 67 29  _IsNull, regArg)
9670: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
9680: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69  rage(v);.      i
9690: 66 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 29  f( bInverse==0 )
96a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
96b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
96c0: 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e  P_AddImm, pWin->
96d0: 72 65 67 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20  regApp+1, 1);.  
96e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
96f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
9700: 6f 70 79 2c 20 72 65 67 41 72 67 2c 20 70 57 69  opy, regArg, pWi
9710: 6e 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20  n->regApp);.    
9720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9730: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
9740: 52 65 63 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65  Record, pWin->re
9750: 67 41 70 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72  gApp, 2, pWin->r
9760: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
9770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9780: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
9790: 65 72 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  ert, pWin->csrAp
97a0: 70 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  p, pWin->regApp+
97b0: 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  2);.      }else{
97c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
97d0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
97e0: 20 4f 50 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e   OP_SeekGE, pWin
97f0: 2d 3e 63 73 72 41 70 70 2c 20 30 2c 20 72 65 67  ->csrApp, 0, reg
9800: 41 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  Arg, 1);.       
9810: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
9820: 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20  erTaken(v);.    
9830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9840: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
9850: 74 65 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  te, pWin->csrApp
9860: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9870: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
9880: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
9890: 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a  rentAddr(v)-2);.
98a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
98b0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
98c0: 65 28 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29  e(v, addrIsNull)
98d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
98e0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a  pWin->regApp ){.
98f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
9900: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9910: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a  ==nth_valueName.
9920: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57             || pW
9930: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9940: 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  ==first_valueNam
9950: 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
9960: 20 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73   assert( bInvers
9970: 65 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65  e==0 || bInverse
9980: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
9990: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
99a0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69  , OP_AddImm, pWi
99b0: 6e 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76  n->regApp+1-bInv
99c0: 65 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65  erse, 1);.    }e
99d0: 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 70 46  lse if( pWin->pF
99e0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64  unc->zName==lead
99f0: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20  Name.           
9a00: 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  || pWin->pFunc->
9a10: 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a 20  zName==lagName. 
9a20: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e     ){.      /* n
9a30: 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
9a40: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  e{.      int add
9a50: 72 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rIf = 0;.      i
9a60: 66 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  f( pWin->pFilter
9a70: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
9a80: 72 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20  regTmp;.        
9a90: 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20  assert( nArg==0 
9aa0: 7c 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70  || nArg==pWin->p
9ab0: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  Owner->x.pList->
9ac0: 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  nExpr );.       
9ad0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c   assert( nArg ||
9ae0: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78   pWin->pOwner->x
9af0: 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20  .pList==0 );.   
9b00: 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29       if( csr>0 )
9b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 54  {.          regT
9b20: 6d 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  mp = sqlite3GetT
9b30: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
9b40: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9b50: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9b60: 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70  P_Column, csr, p
9b70: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72  Win->iArgCol+nAr
9b80: 67 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20  g,regTmp);.     
9b90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9ba0: 20 20 20 20 72 65 67 54 6d 70 20 3d 20 72 65 67      regTmp = reg
9bb0: 41 72 67 20 2b 20 6e 41 72 67 3b 0a 20 20 20 20  Arg + nArg;.    
9bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64      }.        ad
9bd0: 64 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64  drIf = sqlite3Vd
9be0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
9bf0: 66 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c  fNot, regTmp, 0,
9c00: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
9c10: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
9c20: 20 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20        if( csr>0 
9c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
9c40: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9c50: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d  eg(pParse, regTm
9c60: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
9c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9c80: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
9c90: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
9ca0: 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
9cb0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
9cc0: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20   *pColl;.       
9cd0: 20 61 73 73 65 72 74 28 20 6e 41 72 67 3e 30 20   assert( nArg>0 
9ce0: 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  );.        pColl
9cf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e   = sqlite3ExprNN
9d00: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
9d10: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
9d20: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
9d30: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
9d40: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
9d50: 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30   OP_CollSeq, 0,0
9d60: 2c 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  ,0, (const char*
9d70: 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
9d80: 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
9d90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9da0: 64 4f 70 33 28 76 2c 20 62 49 6e 76 65 72 73 65  dOp3(v, bInverse
9db0: 3f 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 20  ? OP_AggInverse 
9dc0: 3a 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 0a 20  : OP_AggStep, . 
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9de0: 20 20 20 20 20 20 20 62 49 6e 76 65 72 73 65 2c         bInverse,
9df0: 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72   regArg, pWin->r
9e00: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20  egAccum);.      
9e10: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
9e20: 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75  dP4(v, pWin->pFu
9e30: 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
9e40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9e50: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
9e60: 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69  8)nArg);.      i
9e70: 66 28 20 61 64 64 72 49 66 20 29 20 73 71 6c 69  f( addrIf ) sqli
9e80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
9e90: 76 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20 20  v, addrIf);.    
9ea0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  }.  }.}../*.** G
9eb0: 65 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20  enerate VM code 
9ec0: 74 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72  to invoke either
9ed0: 20 78 56 61 6c 75 65 28 29 20 28 62 46 69 6e 61   xValue() (bFina
9ee0: 6c 3d 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c 69  l==0) or xFinali
9ef0: 7a 65 28 29 0a 2a 2a 20 28 62 46 69 6e 61 6c 3d  ze().** (bFinal=
9f00: 3d 31 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e  =1) for each win
9f10: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  dow function in 
9f20: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
9f30: 73 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70  starting at.** p
9f40: 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75  MWin. Or, for bu
9f50: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75  ilt-in window-fu
9f60: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f 20  nctions that do 
9f70: 6e 6f 74 20 75 73 65 20 74 68 65 20 73 74 61 6e  not use the stan
9f80: 64 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e  dard.** API, gen
9f90: 65 72 61 74 65 20 74 68 65 20 65 71 75 69 76 61  erate the equiva
9fa0: 6c 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f  lent VM code..*/
9fb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
9fc0: 64 6f 77 41 67 67 46 69 6e 61 6c 28 50 61 72 73  dowAggFinal(Pars
9fd0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
9fe0: 77 20 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46  w *pMWin, int bF
9ff0: 69 6e 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  inal){.  Vdbe *v
a000: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
a010: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
a020: 64 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f  dow *pWin;..  fo
a030: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
a040: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
a050: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66  NextWin){.    if
a060: 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  ( (pWin->pFunc->
a070: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
a080: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20  TE_FUNC_MINMAX) 
a090: 0a 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65  .     && pWin->e
a0a0: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
a0b0: 44 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  DED .    ){.    
a0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a0d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
a0e0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  0, pWin->regResu
a0f0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
a100: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
a110: 4f 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63  OP_Last, pWin->c
a120: 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64  srApp);.      Vd
a130: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
a140: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a150: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a160: 75 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  umn, pWin->csrAp
a170: 70 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  p, 0, pWin->regR
a180: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
a190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a1a0: 65 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65  e(v, sqlite3Vdbe
a1b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32  CurrentAddr(v)-2
a1c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  );.      if( bFi
a1d0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nal ){.        s
a1e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
a1f0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
a200: 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  er, pWin->csrApp
a210: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a220: 65 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72  else if( pWin->r
a230: 65 67 41 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c  egApp ){.    }el
a240: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 62 46  se{.      if( bF
a250: 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
a260: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a270: 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  2(v, OP_AggFinal
a280: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
a290: 2c 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74  , windowArgCount
a2a0: 28 70 57 69 6e 29 29 3b 0a 20 20 20 20 20 20 20  (pWin));.       
a2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
a2c0: 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
a2d0: 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
a2e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a2f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a300: 50 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65  P_Copy, pWin->re
a310: 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65  gAccum, pWin->re
a320: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
a330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a340: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
a350: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
a360: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
a370: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a380: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a390: 5f 41 67 67 56 61 6c 75 65 2c 20 70 57 69 6e 2d  _AggValue, pWin-
a3a0: 3e 72 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f  >regAccum, windo
a3b0: 77 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 2c  wArgCount(pWin),
a3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57                pW
a3e0: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
a3f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a400: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
a410: 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  Win->pFunc, P4_F
a420: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d  UNCDEF);.      }
a430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a440: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a450: 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 20 63  n generates VM c
a460: 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ode to invoke th
a470: 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74  e sub-routine at
a480: 20 61 64 64 72 65 73 73 0a 2a 2a 20 6c 62 6c 46   address.** lblF
a490: 6c 75 73 68 50 61 72 74 20 6f 6e 63 65 20 66 6f  lushPart once fo
a4a0: 72 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e  r each partition
a4b0: 20 77 69 74 68 20 74 68 65 20 65 6e 74 69 72 65   with the entire
a4c0: 20 70 61 72 74 69 74 69 6f 6e 20 63 61 63 68 65   partition cache
a4d0: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 57 69 6e 64  d in.** the Wind
a4e0: 6f 77 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20  ow.iEphCsr temp 
a4f0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
a500: 20 76 6f 69 64 20 77 69 6e 64 6f 77 50 61 72 74   void windowPart
a510: 69 74 69 6f 6e 43 61 63 68 65 28 0a 20 20 50 61  itionCache(.  Pa
a520: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53  rse *pParse,.  S
a530: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a550: 2a 20 54 68 65 20 72 65 77 72 69 74 74 65 6e 20  * The rewritten 
a560: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
a570: 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
a580: 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  *pWInfo,        
a590: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 49 6e        /* WhereIn
a5a0: 66 6f 20 74 6f 20 63 61 6c 6c 20 57 68 65 72 65  fo to call Where
a5b0: 45 6e 64 28 29 20 6f 6e 20 2a 2f 0a 20 20 69 6e  End() on */.  in
a5c0: 74 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20  t regFlushPart, 
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a5e0: 20 52 65 67 69 73 74 65 72 20 74 6f 20 75 73 65   Register to use
a5f0: 20 77 69 74 68 20 47 6f 73 75 62 20 6c 62 6c 46   with Gosub lblF
a600: 6c 75 73 68 50 61 72 74 20 2a 2f 0a 20 20 69 6e  lushPart */.  in
a610: 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20  t lblFlushPart, 
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a630: 20 53 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 47   Subroutine to G
a640: 6f 73 75 62 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  osub to */.  int
a650: 20 2a 70 52 65 67 53 69 7a 65 20 20 20 20 20 20   *pRegSize      
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a670: 4f 55 54 3a 20 52 65 67 69 73 74 65 72 20 63 6f  OUT: Register co
a680: 6e 74 61 69 6e 69 6e 67 20 70 61 72 74 69 74 69  ntaining partiti
a690: 6f 6e 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20  on size */.){.  
a6a0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
a6b0: 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20  p->pWin;.  Vdbe 
a6c0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
a6d0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
a6e0: 6e 74 20 69 53 75 62 43 73 72 20 3d 20 70 2d 3e  nt iSubCsr = p->
a6f0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  pSrc->a[0].iCurs
a700: 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d  or;.  int nSub =
a710: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
a720: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74  Tab->nCol;.  int
a730: 20 6b 3b 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d   k;..  int reg =
a740: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
a750: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
a760: 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69   = reg+nSub;.  i
a770: 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65  nt regRowid = re
a780: 67 52 65 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70  gRecord+1;..  *p
a790: 52 65 67 53 69 7a 65 20 3d 20 72 65 67 52 6f 77  RegSize = regRow
a7a0: 69 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  id;.  pParse->nM
a7b0: 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a  em += nSub + 2;.
a7c0: 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63  .  /* Load the c
a7d0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72  olumn values for
a7e0: 20 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65   the row returne
a7f0: 64 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c  d by the sub-sel
a800: 65 63 74 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  ect.  ** into an
a810: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
a820: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
a830: 72 65 67 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  reg. */.  for(k=
a840: 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b  0; k<nSub; k++){
a850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a860: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
a870: 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c  umn, iSubCsr, k,
a880: 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73   reg+k);.  }.  s
a890: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a8a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
a8b0: 64 2c 20 72 65 67 2c 20 6e 53 75 62 2c 20 72 65  d, reg, nSub, re
a8c0: 67 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20  gRecord);..  /* 
a8d0: 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
a8e0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
a8f0: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 20 49  new partition. I
a900: 66 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 0a 20  f so, call the. 
a910: 20 2a 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74   ** flush_partit
a920: 69 6f 6e 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e  ion sub-routine.
a930: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e    */.  if( pMWin
a940: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
a950: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
a960: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
a970: 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
a980: 69 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  ition;.    int n
a990: 50 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45  Part = pPart->nE
a9a0: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  xpr;.    int reg
a9b0: 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20  NewPart = reg + 
a9c0: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
a9d0: 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  l;.    KeyInfo *
a9e0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
a9f0: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
aa00: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50  rList(pParse, pP
aa10: 61 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20  art, 0, 0);..   
aa20: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
aa30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aa40: 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50  Compare, regNewP
aa50: 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50  art, pMWin->regP
aa60: 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20  art,nPart);.    
aa70: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
aa80: 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
aa90: 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
aaa0: 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
aab0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
aac0: 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61  _Jump, addr+2, a
aad0: 64 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a  ddr+4, addr+2);.
aae0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
aaf0: 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  EqNe(v);.    sql
ab00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ab10: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
ab20: 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65  wPart, pMWin->re
ab30: 67 50 61 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b  gPart, nPart-1);
ab40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ab50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
ab60: 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74  ub, regFlushPart
ab70: 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
ab80: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
ab90: 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68  ((v, "call flush
aba0: 5f 70 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a 20  _partition"));. 
abb0: 20 7d 0a 0a 20 20 2f 2a 20 42 75 66 66 65 72 20   }..  /* Buffer 
abc0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
abd0: 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  in the ephemeral
abe0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c   table. */.  sql
abf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
ac00: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
ac10: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
ac20: 65 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69  egRowid);.  sqli
ac30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ac40: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69   OP_Insert, pMWi
ac50: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
ac60: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29  ecord, regRowid)
ac70: 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ;..  /* End of t
ac80: 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
ac90: 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
aca0: 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f  nd(pWInfo);..  /
acb0: 2a 20 49 6e 76 6f 6b 65 20 22 66 6c 75 73 68 5f  * Invoke "flush_
acc0: 70 61 72 74 69 74 69 6f 6e 22 20 74 6f 20 64 65  partition" to de
acd0: 61 6c 20 77 69 74 68 20 74 68 65 20 66 69 6e 61  al with the fina
ace0: 6c 20 28 6f 72 20 6f 6e 6c 79 29 20 70 61 72 74  l (or only) part
acf0: 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ition */.  sqlit
ad00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ad10: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75  OP_Gosub, regFlu
ad20: 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68  shPart, lblFlush
ad30: 50 61 72 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d  Part);.  VdbeCom
ad40: 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66  ment((v, "call f
ad50: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29  lush_partition")
ad60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
ad70: 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69  ke the sub-routi
ad80: 6e 65 20 61 74 20 72 65 67 47 6f 73 75 62 20 28  ne at regGosub (
ad90: 67 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f 64  generated by cod
ada0: 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 29 20 74  e in select.c) t
adb0: 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20  o.** return the 
adc0: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 57  current row of W
add0: 69 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 20 49  indow.iEphCsr. I
ade0: 66 20 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e  f all window fun
adf0: 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67  ctions are.** ag
ae00: 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66  gregate window f
ae10: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73  unctions that us
ae20: 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 41  e the standard A
ae30: 50 49 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20  PI, a single.** 
ae40: 4f 50 5f 47 6f 73 75 62 20 69 6e 73 74 72 75 63  OP_Gosub instruc
ae50: 74 69 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61 74  tion is all that
ae60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   this routine ge
ae70: 6e 65 72 61 74 65 73 2e 20 45 78 74 72 61 20 56  nerates. Extra V
ae80: 4d 20 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65  M code.** for pe
ae90: 72 2d 72 6f 77 20 70 72 6f 63 65 73 73 69 6e 67  r-row processing
aea0: 20 69 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   is only generat
aeb0: 65 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f  ed for the follo
aec0: 77 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77 69  wing built-in wi
aed0: 6e 64 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ndow.** function
aee0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76  s:.**.**   nth_v
aef0: 61 6c 75 65 28 29 0a 2a 2a 20 20 20 66 69 72 73  alue().**   firs
af00: 74 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c  t_value().**   l
af10: 61 67 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29  ag().**   lead()
af20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
af30: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
af40: 6f 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ow(.  Parse *pPa
af50: 72 73 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70  rse,.  Window *p
af60: 4d 57 69 6e 2c 0a 20 20 69 6e 74 20 72 65 67 47  MWin,.  int regG
af70: 6f 73 75 62 2c 0a 20 20 69 6e 74 20 61 64 64 72  osub,.  int addr
af80: 47 6f 73 75 62 0a 29 7b 0a 20 20 56 64 62 65 20  Gosub.){.  Vdbe 
af90: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
afa0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57  dbe(pParse);.  W
afb0: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
afc0: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
afd0: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
afe0: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
aff0: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
b000: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
b010: 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d   if( pFunc->zNam
b020: 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
b030: 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e  .     || pFunc->
b040: 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c  zName==first_val
b050: 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20  ueName.    ){.  
b060: 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57      int csr = pW
b070: 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20  in->csrApp;.    
b080: 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69    int lbl = sqli
b090: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
b0a0: 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  (v);.      int t
b0b0: 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47  mpReg = sqlite3G
b0c0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
b0d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b0e0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
b0f0: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
b100: 72 65 67 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20  regResult);..   
b110: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e     if( pFunc->zN
b120: 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame==nth_valueNa
b130: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
b140: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b150: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d  v, OP_Column, pM
b160: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 57  Win->iEphCsr, pW
b170: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 74 6d  in->iArgCol+1,tm
b180: 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 77  pReg);.        w
b190: 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c  indowCheckIntVal
b1a0: 75 65 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65  ue(pParse, tmpRe
b1b0: 67 2c 20 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g, 2);.      }el
b1c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b1d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b1e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
b1f0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  tmpReg);.      }
b200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b210: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
b220: 64 64 2c 20 74 6d 70 52 65 67 2c 20 70 57 69 6e  dd, tmpReg, pWin
b230: 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70 52 65 67  ->regApp, tmpReg
b240: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b250: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b260: 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  _Gt, pWin->regAp
b270: 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67  p+1, lbl, tmpReg
b280: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
b290: 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76  erageNeverNull(v
b2a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b2b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b2c0: 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c  _SeekRowid, csr,
b2d0: 20 30 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20   0, tmpReg);.   
b2e0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e     VdbeCoverageN
b2f0: 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
b300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b310: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
b320: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
b330: 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65  ArgCol, pWin->re
b340: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
b350: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b360: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
b370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
b380: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b390: 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  rse, tmpReg);.  
b3a0: 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28    }.    else if(
b3b0: 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c   pFunc->zName==l
b3c0: 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63  eadName || pFunc
b3d0: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65  ->zName==lagName
b3e0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41   ){.      int nA
b3f0: 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  rg = pWin->pOwne
b400: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
b410: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 70  r;.      int iEp
b420: 68 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  h = pMWin->iEphC
b430: 73 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 73  sr;.      int cs
b440: 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  r = pWin->csrApp
b450: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20  ;.      int lbl 
b460: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
b470: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
b480: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
b490: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
b4a0: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
b4b0: 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20  if( nArg<3 ){.  
b4c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b4d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
b4e0: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
b4f0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
b500: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b520: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45  v, OP_Column, iE
b530: 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  ph, pWin->iArgCo
b540: 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  l+2, pWin->regRe
b550: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sult);.      }. 
b560: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b570: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
b580: 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65 67  id, iEph, tmpReg
b590: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  );.      if( nAr
b5a0: 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69  g<2 ){.        i
b5b0: 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d  nt val = (pFunc-
b5c0: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
b5d0: 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20   ? 1 : -1);.    
b5e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b5f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
b600: 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c 29  mm, tmpReg, val)
b610: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b620: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
b630: 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c  (pFunc->zName==l
b640: 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41 64 64  eadName ? OP_Add
b650: 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29 3b   : OP_Subtract);
b660: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70  .        int tmp
b670: 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Reg2 = sqlite3Ge
b680: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b690: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b6a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b6b0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20  P_Column, iEph, 
b6c0: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c  pWin->iArgCol+1,
b6d0: 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20   tmpReg2);.     
b6e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b6f0: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52  dOp3(v, op, tmpR
b700: 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70  eg2, tmpReg, tmp
b710: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Reg);.        sq
b720: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
b730: 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52  Reg(pParse, tmpR
b740: 65 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  eg2);.      }.. 
b750: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b760: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
b770: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c  kRowid, csr, lbl
b780: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
b790: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b7a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b7b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b7c0: 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69  Column, csr, pWi
b7d0: 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e  n->iArgCol, pWin
b7e0: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
b7f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
b800: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
b810: 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  bl);.      sqlit
b820: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
b830: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29  (pParse, tmpReg)
b840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
b850: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b860: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
b870: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
b880: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
b890: 6b 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  ke the code gene
b8a0: 72 61 74 65 64 20 62 79 20 77 69 6e 64 6f 77 52  rated by windowR
b8b0: 65 74 75 72 6e 4f 6e 65 52 6f 77 28 29 20 61 6e  eturnOneRow() an
b8c0: 64 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20 74  d, optionally, t
b8d0: 68 65 0a 2a 2a 20 78 49 6e 76 65 72 73 65 28 29  he.** xInverse()
b8e0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
b8f0: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
b900: 6f 6e 2c 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  on, for one or m
b910: 6f 72 65 20 72 6f 77 73 0a 2a 2a 20 66 72 6f 6d  ore rows.** from
b920: 20 74 68 65 20 57 69 6e 64 6f 77 2e 69 45 70 68   the Window.iEph
b930: 43 73 72 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  Csr temp table. 
b940: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
b950: 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 0a 2a  erates VM code.*
b960: 2a 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  * similar to:.**
b970: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 72 65 67  .**   while( reg
b980: 43 74 72 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20  Ctr>0 ){.**     
b990: 72 65 67 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20 20  regCtr--;.**    
b9a0: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
b9b0: 52 6f 77 28 29 0a 2a 2a 20 20 20 20 20 69 66 28  Row().**     if(
b9c0: 20 62 49 6e 76 65 72 73 65 20 29 7b 0a 2a 2a 20   bInverse ){.** 
b9d0: 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65        AggInverse
b9e0: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
b9f0: 20 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e 69 45   Next (Window.iE
ba00: 70 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a 2f  phCsr).**   }.*/
ba10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
ba20: 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a 20  dowReturnRows(. 
ba30: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
ba40: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c    Window *pMWin,
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77 69 6e    /* List of win
ba70: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  dow functions */
ba80: 0a 20 20 69 6e 74 20 72 65 67 43 74 72 2c 20 20  .  int regCtr,  
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63     /* Register c
bab0: 6f 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62 65 72  ontaining number
bac0: 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
bad0: 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20  t regGosub,     
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
baf0: 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 47 6f   Register for Go
bb00: 73 75 62 20 61 64 64 72 47 6f 73 75 62 20 2a 2f  sub addrGosub */
bb10: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
bb20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bb30: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
bb40: 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 66 6f 72   sub-routine for
bb50: 20 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20 2a 2f   ReturnOneRow */
bb60: 0a 20 20 69 6e 74 20 72 65 67 49 6e 76 41 72 67  .  int regInvArg
bb70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bb80: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
bb90: 65 67 69 73 74 65 72 73 20 66 6f 72 20 78 49 6e  egisters for xIn
bba0: 76 65 72 73 65 20 61 72 67 73 20 2a 2f 0a 20 20  verse args */.  
bbb0: 69 6e 74 20 72 65 67 49 6e 76 53 69 7a 65 20 20  int regInvSize  
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  /* Register cont
bbe0: 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70  aining size of p
bbf0: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  artition */.){. 
bc00: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64 62   int addr;.  Vdb
bc10: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
bc20: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
bc30: 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
bc40: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30  pParse, pMWin, 0
bc50: 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  );.  addr = sqli
bc60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bc70: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43 74   OP_IfPos, regCt
bc80: 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
bc90: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 20 2c  rrentAddr(v)+2 ,
bca0: 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  1);.  VdbeCovera
bcb0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
bcc0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bcd0: 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  _Goto, 0, 0);.  
bce0: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
bcf0: 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ow(pParse, pMWin
bd00: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
bd10: 47 6f 73 75 62 29 3b 0a 20 20 69 66 28 20 72 65  Gosub);.  if( re
bd20: 67 49 6e 76 41 72 67 20 29 7b 0a 20 20 20 20 77  gInvArg ){.    w
bd30: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
bd40: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69  rse, pMWin, pMWi
bd50: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c 20 72  n->iEphCsr, 1, r
bd60: 65 67 49 6e 76 41 72 67 2c 20 72 65 67 49 6e 76  egInvArg, regInv
bd70: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Size);.  }.  sql
bd80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bd90: 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e  , OP_Next, pMWin
bda0: 2d 3e 69 45 70 68 43 73 72 2c 20 61 64 64 72 29  ->iEphCsr, addr)
bdb0: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
bdc0: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
bdd0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
bde0: 64 72 2b 31 29 3b 20 20 20 2f 2a 20 54 68 65 20  dr+1);   /* The 
bdf0: 4f 50 5f 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a  OP_Goto */.}../*
be00: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
be10: 65 20 74 6f 20 73 65 74 20 74 68 65 20 61 63 63  e to set the acc
be20: 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
be30: 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  r for each windo
be40: 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  w function.** in
be50: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
be60: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
be70: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
be80: 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66  o NULL. And perf
be90: 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76  orm.** any equiv
bea0: 61 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61  alent initializa
beb0: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
bec0: 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69   any built-in wi
bed0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  ndow functions.*
bee0: 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  * in the list..*
bef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
bf00: 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72  dowInitAccum(Par
bf10: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
bf20: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64  ow *pMWin){.  Vd
bf30: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
bf40: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
bf50: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
bf60: 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20  int nArg = 0;.  
bf70: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
bf80: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
bf90: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
bfa0: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
bfb0: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
bfc0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
bfd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bfe0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
bff0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
c000: 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d  m);.    nArg = M
c010: 41 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41  AX(nArg, windowA
c020: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a  rgCount(pWin));.
c030: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a      if( pFunc->z
c040: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
c050: 61 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e  ame.     || pFun
c060: 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f  c->zName==first_
c070: 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b  valueName.    ){
c080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c090: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c0a0: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
c0b0: 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20  >regApp);.      
c0c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c0d0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
c0e0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
c0f0: 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
c100: 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63  if( (pFunc->func
c110: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
c120: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70  UNC_MINMAX) && p
c130: 57 69 6e 2d 3e 63 73 72 41 70 70 20 29 7b 0a 20  Win->csrApp ){. 
c140: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
c150: 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
c160: 42 4f 55 4e 44 45 44 20 29 3b 0a 20 20 20 20 20  BOUNDED );.     
c170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c180: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
c190: 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41  rter, pWin->csrA
c1a0: 70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pp);.      sqlit
c1b0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c1c0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
c1d0: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a  Win->regApp+1);.
c1e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 67 41      }.  }.  regA
c1f0: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  rg = pParse->nMe
c200: 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
c210: 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20 20 72  Mem += nArg;.  r
c220: 65 74 75 72 6e 20 72 65 67 41 72 67 3b 0a 7d 0a  eturn regArg;.}.
c230: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c240: 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77  ction does the w
c250: 6f 72 6b 20 6f 66 20 73 71 6c 69 74 65 33 57 69  ork of sqlite3Wi
c260: 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66  ndowCodeStep() f
c270: 6f 72 20 61 6c 6c 20 22 52 4f 57 53 22 0a 2a 2a  or all "ROWS".**
c280: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 74 79   window frame ty
c290: 70 65 73 20 65 78 63 65 70 74 20 66 6f 72 20 22  pes except for "
c2a0: 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
c2b0: 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
c2c0: 43 55 52 52 45 4e 54 0a 2a 2a 20 52 4f 57 22 2e  CURRENT.** ROW".
c2d0: 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72   Pseudo-code for
c2e0: 20 65 61 63 68 20 66 6f 6c 6c 6f 77 73 2e 0a 2a   each follows..*
c2f0: 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  *.** ROWS BETWEE
c300: 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44  N <expr1> PRECED
c310: 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
c320: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
c330: 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
c340: 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
c350: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
c360: 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72   Gosub flush_par
c370: 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tition.**       
c380: 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
c390: 74 20 28 72 65 63 6f 72 64 20 69 6e 20 65 70 68  t (record in eph
c3a0: 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20 20 20 73  -table).**     s
c3b0: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
c3c0: 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 66 6c  .**     Gosub fl
c3d0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ush_partition.**
c3e0: 20 20 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61    .**   flush_pa
c3f0: 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20  rtition:.**     
c400: 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Once {.**       
c410: 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72  OpenDup (iEphCsr
c420: 20 2d 3e 20 63 73 72 53 74 61 72 74 29 0a 2a 2a   -> csrStart).**
c430: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
c440: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 45 6e  iEphCsr -> csrEn
c450: 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  d).**     }.**  
c460: 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65     regStart = <e
c470: 78 70 72 31 3e 20 20 20 20 20 20 20 20 20 20 20  xpr1>           
c480: 20 20 20 20 20 2f 2f 20 50 52 45 43 45 44 49 4e       // PRECEDIN
c490: 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  G expression.** 
c4a0: 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
c4b0: 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 20 20  pr2>            
c4c0: 20 20 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57 49        // FOLLOWI
c4d0: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  NG expression.**
c4e0: 20 20 20 20 20 69 66 28 20 72 65 67 53 74 61 72       if( regStar
c4f0: 74 3c 30 20 7c 7c 20 72 65 67 45 6e 64 3c 30 20  t<0 || regEnd<0 
c500: 29 7b 20 65 72 72 6f 72 21 20 7d 0a 2a 2a 20 20  ){ error! }.**  
c510: 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63     Rewind (csr,c
c520: 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20  srStart,csrEnd) 
c530: 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67       // if EOF g
c540: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
c550: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
c560: 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20    Next(csrEnd)  
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 2f 2f 20 69 66 20 45 4f 46 20 73 6b 69 70    // if EOF skip
c590: 20 41 67 67 73 74 65 70 0a 2a 2a 20 20 20 20 20   Aggstep.**     
c5a0: 20 20 41 67 67 73 74 65 70 20 28 63 73 72 45 6e    Aggstep (csrEn
c5b0: 64 29 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  d).**       if( 
c5c0: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
c5d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46  .**         AggF
c5e0: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
c5f0: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
c600: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
c610: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
c630: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
c640: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
c650: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
c660: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
c670: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
c680: 41 67 67 49 6e 76 65 72 73 65 20 28 63 73 72 53  AggInverse (csrS
c690: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  tart).**        
c6a0: 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74     Next(csrStart
c6b0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  ).**         }.*
c6c0: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 66  *       }.**   f
c6d0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
c6e0: 6f 6e 65 3a 0a 2a 2a 20 20 20 20 20 52 65 73 65  one:.**     Rese
c6f0: 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a  tSorter (csr).**
c700: 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a       Return.**.*
c710: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
c720: 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
c730: 20 20 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52     AND CURRENT R
c740: 4f 57 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  OW.** ROWS BETWE
c750: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20  EN CURRENT ROW  
c760: 20 20 20 20 20 20 20 41 4e 44 20 3c 65 78 70 72         AND <expr
c770: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52  > FOLLOWING.** R
c780: 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
c790: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
c7a0: 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  AND <expr> FOLLO
c7b0: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  WING.**.**   The
c7c0: 73 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74  se are similar t
c7d0: 6f 20 74 68 65 20 61 62 6f 76 65 2e 20 46 6f 72  o the above. For
c7e0: 20 22 43 55 52 52 45 4e 54 20 52 4f 57 22 2c 20   "CURRENT ROW", 
c7f0: 69 6e 74 69 61 6c 69 7a 65 20 74 68 65 0a 2a 2a  intialize the.**
c800: 20 20 20 72 65 67 69 73 74 65 72 20 74 6f 20 30     register to 0
c810: 2e 20 46 6f 72 20 22 55 4e 42 4f 55 4e 44 45 44  . For "UNBOUNDED
c820: 20 50 52 45 43 45 44 49 4e 47 22 20 74 6f 20 69   PRECEDING" to i
c830: 6e 66 69 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 52  nfinity..**.** R
c840: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
c850: 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20  r> PRECEDING    
c860: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
c870: 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20  LLOWING.** ROWS 
c880: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
c890: 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44 20  ROW         AND 
c8a0: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
c8b0: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  ING.**.**     Re
c8c0: 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61  wind (csr,csrSta
c8d0: 72 74 2c 63 73 72 45 6e 64 29 20 20 20 20 2f 2f  rt,csrEnd)    //
c8e0: 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75   if EOF goto flu
c8f0: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
c900: 65 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20  e.**     while( 
c910: 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 4e 65  1 ){.**       Ne
c920: 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20 20  xt(csrEnd)      
c930: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 45              // E
c940: 78 69 74 20 77 68 69 6c 65 28 31 29 20 61 74 20  xit while(1) at 
c950: 45 4f 46 0a 2a 2a 20 20 20 20 20 20 20 41 67 67  EOF.**       Agg
c960: 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a  step (csrEnd).**
c970: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68       }.**     wh
c980: 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
c990: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
c9a0: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f  lue).**       Go
c9b0: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
c9c0: 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 29         Next(csr)
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67       // if EOF g
c9f0: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
ca00: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
ca10: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
ca20: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
ca30: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
ca40: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
ca50: 20 20 20 20 20 4e 65 78 74 28 63 73 72 53 74 61       Next(csrSta
ca60: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  rt).**       }.*
ca70: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20  *     }.**.**   
ca80: 46 6f 72 20 74 68 65 20 22 43 55 52 52 45 4e 54  For the "CURRENT
ca90: 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44   ROW AND UNBOUND
caa0: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61  ED FOLLOWING" ca
cab0: 73 65 2c 20 74 68 65 20 66 69 6e 61 6c 20 69 66  se, the final if
cac0: 28 29 20 0a 2a 2a 20 20 20 63 6f 6e 64 69 74 69  () .**   conditi
cad0: 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 74 72 75  on is always tru
cae0: 65 20 28 61 73 20 69 66 20 72 65 67 53 74 61 72  e (as if regStar
caf0: 74 20 77 65 72 65 20 69 6e 69 74 69 61 6c 69 7a  t were initializ
cb00: 65 64 20 74 6f 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  ed to 0)..**.** 
cb10: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
cb20: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
cb30: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
cb40: 47 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 69 73 20  G.** .**   This 
cb50: 69 73 20 74 68 65 20 6f 6e 6c 79 20 52 41 4e 47  is the only RANG
cb60: 45 20 63 61 73 65 20 68 61 6e 64 6c 65 64 20 62  E case handled b
cb70: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
cb80: 49 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a  It modifies the.
cb90: 2a 2a 20 20 20 73 65 63 6f 6e 64 20 77 68 69 6c  **   second whil
cba0: 65 28 20 31 20 29 20 6c 6f 6f 70 20 69 6e 20 22  e( 1 ) loop in "
cbb0: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55 52  ROWS BETWEEN CUR
cbc0: 52 45 4e 54 20 2e 2e 2e 20 55 4e 42 4f 55 4e 44  RENT ... UNBOUND
cbd0: 45 44 2e 2e 2e 22 20 74 6f 0a 2a 2a 20 20 20 62  ED..." to.**   b
cbe0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77 68 69  e:.**.**     whi
cbf0: 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
cc00: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
cc10: 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  ue).**       whi
cc20: 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
cc30: 20 20 20 20 72 65 67 50 65 65 72 2b 2b 0a 2a 2a      regPeer++.**
cc40: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
cc50: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
cc60: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
cc90: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
cca0: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  _done.**        
ccb0: 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 20   if( new peer ) 
ccc0: 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20  break;.**       
ccd0: 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65  }.**       while
cce0: 28 20 28 72 65 67 50 65 65 72 2d 2d 29 3e 30 20  ( (regPeer--)>0 
ccf0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
cd00: 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61  gInverse (csrSta
cd10: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e  rt).**         N
cd20: 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
cd30: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
cd40: 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  }.**.** ROWS BET
cd50: 57 45 45 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  WEEN <expr> FOLL
cd60: 4f 57 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78  OWING    AND <ex
cd70: 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  pr> FOLLOWING.**
cd80: 0a 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72  .**   regEnd = r
cd90: 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74  egEnd - regStart
cda0: 0a 2a 2a 20 20 20 52 65 77 69 6e 64 20 28 63 73  .**   Rewind (cs
cdb0: 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e  r,csrStart,csrEn
cdc0: 64 29 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67  d)   // if EOF g
cdd0: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
cde0: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
cdf0: 41 67 67 73 74 65 70 20 28 63 73 72 45 6e 64 29  Aggstep (csrEnd)
ce00: 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72  .**     Next(csr
ce10: 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20  End)            
ce20: 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 66       // if EOF f
ce30: 61 6c 6c 2d 74 68 72 6f 75 67 68 0a 2a 2a 20 20  all-through.**  
ce40: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
ce50: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
ce60: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
ce70: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
ce80: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
ce90: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  lue).**         
cea0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
ceb0: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
cec0: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
ced0: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
cee0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
cef0: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 7d  _done.**       }
cf00: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 49 6e 76  .**       AggInv
cf10: 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29 0a  erse (csrStart).
cf20: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28 63  **       Next (c
cf30: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
cf40: 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  }.**.** ROWS BET
cf50: 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43  WEEN <expr> PREC
cf60: 45 44 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78  EDING    AND <ex
cf70: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a  pr> PRECEDING.**
cf80: 0a 2a 2a 20 20 20 52 65 70 6c 61 63 65 20 74 68  .**   Replace th
cf90: 65 20 62 69 74 20 61 66 74 65 72 20 22 52 65 77  e bit after "Rew
cfa0: 69 6e 64 22 20 69 6e 20 74 68 65 20 61 62 6f 76  ind" in the abov
cfb0: 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  e with:.**.**   
cfc0: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
cfd0: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
cfe0: 41 67 67 53 74 65 70 20 28 63 73 72 45 6e 64 29  AggStep (csrEnd)
cff0: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28  .**       Next (
d000: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d  csrEnd).**     }
d010: 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c  .**     AggFinal
d020: 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20   (xValue).**    
d030: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
d040: 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72  .**     Next(csr
d050: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
d060: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
d070: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
d080: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 69 66  n_done.**     if
d090: 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
d0a0: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  0 ){.**       Ag
d0b0: 67 49 6e 76 65 72 73 65 20 28 63 73 72 32 29 0a  gInverse (csr2).
d0c0: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28 63  **       Next (c
d0d0: 73 72 32 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  sr2).**     }.**
d0e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d0f0: 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70  windowCodeRowExp
d100: 72 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a  rStep(.  Parse *
d110: 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63  pParse, .  Selec
d120: 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66  t *p,.  WhereInf
d130: 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74  o *pWInfo,.  int
d140: 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e   regGosub, .  in
d150: 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20  t addrGosub.){. 
d160: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
d170: 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65   p->pWin;.  Vdbe
d180: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
d190: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d1a0: 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74  int regFlushPart
d1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d1c0: 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
d1d0: 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72  "Gosub flush_par
d1e0: 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  tition" */.  int
d1f0: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 20 20   lblFlushPart;  
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d210: 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75 62  Label for "Gosub
d220: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
d230: 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  " */.  int lblFl
d240: 75 73 68 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  ushDone;        
d250: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
d260: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
d270: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 22  _partition_done"
d280: 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 65 67 41 72   */..  int regAr
d290: 67 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  g;.  int addr;. 
d2a0: 20 69 6e 74 20 63 73 72 53 74 61 72 74 20 3d 20   int csrStart = 
d2b0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d2c0: 20 20 69 6e 74 20 63 73 72 45 6e 64 20 3d 20 70    int csrEnd = p
d2d0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d2e0: 20 69 6e 74 20 72 65 67 53 74 61 72 74 3b 20 20   int regStart;  
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d300: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65    /* Value of <e
d310: 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a  xpr> PRECEDING *
d320: 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 3b 20  /.  int regEnd; 
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
d350: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
d360: 47 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  G */.  int addrG
d370: 6f 74 6f 3b 0a 20 20 69 6e 74 20 61 64 64 72 54  oto;.  int addrT
d380: 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66  op;.  int addrIf
d390: 50 6f 73 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Pos1 = 0;.  int 
d3a0: 61 64 64 72 49 66 50 6f 73 32 20 3d 20 30 3b 0a  addrIfPos2 = 0;.
d3b0: 20 20 69 6e 74 20 72 65 67 53 69 7a 65 20 3d 20    int regSize = 
d3c0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d  0;..  assert( pM
d3d0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
d3e0: 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20 20 20  PRECEDING .     
d3f0: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
d400: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  rt==TK_CURRENT .
d410: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
d420: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
d430: 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c  OWING .       ||
d440: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
d450: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20  TK_UNBOUNDED .  
d460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  );.  assert( pMW
d470: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
d480: 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20 7c  LOWING .       |
d490: 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  | pMWin->eEnd==T
d4a0: 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20  K_CURRENT .     
d4b0: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64    || pMWin->eEnd
d4c0: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a  ==TK_UNBOUNDED .
d4d0: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
d4e0: 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44  >eEnd==TK_PRECED
d4f0: 49 4e 47 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  ING .  );..  /* 
d500: 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65  Allocate registe
d510: 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f 72 20  r and label for 
d520: 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69  the "flush_parti
d530: 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74 69 6e  tion" sub-routin
d540: 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75 73 68  e. */.  regFlush
d550: 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Part = ++pParse-
d560: 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75 73  >nMem;.  lblFlus
d570: 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  hPart = sqlite3V
d580: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
d590: 0a 20 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 20  .  lblFlushDone 
d5a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
d5b0: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 72 65  eLabel(v);..  re
d5c0: 67 53 74 61 72 74 20 3d 20 2b 2b 70 50 61 72 73  gStart = ++pPars
d5d0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6e  e->nMem;.  regEn
d5e0: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
d5f0: 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72  em;..  windowPar
d600: 74 69 74 69 6f 6e 43 61 63 68 65 28 70 50 61 72  titionCache(pPar
d610: 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72  se, p, pWInfo, r
d620: 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c  egFlushPart, lbl
d630: 46 6c 75 73 68 50 61 72 74 2c 20 26 72 65 67 53  FlushPart, &regS
d640: 69 7a 65 29 3b 0a 0a 20 20 61 64 64 72 47 6f 74  ize);..  addrGot
d650: 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  o = sqlite3VdbeA
d660: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
d670: 29 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f  );..  /* Start o
d680: 66 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69  f "flush_partiti
d690: 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on" */.  sqlite3
d6a0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d6b0: 28 76 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74  (v, lblFlushPart
d6c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d6d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63  AddOp2(v, OP_Onc
d6e0: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62  e, 0, sqlite3Vdb
d6f0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
d700: 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  3);.  VdbeCovera
d710: 67 65 28 76 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ge(v);.  VdbeCom
d720: 6d 65 6e 74 28 28 76 2c 20 22 46 6c 75 73 68 5f  ment((v, "Flush_
d730: 70 61 72 74 69 74 69 6f 6e 20 73 75 62 72 6f 75  partition subrou
d740: 74 69 6e 65 22 29 29 3b 0a 20 20 73 71 6c 69 74  tine"));.  sqlit
d750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
d760: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 53  OP_OpenDup, csrS
d770: 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  tart, pMWin->iEp
d780: 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  hCsr);.  sqlite3
d790: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
d7a0: 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e 64  _OpenDup, csrEnd
d7b0: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
d7c0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74 68  );..  /* If eith
d7d0: 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20 72  er regStart or r
d7e0: 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e 6f  egEnd are not no
d7f0: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
d800: 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a 2a  ers, throw .  **
d810: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20   an exception.  
d820: 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
d830: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71  pStart ){.    sq
d840: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d850: 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74  arse, pMWin->pSt
d860: 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a  art, regStart);.
d870: 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 49      windowCheckI
d880: 6e 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  ntValue(pParse, 
d890: 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20  regStart, 0);.  
d8a0: 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  }.  if( pMWin->p
d8b0: 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  End ){.    sqlit
d8c0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d8d0: 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20  e, pMWin->pEnd, 
d8e0: 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69 6e  regEnd);.    win
d8f0: 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65  dowCheckIntValue
d900: 28 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64 2c  (pParse, regEnd,
d910: 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   1);.  }..  /* I
d920: 66 20 74 68 69 73 20 69 73 20 22 52 4f 57 53 20  f this is "ROWS 
d930: 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e  <expr1> FOLLOWIN
d940: 47 20 41 4e 44 20 52 4f 57 53 20 3c 65 78 70 72  G AND ROWS <expr
d950: 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2c 20 64  2> FOLLOWING", d
d960: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 69  o:.  **.  **   i
d970: 66 28 20 72 65 67 45 6e 64 3c 72 65 67 53 74 61  f( regEnd<regSta
d980: 72 74 20 29 7b 0a 20 20 2a 2a 20 20 20 20 20 2f  rt ){.  **     /
d990: 2f 20 54 68 65 20 66 72 61 6d 65 20 61 6c 77 61  / The frame alwa
d9a0: 79 73 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30  ys consists of 0
d9b0: 20 72 6f 77 73 0a 20 20 2a 2a 20 20 20 20 20 72   rows.  **     r
d9c0: 65 67 53 74 61 72 74 20 3d 20 72 65 67 53 69 7a  egStart = regSiz
d9d0: 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20 20 2a 2a  e;.  **   }.  **
d9e0: 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67 45     regEnd = regE
d9f0: 6e 64 20 2d 20 72 65 67 53 74 61 72 74 3b 0a 20  nd - regStart;. 
da00: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
da10: 3e 70 45 6e 64 20 26 26 20 70 4d 57 69 6e 2d 3e  >pEnd && pMWin->
da20: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
da30: 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73 65  WING ){.    asse
da40: 72 74 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72  rt( pMWin->pStar
da50: 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
da60: 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  rt( pMWin->eEnd=
da70: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b  =TK_FOLLOWING );
da80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
da90: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c  AddOp3(v, OP_Ge,
daa0: 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c 69 74   regStart, sqlit
dab0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
dac0: 72 28 76 29 2b 32 2c 20 72 65 67 45 6e 64 29 3b  r(v)+2, regEnd);
dad0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
dae0: 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20  eNeverNull(v);. 
daf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
db00: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
db10: 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53 74 61   regSize, regSta
db20: 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rt);.    sqlite3
db30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
db40: 5f 53 75 62 74 72 61 63 74 2c 20 72 65 67 53 74  _Subtract, regSt
db50: 61 72 74 2c 20 72 65 67 45 6e 64 2c 20 72 65 67  art, regEnd, reg
db60: 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  End);.  }..  if(
db70: 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 20 26   pMWin->pStart &
db80: 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
db90: 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20  K_PRECEDING ){. 
dba0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
dbb0: 2d 3e 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20  ->pEnd!=0 );.   
dbc0: 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e   assert( pMWin->
dbd0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
dbe0: 44 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69  DING );.    sqli
dbf0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
dc00: 20 4f 50 5f 4c 65 2c 20 72 65 67 53 74 61 72 74   OP_Le, regStart
dc10: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
dc20: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 2c 20 72  rentAddr(v)+3, r
dc30: 65 67 45 6e 64 29 3b 0a 20 20 20 20 56 64 62 65  egEnd);.    Vdbe
dc40: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
dc50: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
dc60: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dc70: 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c  P_Copy, regSize,
dc80: 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20   regStart);.    
dc90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dca0: 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
dcb0: 67 53 69 7a 65 2c 20 72 65 67 45 6e 64 29 3b 0a  gSize, regEnd);.
dcc0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
dcd0: 6c 69 7a 65 20 74 68 65 20 61 63 63 75 6d 75 6c  lize the accumul
dce0: 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f  ator register fo
dcf0: 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75  r each window fu
dd00: 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20 2a  nction to NULL *
dd10: 2f 0a 20 20 72 65 67 41 72 67 20 3d 20 77 69 6e  /.  regArg = win
dd20: 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70 50 61  dowInitAccum(pPa
dd30: 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20  rse, pMWin);..  
dd40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dd50: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
dd60: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
dd70: 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20  lblFlushDone);. 
dd80: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dd90: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
dda0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
ddb0: 6e 64 2c 20 63 73 72 53 74 61 72 74 2c 20 6c 62  nd, csrStart, lb
ddc0: 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 56  lFlushDone);.  V
ddd0: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
dde0: 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c 69  Taken(v);.  sqli
ddf0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
de00: 76 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  v, 1);.  sqlite3
de10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
de20: 5f 52 65 77 69 6e 64 2c 20 63 73 72 45 6e 64 2c  _Rewind, csrEnd,
de30: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a   lblFlushDone);.
de40: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
de50: 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73  verTaken(v);.  s
de60: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
de70: 50 35 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20  P5(v, 1);..  /* 
de80: 49 6e 76 6f 6b 65 20 41 67 67 53 74 65 70 20 66  Invoke AggStep f
de90: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  unction for each
dea0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
deb0: 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77 20 74   using the row t
dec0: 68 61 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64 20  hat.  ** csrEnd 
ded0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
dee0: 20 74 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72 45   to. Or, if csrE
def0: 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  nd is already at
df00: 20 45 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f   EOF,.  ** do no
df10: 74 68 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64 64  thing.  */.  add
df20: 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
df30: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
df40: 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65  ;.  if( pMWin->e
df50: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
df60: 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50  G ){.    addrIfP
df70: 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  os1 = sqlite3Vdb
df80: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
df90: 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c  Pos, regEnd, 0 ,
dfa0: 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76   1);.    VdbeCov
dfb0: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
dfc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dfd0: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
dfe0: 72 45 6e 64 2c 20 73 71 6c 69 74 65 33 56 64 62  rEnd, sqlite3Vdb
dff0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e000: 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  2);.  VdbeCovera
e010: 67 65 28 76 29 3b 0a 20 20 61 64 64 72 20 3d 20  ge(v);.  addr = 
e020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e030: 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
e040: 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
e050: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73  Parse, pMWin, cs
e060: 72 45 6e 64 2c 20 30 2c 20 72 65 67 41 72 67 2c  rEnd, 0, regArg,
e070: 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 69 66 28   regSize);.  if(
e080: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
e090: 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
e0a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e0b0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
e0c0: 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
e0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e0e0: 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
e0f0: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c     addrTop = sql
e100: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e110: 64 64 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  ddr(v);.  }else{
e120: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e130: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
e140: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e  );.    if( pMWin
e150: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45  ->eEnd==TK_PRECE
e160: 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71  DING ){.      sq
e170: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e180: 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29  e(v, addrIfPos1)
e190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
e1a0: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
e1b0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
e1c0: 20 20 20 20 61 64 64 72 49 66 50 6f 73 31 20 3d      addrIfPos1 =
e1d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e1e0: 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
e1f0: 72 65 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b 0a  regEnd, 0 , 1);.
e200: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
e210: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
e220: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
e230: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
e240: 20 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20 73    addrIfPos2 = s
e250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e260: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
e270: 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b 0a  gStart, 0 , 1);.
e280: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
e290: 28 76 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 64 6f  (v);.  }.  windo
e2a0: 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
e2b0: 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 77  , pMWin, 0);.  w
e2c0: 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
e2d0: 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  w(pParse, pMWin,
e2e0: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
e2f0: 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  osub);.  sqlite3
e300: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e310: 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  _Next, pMWin->iE
e320: 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56 64  phCsr, sqlite3Vd
e330: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e340: 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  +2);.  VdbeCover
e350: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
e360: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e370: 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 46 6c  P_Goto, 0, lblFl
e380: 75 73 68 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20  ushDone);.  if( 
e390: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
e3a0: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
e3b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e3c0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
e3d0: 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Pos2);.  }..  if
e3e0: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
e3f0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
e400: 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  || pMWin->eStart
e410: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a  ==TK_PRECEDING .
e420: 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74     || pMWin->eSt
e430: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
e440: 47 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  G .  ){.    int 
e450: 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 20 3d  lblSkipInverse =
e460: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
e470: 4c 61 62 65 6c 28 76 29 3b 3b 0a 20 20 20 20 69  Label(v);;.    i
e480: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
e490: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
e4a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e4b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
e4c0: 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c  IfPos, regStart,
e4d0: 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 2c   lblSkipInverse,
e4e0: 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
e4f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
e500: 7d 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  }.    if( pMWin-
e510: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
e520: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73  OWING ){.      s
e530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e540: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72  (v, OP_Next, csr
e550: 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64  Start, sqlite3Vd
e560: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e570: 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
e580: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
e590: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e5a0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
e5b0: 30 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73  0, lblSkipInvers
e5c0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
e5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e5e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
e5f0: 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c  t, csrStart, sql
e600: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
e610: 64 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20 20  ddr(v)+1);.     
e620: 20 56 64 62 65 43 6f 76 65 72 61 67 65 41 6c 77   VdbeCoverageAlw
e630: 61 79 73 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20  aysTaken(v);.   
e640: 20 7d 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67   }.    windowAgg
e650: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
e660: 69 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c  in, csrStart, 1,
e670: 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65   regArg, regSize
e680: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
e690: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
e6a0: 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65  , lblSkipInverse
e6b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57  );.  }.  if( pMW
e6c0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
e6d0: 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71  LOWING ){.    sq
e6e0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e6f0: 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29  e(v, addrIfPos1)
e700: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
e710: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e720: 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70  Goto, 0, addrTop
e730: 29 3b 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70  );..  /* flush_p
e740: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a  artition_done: *
e750: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
e760: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
e770: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
e780: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e790: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
e7a0: 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ter, pMWin->iEph
e7b0: 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Csr);.  sqlite3V
e7c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e7d0: 52 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68  Return, regFlush
e7e0: 50 61 72 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d  Part);.  VdbeCom
e7f0: 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 66 6c  ment((v, "end fl
e800: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75  ush_partition su
e810: 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 0a 20 20  broutine"));..  
e820: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
e830: 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75  to skip over flu
e840: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a  sh_partition */.
e850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e860: 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74  pHere(v, addrGot
e870: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  o);.}../*.** Thi
e880: 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
e890: 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 71 6c 69  the work of sqli
e8a0: 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65  te3WindowCodeSte
e8b0: 70 28 29 20 66 6f 72 20 63 61 73 65 73 20 74 68  p() for cases th
e8c0: 61 74 0a 2a 2a 20 77 6f 75 6c 64 20 6e 6f 72 6d  at.** would norm
e8d0: 61 6c 6c 79 20 62 65 20 68 61 6e 64 6c 65 64 20  ally be handled 
e8e0: 62 79 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  by windowCodeDef
e8f0: 61 75 6c 74 53 74 65 70 28 29 20 77 68 65 6e 20  aultStep() when 
e900: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 6e 65  there are.** one
e910: 20 6f 72 20 6d 6f 72 65 20 62 75 69 6c 74 2d 69   or more built-i
e920: 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f  n window-functio
e930: 6e 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20  ns that require 
e940: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69  the entire parti
e950: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 63 61  tion.** to be ca
e960: 63 68 65 64 20 69 6e 20 61 20 74 65 6d 70 20 74  ched in a temp t
e970: 61 62 6c 65 20 62 65 66 6f 72 65 20 61 6e 79 20  able before any 
e980: 72 6f 77 73 20 63 61 6e 20 62 65 20 72 65 74 75  rows can be retu
e990: 72 6e 65 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c  rned. Additional
e9a0: 6c 79 2e 0a 2a 2a 20 22 52 41 4e 47 45 20 42 45  ly..** "RANGE BE
e9b0: 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
e9c0: 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20  W AND UNBOUNDED 
e9d0: 46 4f 4c 4c 4f 57 49 4e 47 22 20 69 73 20 61 6c  FOLLOWING" is al
e9e0: 77 61 79 73 20 68 61 6e 64 6c 65 64 20 62 79 0a  ways handled by.
e9f0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
ea00: 2e 0a 2a 2a 0a 2a 2a 20 50 73 65 75 64 6f 2d 63  ..**.** Pseudo-c
ea10: 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ode correspondin
ea20: 67 20 74 6f 20 74 68 65 20 56 4d 20 63 6f 64 65  g to the VM code
ea30: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
ea40: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  is function.** f
ea50: 6f 72 20 65 61 63 68 20 74 79 70 65 20 6f 66 20  or each type of 
ea60: 77 69 6e 64 6f 77 20 66 6f 6c 6c 6f 77 73 2e 0a  window follows..
ea70: 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  **.** RANGE BETW
ea80: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
ea90: 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
eaa0: 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20  ENT ROW.**.**   
eab0: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a  flush_partition:
eac0: 0a 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a  .**     Once {.*
ead0: 2a 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20  *       OpenDup 
eae0: 28 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 4c  (iEphCsr -> csrL
eaf0: 65 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  ead).**     }.**
eb00: 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72       Integer ctr
eb10: 20 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63   0.**     foreac
eb20: 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b  h row (csrLead){
eb30: 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65  .**       if( ne
eb40: 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20  w peer ){.**    
eb50: 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
eb60: 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20  Value).**       
eb70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72    for(i=0; i<ctr
eb80: 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20  ; i++){.**      
eb90: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
eba0: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20  osub.**         
ebb0: 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a    Next iEphCsr.*
ebc0: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
ebd0: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
ebe0: 74 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  tr 0.**       }.
ebf0: 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70  **       AggStep
ec00: 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20   (csrLead).**   
ec10: 20 20 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a 20      Incr ctr.** 
ec20: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
ec30: 41 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c  AggFinal (xFinal
ec40: 69 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72 28  ize).**     for(
ec50: 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29  i=0; i<ctr; i++)
ec60: 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62  {.**       Gosub
ec70: 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
ec80: 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72      Next iEphCsr
ec90: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  .**     }.**.** 
eca0: 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20      ResetSorter 
ecb0: 28 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74  (csr).**     Ret
ecc0: 75 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42  urn.**.** ROWS B
ecd0: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
ece0: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
ecf0: 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a  URRENT ROW.**.**
ed00: 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
ed10: 65 70 74 20 74 68 61 74 20 74 68 65 20 22 69 66  ept that the "if
ed20: 28 20 6e 65 77 20 70 65 65 72 20 29 22 20 62 72  ( new peer )" br
ed30: 61 6e 63 68 20 69 73 20 61 6c 77 61 79 73 20 74  anch is always t
ed40: 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47  aken..**.** RANG
ed50: 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  E BETWEEN CURREN
ed60: 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e  T ROW AND CURREN
ed70: 54 20 52 4f 57 20 0a 2a 2a 0a 2a 2a 20 20 20 41  T ROW .**.**   A
ed80: 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
ed90: 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65  that each of the
eda0: 20 66 6f 72 28 29 20 6c 6f 6f 70 73 20 62 65 63   for() loops bec
edb0: 6f 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  omes:.**.**     
edc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63      for(i=0; i<c
edd0: 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20  tr; i++){.**    
ede0: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
edf0: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
ee00: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
ee10: 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20  iEphCsr).**     
ee20: 20 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43        Next iEphC
ee30: 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  sr.**         }.
ee40: 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57  **.** RANGE BETW
ee50: 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
ee60: 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f  ECEDING AND UNBO
ee70: 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
ee80: 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61  **.**   flush_pa
ee90: 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20  rtition:.**     
eea0: 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Once {.**       
eeb0: 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72  OpenDup (iEphCsr
eec0: 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20   -> csrLead).** 
eed0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72      }.**     for
eee0: 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61  each row (csrLea
eef0: 64 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  d) {.**       Ag
ef00: 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a  gStep (csrLead).
ef10: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
ef20: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 69 45 70  foreach row (iEp
ef30: 68 43 73 72 29 20 7b 0a 2a 2a 20 20 20 20 20 20  hCsr) {.**      
ef40: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
ef50: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a  .**     }.** .**
ef60: 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
ef70: 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55  URRENT ROW AND U
ef80: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
ef90: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68  NG.**.**   flush
efa0: 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20  _partition:.**  
efb0: 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20     Once {.**    
efc0: 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68     OpenDup (iEph
efd0: 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a  Csr -> csrLead).
efe0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
eff0: 66 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72  foreach row (csr
f000: 4c 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20  Lead){.**       
f010: 41 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64  AggStep (csrLead
f020: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
f030: 20 20 52 65 77 69 6e 64 20 28 63 73 72 4c 65 61    Rewind (csrLea
f040: 64 29 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65  d).**     Intege
f050: 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66  r ctr 0.**     f
f060: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
f070: 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ead){.**       i
f080: 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a  f( new peer ){.*
f090: 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e  *         AggFin
f0a0: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
f0b0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
f0c0: 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
f0d0: 20 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20            Gosub 
f0e0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
f0f0: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
f100: 65 20 28 69 45 70 68 43 73 72 29 0a 2a 2a 20 20  e (iEphCsr).**  
f110: 20 20 20 20 20 20 20 20 20 4e 65 78 74 20 69 45           Next iE
f120: 70 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20  phCsr.**        
f130: 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 6e   }.**         In
f140: 74 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20  teger ctr 0.**  
f150: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20       }.**       
f160: 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20 20 20  Incr ctr.**     
f170: 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46  }.**.**     AggF
f180: 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29  inal (xFinalize)
f190: 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  .**     for(i=0;
f1a0: 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a   i<ctr; i++){.**
f1b0: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
f1c0: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
f1d0: 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20  Next iEphCsr.** 
f1e0: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
f1f0: 52 65 73 65 74 53 6f 72 74 65 72 20 28 63 73 72  ResetSorter (csr
f200: 29 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e 0a  ).**     Return.
f210: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f220: 69 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74  indowCodeCacheSt
f230: 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
f240: 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a  rse, .  Select *
f250: 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p,.  WhereInfo *
f260: 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65  pWInfo,.  int re
f270: 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61  gGosub, .  int a
f280: 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69  ddrGosub.){.  Wi
f290: 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d  ndow *pMWin = p-
f2a0: 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76  >pWin;.  Vdbe *v
f2b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
f2c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
f2d0: 20 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   k;.  int addr;.
f2e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
f2f0: 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
f300: 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73  ition;.  ExprLis
f310: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d  t *pOrderBy = pM
f320: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  Win->pOrderBy;. 
f330: 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 70 4f 72   int nPeer = pOr
f340: 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79  derBy ? pOrderBy
f350: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 69  ->nExpr : 0;.  i
f360: 6e 74 20 72 65 67 4e 65 77 50 65 65 72 3b 0a 0a  nt regNewPeer;..
f370: 20 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 20    int addrGoto; 
f380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f390: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
f3a0: 47 6f 74 6f 20 75 73 65 64 20 74 6f 20 6a 75 6d  Goto used to jum
f3b0: 70 20 66 6c 75 73 68 5f 70 61 72 2e 2e 20 2a 2f  p flush_par.. */
f3c0: 0a 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b  .  int addrNext;
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3e0: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
f3f0: 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69  for next iterati
f400: 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  on of loop */.  
f410: 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74  int regFlushPart
f420: 3b 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  ;.  int lblFlush
f430: 50 61 72 74 3b 0a 20 20 69 6e 74 20 63 73 72 4c  Part;.  int csrL
f440: 65 61 64 3b 0a 20 20 69 6e 74 20 72 65 67 43 74  ead;.  int regCt
f450: 72 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b  r;.  int regArg;
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
f480: 20 61 72 72 61 79 20 74 6f 20 6d 61 72 74 69 61   array to martia
f490: 6c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 73 20  l function args 
f4a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 53 69 7a 65  */.  int regSize
f4b0: 3b 0a 20 20 69 6e 74 20 6c 62 6c 45 6d 70 74 79  ;.  int lblEmpty
f4c0: 3b 0a 20 20 69 6e 74 20 62 52 65 76 65 72 73 65  ;.  int bReverse
f4d0: 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   = pMWin->pOrder
f4e0: 42 79 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74  By && pMWin->eSt
f4f0: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
f500: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4d  .          && pM
f510: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
f520: 42 4f 55 4e 44 45 44 3b 0a 0a 20 20 61 73 73 65  BOUNDED;..  asse
f530: 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61  rt( (pMWin->eSta
f540: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
f550: 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
f560: 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20 20  =TK_CURRENT) .  
f570: 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e       || (pMWin->
f580: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
f590: 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
f5a0: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
f5b0: 44 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  D) .       || (p
f5c0: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
f5d0: 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69  _CURRENT && pMWi
f5e0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
f5f0: 45 4e 54 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ENT) .       || 
f600: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
f610: 54 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d  TK_CURRENT && pM
f620: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
f630: 42 4f 55 4e 44 45 44 29 20 0a 20 20 29 3b 0a 0a  BOUNDED) .  );..
f640: 20 20 6c 62 6c 45 6d 70 74 79 20 3d 20 73 71 6c    lblEmpty = sql
f650: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
f660: 6c 28 76 29 3b 0a 20 20 72 65 67 4e 65 77 50 65  l(v);.  regNewPe
f670: 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  er = pParse->nMe
f680: 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
f690: 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a 20  Mem += nPeer;.. 
f6a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67   /* Allocate reg
f6b0: 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20  ister and label 
f6c0: 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70  for the "flush_p
f6d0: 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f  artition" sub-ro
f6e0: 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46  utine. */.  regF
f6f0: 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61  lushPart = ++pPa
f700: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c  rse->nMem;.  lbl
f710: 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69  FlushPart = sqli
f720: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f730: 28 76 29 3b 0a 0a 20 20 63 73 72 4c 65 61 64 20  (v);..  csrLead 
f740: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
f750: 3b 0a 20 20 72 65 67 43 74 72 20 3d 20 2b 2b 70  ;.  regCtr = ++p
f760: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
f770: 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e 43  windowPartitionC
f780: 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 2c 20  ache(pParse, p, 
f790: 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75 73 68  pWInfo, regFlush
f7a0: 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61  Part, lblFlushPa
f7b0: 72 74 2c 20 26 72 65 67 53 69 7a 65 29 3b 0a 20  rt, &regSize);. 
f7c0: 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69   addrGoto = sqli
f7d0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
f7e0: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a   OP_Goto);..  /*
f7f0: 20 53 74 61 72 74 20 6f 66 20 22 66 6c 75 73 68   Start of "flush
f800: 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20  _partition" */. 
f810: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
f820: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46  lveLabel(v, lblF
f830: 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 73 71 6c  lushPart);.  sql
f840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f850: 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71  , OP_Once, 0, sq
f860: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
f870: 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56 64  Addr(v)+2);.  Vd
f880: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
f890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f8a0: 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70  p2(v, OP_OpenDup
f8b0: 2c 20 63 73 72 4c 65 61 64 2c 20 70 4d 57 69 6e  , csrLead, pMWin
f8c0: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20 2f  ->iEphCsr);..  /
f8d0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
f8e0: 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
f8f0: 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
f900: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74  indow function t
f910: 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41  o NULL */.  regA
f920: 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41  rg = windowInitA
f930: 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57  ccum(pParse, pMW
f940: 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56  in);..  sqlite3V
f950: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f960: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43  Integer, 0, regC
f970: 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tr);.  sqlite3Vd
f980: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
f990: 65 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20  ewind, csrLead, 
f9a0: 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64 62  lblEmpty);.  Vdb
f9b0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f9c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f9d0: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
f9e0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
f9f0: 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64 62  lblEmpty);.  Vdb
fa00: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61  eCoverageNeverTa
fa10: 6b 65 6e 28 76 29 3b 0a 0a 20 20 69 66 28 20 62  ken(v);..  if( b
fa20: 52 65 76 65 72 73 65 20 29 7b 0a 20 20 20 20 69  Reverse ){.    i
fa30: 6e 74 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74  nt addr2 = sqlit
fa40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fa50: 72 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  r(v);.    window
fa60: 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
fa70: 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20  pMWin, csrLead, 
fa80: 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69  0, regArg, regSi
fa90: 7a 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ze);.    sqlite3
faa0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fab0: 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61 64 2c 20  _Next, csrLead, 
fac0: 61 64 64 72 32 29 3b 0a 20 20 20 20 56 64 62 65  addr2);.    Vdbe
fad0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fae0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
faf0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
fb00: 20 63 73 72 4c 65 61 64 2c 20 6c 62 6c 45 6d 70   csrLead, lblEmp
fb10: 74 79 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  ty);.    VdbeCov
fb20: 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28  erageNeverTaken(
fb30: 76 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 4e 65  v);.  }.  addrNe
fb40: 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
fb50: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
fb60: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
fb70: 26 26 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  && (pMWin->eEnd=
fb80: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 70  =TK_CURRENT || p
fb90: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
fba0: 5f 43 55 52 52 45 4e 54 29 20 29 7b 0a 20 20 20  _CURRENT) ){.   
fbb0: 20 69 6e 74 20 62 43 75 72 72 65 6e 74 20 3d 20   int bCurrent = 
fbc0: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
fbd0: 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20 20  TK_CURRENT);.   
fbe0: 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20   int addrJump = 
fbf0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
fc00: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
fc10: 4a 75 6d 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  Jump below */.  
fc20: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79    if( pMWin->eTy
fc30: 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a  pe==TK_RANGE ){.
fc40: 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
fc50: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
fc60: 6f 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50  ol + (pPart ? pP
fc70: 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  art->nExpr : 0);
fc80: 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 65  .      int regPe
fc90: 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50  er = pMWin->regP
fca0: 61 72 74 20 2b 20 28 70 50 61 72 74 20 3f 20 70  art + (pPart ? p
fcb0: 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  Part->nExpr : 0)
fcc0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
fcd0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
fce0: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
fcf0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
fd00: 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a  OrderBy, 0, 0);.
fd10: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
fd20: 3c 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20  <nPeer; k++){.  
fd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fd40: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
fd50: 6c 75 6d 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69  lumn, csrLead, i
fd60: 4f 66 66 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65  Off+k, regNewPee
fd70: 72 2b 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r+k);.      }.  
fd80: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
fd90: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
fda0: 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e  OP_Compare, regN
fdb0: 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c  ewPeer, regPeer,
fdc0: 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73   nPeer);.      s
fdd0: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
fde0: 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65  P4(v, (void*)pKe
fdf0: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
fe00: 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75  O);.      addrJu
fe10: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
fe20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
fe30: 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64  p, addr+2, 0, ad
fe40: 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  dr+2);.      Vdb
fe50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
fe60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fe70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
fe80: 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65  , regNewPeer, re
fe90: 67 50 65 65 72 2c 20 6e 50 65 65 72 2d 31 29 3b  gPeer, nPeer-1);
fea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 69 6e 64  .    }..    wind
feb0: 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 70 50 61  owReturnRows(pPa
fec0: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43  rse, pMWin, regC
fed0: 74 72 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  tr, regGosub, ad
fee0: 64 72 47 6f 73 75 62 2c 20 0a 20 20 20 20 20 20  drGosub, .      
fef0: 20 20 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65    (bCurrent ? re
ff00: 67 41 72 67 20 3a 20 30 29 2c 20 28 62 43 75 72  gArg : 0), (bCur
ff10: 72 65 6e 74 20 3f 20 72 65 67 53 69 7a 65 20 3a  rent ? regSize :
ff20: 20 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69   0).    );.    i
ff30: 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71  f( addrJump ) sq
ff40: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
ff50: 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a  e(v, addrJump);.
ff60: 20 20 7d 0a 0a 20 20 69 66 28 20 62 52 65 76 65    }..  if( bReve
ff70: 72 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69  rse==0 ){.    wi
ff80: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
ff90: 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65  se, pMWin, csrLe
ffa0: 61 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72  ad, 0, regArg, r
ffb0: 65 67 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73  egSize);.  }.  s
ffc0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ffd0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72  (v, OP_AddImm, r
ffe0: 65 67 43 74 72 2c 20 31 29 3b 0a 20 20 73 71 6c  egCtr, 1);.  sql
fff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10000 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65  , OP_Next, csrLe
10010 61 64 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  ad, addrNext);. 
10020 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10030 3b 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72  ;..  windowRetur
10040 6e 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d  nRows(pParse, pM
10050 57 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67  Win, regCtr, reg
10060 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
10070 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 73 71 6c 69  , 0, 0);..  sqli
10080 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
10090 62 65 6c 28 76 2c 20 6c 62 6c 45 6d 70 74 79 29  bel(v, lblEmpty)
100a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
100b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65  ddOp1(v, OP_Rese
100c0 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e  tSorter, pMWin->
100d0 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69  iEphCsr);.  sqli
100e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
100f0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46   OP_Return, regF
10100 6c 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a  lushPart);..  /*
10110 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f   Jump to here to
10120 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68   skip over flush
10130 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20  _partition */.  
10140 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
10150 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29  ere(v, addrGoto)
10160 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47  ;.}.../*.** RANG
10170 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
10180 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
10190 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
101a0 0a 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20  .**   ....**    
101b0 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
101c0 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  on ){.**       A
101d0 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
101e0 7a 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  ze).**       Gos
101f0 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
10200 20 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65        ResetSorte
10210 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20  r eph-table.**  
10220 20 20 20 7d 0a 2a 2a 20 20 20 20 20 65 6c 73 65     }.**     else
10230 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b   if( new peer ){
10240 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e  .**       AggFin
10250 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
10260 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
10270 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65  osub.**       Re
10280 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61  setSorter eph-ta
10290 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ble.**     }.** 
102a0 20 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20      AggStep.**  
102b0 20 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72     Insert (recor
102c0 64 20 69 6e 74 6f 20 65 70 68 2d 74 61 62 6c 65  d into eph-table
102d0 29 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 68  ).**   sqlite3Wh
102e0 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 41 67  ereEnd().**   Ag
102f0 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a  gFinal (xFinaliz
10300 65 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20 61 64  e).**   Gosub ad
10310 64 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52 41  drGosub.**.** RA
10320 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
10330 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
10340 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
10350 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LLOWING.**.**   
10360 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  As above, except
10370 20 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e 20   take no action 
10380 66 6f 72 20 61 20 22 6e 65 77 20 70 65 65 72 22  for a "new peer"
10390 2e 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74 68  . Invoke.**   th
103a0 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f 6e  e sub-routine on
103b0 63 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63 68  ce only for each
103c0 20 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a   partition..**.*
103d0 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
103e0 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
103f0 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a  CURRENT ROW.**.*
10400 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78  *   As above, ex
10410 63 65 70 74 20 74 68 61 74 20 74 68 65 20 22 6e  cept that the "n
10420 65 77 20 70 65 65 72 22 20 63 6f 6e 64 69 74 69  ew peer" conditi
10430 6f 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e  on is handled in
10440 20 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20 77   the.**   same w
10450 61 79 20 61 73 20 22 6e 65 77 20 70 61 72 74 69  ay as "new parti
10460 74 69 6f 6e 22 20 28 73 6f 20 74 68 65 72 65 20  tion" (so there 
10470 69 73 20 6e 6f 20 22 65 6c 73 65 20 69 66 22 20  is no "else if" 
10480 62 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52 4f  block)..**.** RO
10490 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  WS BETWEEN UNBOU
104a0 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
104b0 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a  ND CURRENT ROW.*
104c0 2a 20 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65  * .**   As above
104d0 2c 20 65 78 63 65 70 74 20 61 73 73 75 6d 65 20  , except assume 
104e0 65 76 65 72 79 20 72 6f 77 20 69 73 20 61 20 22  every row is a "
104f0 6e 65 77 20 70 65 65 72 22 2e 0a 2a 2f 0a 73 74  new peer"..*/.st
10500 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
10510 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
10520 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10530 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a  , .  Select *p,.
10540 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
10550 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  nfo,.  int regGo
10560 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72  sub, .  int addr
10570 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f  Gosub.){.  Windo
10580 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57  w *pMWin = p->pW
10590 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  in;.  Vdbe *v = 
105a0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
105b0 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b  Parse);.  int k;
105c0 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d  .  int iSubCsr =
105d0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69   p->pSrc->a[0].i
105e0 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53  Cursor;.  int nS
105f0 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
10600 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  0].pTab->nCol;. 
10610 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73   int reg = pPars
10620 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74  e->nMem+1;.  int
10630 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67   regRecord = reg
10640 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67  +nSub;.  int reg
10650 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72  Rowid = regRecor
10660 64 2b 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b  d+1;.  int addr;
10670 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61  .  ExprList *pPa
10680 72 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72  rt = pMWin->pPar
10690 74 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69  tition;.  ExprLi
106a0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
106b0 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  MWin->pOrderBy;.
106c0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e  .  assert( pMWin
106d0 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
106e0 45 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 4d 57  E .      || (pMW
106f0 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55  in->eStart==TK_U
10700 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69  NBOUNDED && pMWi
10710 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  n->eEnd==TK_CURR
10720 45 4e 54 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73  ENT).  );..  ass
10730 65 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74  ert( (pMWin->eSt
10740 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
10750 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
10760 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20  ==TK_CURRENT).  
10770 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e       || (pMWin->
10780 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
10790 4e 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65  NDED && pMWin->e
107a0 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
107b0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  D).       || (pM
107c0 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
107d0 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
107e0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
107f0 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  NT).       || (p
10800 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
10810 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69  _CURRENT && pMWi
10820 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
10830 55 4e 44 45 44 20 26 26 20 21 70 4f 72 64 65 72  UNDED && !pOrder
10840 42 79 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  By).  );..  if( 
10850 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
10860 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
10870 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
10880 20 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   }..  pParse->nM
10890 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a  em += nSub + 2;.
108a0 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 69  .  /* Load the i
108b0 6e 64 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e  ndividual column
108c0 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72   values of the r
108d0 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 0a 20  ow returned by. 
108e0 20 2a 2a 20 74 68 65 20 73 75 62 2d 73 65 6c 65   ** the sub-sele
108f0 63 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ct into an array
10900 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 2a   of registers. *
10910 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e  /.  for(k=0; k<n
10920 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73  Sub; k++){.    s
10930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10940 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
10950 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b  SubCsr, k, reg+k
10960 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
10970 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ck if this is th
10980 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
10990 20 70 61 72 74 69 74 69 6f 6e 20 6f 72 20 70 65   partition or pe
109a0 65 72 20 67 72 6f 75 70 2e 20 2a 2f 0a 20 20 69  er group. */.  i
109b0 66 28 20 70 50 61 72 74 20 7c 7c 20 70 4f 72 64  f( pPart || pOrd
109c0 65 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  erBy ){.    int 
109d0 6e 50 61 72 74 20 3d 20 28 70 50 61 72 74 20 3f  nPart = (pPart ?
109e0 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20   pPart->nExpr : 
109f0 30 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  0);.    int addr
10a00 47 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Goto = 0;.    in
10a10 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 0a  t addrJump = 0;.
10a20 20 20 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20      int nPeer = 
10a30 28 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64  (pOrderBy ? pOrd
10a40 65 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29  erBy->nExpr : 0)
10a50 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72 74  ;..    if( pPart
10a60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   ){.      int re
10a70 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b  gNewPart = reg +
10a80 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
10a90 6f 6c 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  ol;.      KeyInf
10aa0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
10ab0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
10ac0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
10ad0 20 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 20   pPart, 0, 0);. 
10ae0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
10af0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10b00 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
10b10 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e  NewPart, pMWin->
10b20 72 65 67 50 61 72 74 2c 6e 50 61 72 74 29 3b 0a  regPart,nPart);.
10b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b40 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
10b50 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  id*)pKeyInfo, P4
10b60 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
10b70 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69   addrJump = sqli
10b80 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10b90 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32   OP_Jump, addr+2
10ba0 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20  , 0, addr+2);.  
10bb0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
10bc0 45 71 4e 65 28 76 29 3b 0a 20 20 20 20 20 20 77  EqNe(v);.      w
10bd0 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50  indowAggFinal(pP
10be0 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29 3b  arse, pMWin, 1);
10bf0 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
10c00 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rBy ){.        a
10c10 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65  ddrGoto = sqlite
10c20 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10c30 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 7d  P_Goto);.      }
10c40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
10c50 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
10c60 20 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72    int regNewPeer
10c70 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e   = reg + pMWin->
10c80 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 6e 50 61  nBufferCol + nPa
10c90 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  rt;.      int re
10ca0 67 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72  gPeer = pMWin->r
10cb0 65 67 50 61 72 74 20 2b 20 6e 50 61 72 74 3b 0a  egPart + nPart;.
10cc0 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4a  .      if( addrJ
10cd0 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62  ump ) sqlite3Vdb
10ce0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
10cf0 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 69 66  rJump);.      if
10d00 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d  ( pMWin->eType==
10d10 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20  TK_RANGE ){.    
10d20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
10d30 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
10d40 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
10d50 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  st(pParse, pOrde
10d60 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rBy, 0, 0);.    
10d70 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
10d80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10d90 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e  OP_Compare, regN
10da0 65 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c  ewPeer, regPeer,
10db0 20 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 20   nPeer);.       
10dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
10dd0 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70  ndP4(v, (void*)p
10de0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
10df0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 61 64  NFO);.        ad
10e00 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33  drJump = sqlite3
10e10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10e20 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30  _Jump, addr+2, 0
10e30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20  , addr+2);.     
10e40 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
10e50 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
10e60 0a 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d  .        addrJum
10e70 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 0;.      }. 
10e80 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69       windowAggFi
10e90 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
10ea0 6e 2c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  n, pMWin->eStart
10eb0 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20  ==TK_CURRENT);. 
10ec0 20 20 20 20 20 69 66 28 20 61 64 64 72 47 6f 74       if( addrGot
10ed0 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  o ) sqlite3VdbeJ
10ee0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47  umpHere(v, addrG
10ef0 6f 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  oto);.    }..   
10f00 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10f10 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
10f20 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
10f30 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10f40 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
10f50 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
10f60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10f70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
10f80 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20  osub, regGosub, 
10f90 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20  addrGosub);.    
10fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10fb0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d  2(v, OP_Next, pM
10fc0 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71  Win->iEphCsr, sq
10fd0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
10fe0 41 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 20 20  Addr(v)-1);.    
10ff0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
11000 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
11010 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
11020 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e  setSorter, pMWin
11030 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
11040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11050 33 28 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50  3(.        v, OP
11060 5f 43 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e  _Copy, reg+pMWin
11070 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d  ->nBufferCol, pM
11080 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50  Win->regPart, nP
11090 61 72 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20  art+nPeer-1.    
110a0 29 3b 0a 0a 20 20 20 20 69 66 28 20 61 64 64 72  );..    if( addr
110b0 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64  Jump ) sqlite3Vd
110c0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
110d0 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20  drJump);.  }..  
110e0 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66  /* Invoke step f
110f0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64  unction for wind
11100 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ow functions */.
11110 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
11120 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 2d  pParse, pMWin, -
11130 31 2c 20 30 2c 20 72 65 67 2c 20 30 29 3b 0a 0a  1, 0, reg, 0);..
11140 20 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20    /* Buffer the 
11150 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74  current row in t
11160 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
11170 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57  le. */.  if( pMW
11180 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30  in->nBufferCol>0
11190 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
111a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
111b0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c  MakeRecord, reg,
111c0 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
111d0 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
111e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
111f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11200 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65  , OP_Blob, 0, re
11210 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71  gRecord);.    sq
11220 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
11230 34 28 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20  4(v, (void*)"", 
11240 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
11250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11260 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69  P_NewRowid, pMWi
11270 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
11280 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
11290 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
112a0 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e  _Insert, pMWin->
112b0 69 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f  iEphCsr, regReco
112c0 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  rd, regRowid);..
112d0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
112e0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
112f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65   */.  sqlite3Whe
11300 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a  reEnd(pWInfo);..
11310 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c    windowAggFinal
11320 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
11330 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
11340 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
11350 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  wind, pMWin->iEp
11360 68 43 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65  hCsr,sqlite3Vdbe
11370 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
11380 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
11390 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
113a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
113b0 47 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c  Gosub, regGosub,
113c0 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73   addrGosub);.  s
113d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
113e0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57  (v, OP_Next, pMW
113f0 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c  in->iEphCsr, sql
11400 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
11410 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 56 64 62  ddr(v)-1);.  Vdb
11420 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 7d 0a  eCoverage(v);.}.
11430 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
11440 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70  and return a dup
11450 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69  licate of the Wi
11460 6e 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69  ndow object indi
11470 63 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  cated by the.** 
11480 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20  third argument. 
11490 53 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70  Set the Window.p
114a0 4f 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74  Owner field of t
114b0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f  he new object to
114c0 0a 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57  .** pOwner..*/.W
114d0 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69  indow *sqlite3Wi
114e0 6e 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20  ndowDup(sqlite3 
114f0 2a 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65  *db, Expr *pOwne
11500 72 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20  r, Window *p){. 
11510 20 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20   Window *pNew = 
11520 30 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  0;.  if( ALWAYS(
11530 70 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  p) ){.    pNew =
11540 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11550 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
11560 57 69 6e 64 6f 77 29 29 3b 0a 20 20 20 20 69 66  Window));.    if
11570 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
11580 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
11590 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
115a0 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
115b0 20 20 20 70 4e 65 77 2d 3e 70 46 69 6c 74 65 72     pNew->pFilter
115c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
115d0 70 28 64 62 2c 20 70 2d 3e 70 46 69 6c 74 65 72  p(db, p->pFilter
115e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
115f0 2d 3e 70 46 75 6e 63 20 3d 20 70 2d 3e 70 46 75  ->pFunc = p->pFu
11600 6e 63 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  nc;.      pNew->
11610 70 50 61 72 74 69 74 69 6f 6e 20 3d 20 73 71 6c  pPartition = sql
11620 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
11630 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69 6f  db, p->pPartitio
11640 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  n, 0);.      pNe
11650 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  w->pOrderBy = sq
11660 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
11670 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
11680 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  , 0);.      pNew
11690 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 65 54 79  ->eType = p->eTy
116a0 70 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  pe;.      pNew->
116b0 65 45 6e 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a  eEnd = p->eEnd;.
116c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 53 74 61        pNew->eSta
116d0 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b 0a  rt = p->eStart;.
116e0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 53 74 61        pNew->pSta
116f0 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rt = sqlite3Expr
11700 44 75 70 28 64 62 2c 20 70 2d 3e 70 53 74 61 72  Dup(db, p->pStar
11710 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  t, 0);.      pNe
11720 77 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65  w->pEnd = sqlite
11730 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
11740 70 45 6e 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  pEnd, 0);.      
11750 70 4e 65 77 2d 3e 70 4f 77 6e 65 72 20 3d 20 70  pNew->pOwner = p
11760 4f 77 6e 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Owner;.    }.  }
11770 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
11780 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11790 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 69  a copy of the li
117a0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 69 6e  nked list of Win
117b0 64 6f 77 20 6f 62 6a 65 63 74 73 20 70 61 73 73  dow objects pass
117c0 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63  ed as the.** sec
117d0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
117e0 0a 57 69 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33  .Window *sqlite3
117f0 57 69 6e 64 6f 77 4c 69 73 74 44 75 70 28 73 71  WindowListDup(sq
11800 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 6e 64 6f  lite3 *db, Windo
11810 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20  w *p){.  Window 
11820 2a 70 57 69 6e 3b 0a 20 20 57 69 6e 64 6f 77 20  *pWin;.  Window 
11830 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 57 69 6e  *pRet = 0;.  Win
11840 64 6f 77 20 2a 2a 70 70 20 3d 20 26 70 52 65 74  dow **pp = &pRet
11850 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 3b  ;..  for(pWin=p;
11860 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e   pWin; pWin=pWin
11870 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
11880 20 2a 70 70 20 3d 20 73 71 6c 69 74 65 33 57 69   *pp = sqlite3Wi
11890 6e 64 6f 77 44 75 70 28 64 62 2c 20 30 2c 20 70  ndowDup(db, 0, p
118a0 57 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  Win);.    if( *p
118b0 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  p==0 ) break;.  
118c0 20 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e    pp = &((*pp)->
118d0 70 4e 65 78 74 57 69 6e 29 3b 0a 20 20 7d 0a 0a  pNextWin);.  }..
118e0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
118f0 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57  ../*.** sqlite3W
11900 68 65 72 65 42 65 67 69 6e 28 29 20 68 61 73 20  hereBegin() has 
11910 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
11920 6c 65 64 20 66 6f 72 20 74 68 65 20 53 45 4c 45  led for the SELE
11930 43 54 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a  CT statement .**
11940 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
11950 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 77  econd argument w
11960 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
11970 6e 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 49 74  n is invoked. It
11980 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20 63 6f   generates.** co
11990 64 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74  de to populate t
119a0 68 65 20 57 69 6e 64 6f 77 2e 72 65 67 52 65 73  he Window.regRes
119b0 75 6c 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  ult register for
119c0 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
119d0 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 69 6e 76  ction and.** inv
119e0 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74  oke the sub-rout
119f0 69 6e 65 20 61 74 20 69 6e 73 74 72 75 63 74 69  ine at instructi
11a00 6f 6e 20 61 64 64 72 47 6f 73 75 62 20 6f 6e 63  on addrGosub onc
11a10 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77 2e 0a  e for each row..
11a20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11a30 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68   calls sqlite3Wh
11a40 65 72 65 45 6e 64 28 29 20 62 65 66 6f 72 65 20  ereEnd() before 
11a50 72 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2f 0a 76  returning. .*/.v
11a60 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
11a70 77 43 6f 64 65 53 74 65 70 28 0a 20 20 50 61 72  wCodeStep(.  Par
11a80 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11aa0 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
11ab0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 20 20 2f 2a 20 52 65 77 72 69 74 74 65 6e 20     /* Rewritten 
11ae0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11af0 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
11b00 2a 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  *pWInfo,        
11b10 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
11b20 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
11b30 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
11b40 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47 6f 73   */.  int regGos
11b50 75 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ub,             
11b60 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
11b70 72 20 66 6f 72 20 4f 50 5f 47 6f 73 75 62 20 2a  r for OP_Gosub *
11b80 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75  /.  int addrGosu
11b90 62 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b               
11ba0 20 20 20 20 2f 2a 20 4f 50 5f 47 6f 73 75 62 20      /* OP_Gosub 
11bb0 68 65 72 65 20 74 6f 20 72 65 74 75 72 6e 20 65  here to return e
11bc0 61 63 68 20 72 6f 77 20 2a 2f 0a 29 7b 0a 20 20  ach row */.){.  
11bd0 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
11be0 70 2d 3e 70 57 69 6e 3b 0a 0a 20 20 2f 2a 20 54  p->pWin;..  /* T
11bf0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 64  here are three d
11c00 69 66 66 65 72 65 6e 74 20 66 75 6e 63 74 69 6f  ifferent functio
11c10 6e 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  ns that may be u
11c20 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  sed to do the wo
11c30 72 6b 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20  rk.  ** of this 
11c40 6f 6e 65 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  one, depending o
11c50 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
11c60 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
11c70 66 69 63 20 62 75 69 6c 74 2d 69 6e 0a 20 20 2a  fic built-in.  *
11c80 2a 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  * window functio
11c90 6e 73 20 75 73 65 64 20 28 69 66 20 61 6e 79 29  ns used (if any)
11ca0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64  ..  **.  ** wind
11cb0 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65  owCodeRowExprSte
11cc0 70 28 29 20 68 61 6e 64 6c 65 73 20 61 6c 6c 20  p() handles all 
11cd0 22 52 4f 57 53 22 20 77 69 6e 64 6f 77 20 66 72  "ROWS" window fr
11ce0 61 6d 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ames, except for
11cf0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 4f  :.  **.  **   RO
11d00 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  WS BETWEEN UNBOU
11d10 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
11d20 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20  ND CURRENT ROW. 
11d30 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 78 63   **.  ** The exc
11d40 65 70 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  eption is becaus
11d50 65 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45  e windowCodeRowE
11d60 78 70 72 53 74 65 70 28 29 20 69 6d 70 6c 65 6d  xprStep() implem
11d70 65 6e 74 73 20 61 6c 6c 20 77 69 6e 64 6f 77 0a  ents all window.
11d80 20 20 2a 2a 20 66 72 61 6d 65 20 74 79 70 65 73    ** frame types
11d90 20 62 79 20 63 61 63 68 69 6e 67 20 74 68 65 20   by caching the 
11da0 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f 6e  entire partition
11db0 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65   in a temp table
11dc0 2c 20 61 6e 64 0a 20 20 2a 2a 20 22 52 4f 57 53  , and.  ** "ROWS
11dd0 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
11de0 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
11df0 20 43 55 52 52 45 4e 54 20 52 4f 57 22 20 69 73   CURRENT ROW" is
11e00 20 65 61 73 79 20 65 6e 6f 75 67 68 20 74 6f 0a   easy enough to.
11e10 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 77    ** implement w
11e20 69 74 68 6f 75 74 20 73 75 63 68 20 61 20 63 61  ithout such a ca
11e30 63 68 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77  che..  **.  ** w
11e40 69 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74  indowCodeCacheSt
11e50 65 70 28 29 20 69 73 20 75 73 65 64 20 66 6f 72  ep() is used for
11e60 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 41  :.  **.  **   RA
11e70 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52  NGE BETWEEN CURR
11e80 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f  ENT ROW AND UNBO
11e90 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a  UNDED FOLLOWING.
11ea0 20 20 2a 2a 0a 20 20 2a 2a 20 49 74 20 69 73 20    **.  ** It is 
11eb0 61 6c 73 6f 20 75 73 65 64 20 66 6f 72 20 61 6e  also used for an
11ec0 79 74 68 69 6e 67 20 6e 6f 74 20 68 61 6e 64 6c  ything not handl
11ed0 65 64 20 62 79 20 77 69 6e 64 6f 77 43 6f 64 65  ed by windowCode
11ee0 52 6f 77 45 78 70 72 53 74 65 70 28 29 20 0a 20  RowExprStep() . 
11ef0 20 2a 2a 20 74 68 61 74 20 69 6e 76 6f 6b 65 73   ** that invokes
11f00 20 61 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64   a built-in wind
11f10 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ow function that
11f20 20 72 65 71 75 69 72 65 73 20 74 68 65 20 65 6e   requires the en
11f30 74 69 72 65 20 0a 20 20 2a 2a 20 70 61 72 74 69  tire .  ** parti
11f40 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 63 68 65  tion to be cache
11f50 64 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c  d in a temp tabl
11f60 65 20 62 65 66 6f 72 65 20 61 6e 79 20 72 6f 77  e before any row
11f70 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 0a 20  s are returned. 
11f80 20 2a 2a 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61   ** (e.g. nth_va
11f90 6c 75 65 28 29 20 6f 72 20 70 65 72 63 65 6e 74  lue() or percent
11fa0 5f 72 61 6e 6b 28 29 29 2e 0a 20 20 2a 2a 0a 20  _rank())..  **. 
11fb0 20 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 73 73   ** Finally, ass
11fc0 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e  uming there is n
11fd0 6f 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  o built-in windo
11fe0 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  w function that 
11ff0 72 65 71 75 69 72 65 73 0a 20 20 2a 2a 20 74 68  requires.  ** th
12000 65 20 70 61 72 74 69 74 69 6f 6e 20 74 6f 20 62  e partition to b
12010 65 20 63 61 63 68 65 64 2c 20 77 69 6e 64 6f 77  e cached, window
12020 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28  CodeDefaultStep(
12030 29 20 69 73 20 75 73 65 64 20 66 6f 72 3a 0a 20  ) is used for:. 
12040 20 2a 2a 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45   **.  **   RANGE
12050 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
12060 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
12070 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 20 20   CURRENT ROW .  
12080 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
12090 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
120a0 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55  CEDING AND UNBOU
120b0 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20  NDED FOLLOWING. 
120c0 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57   **   RANGE BETW
120d0 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20  EEN CURRENT ROW 
120e0 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20  AND CURRENT ROW 
120f0 0a 20 20 2a 2a 20 20 20 52 4f 57 53 20 42 45 54  .  **   ROWS BET
12100 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
12110 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52  RECEDING AND CUR
12120 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20  RENT ROW.  **.  
12130 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  ** windowCodeDef
12140 61 75 6c 74 53 74 65 70 28 29 20 69 73 20 74 68  aultStep() is th
12150 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20 74 68  e only one of th
12160 65 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  e three function
12170 73 20 74 68 61 74 0a 20 20 2a 2a 20 64 6f 65 73  s that.  ** does
12180 20 6e 6f 74 20 63 61 63 68 65 20 65 61 63 68 20   not cache each 
12190 70 61 72 74 69 74 69 6f 6e 20 69 6e 20 61 20 74  partition in a t
121a0 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65  emp table before
121b0 20 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 20 20   beginning to.  
121c0 2a 2a 20 72 65 74 75 72 6e 20 72 6f 77 73 2e 0a  ** return rows..
121d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e    */.  if( pMWin
121e0 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 4f 57 53  ->eType==TK_ROWS
121f0 20 0a 20 20 20 26 26 20 28 70 4d 57 69 6e 2d 3e   .   && (pMWin->
12200 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55  eStart!=TK_UNBOU
12210 4e 44 45 44 7c 7c 70 4d 57 69 6e 2d 3e 65 45 6e  NDED||pMWin->eEn
12220 64 21 3d 54 4b 5f 43 55 52 52 45 4e 54 7c 7c 21  d!=TK_CURRENT||!
12230 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29  pMWin->pOrderBy)
12240 0a 20 20 29 7b 0a 20 20 20 20 56 64 62 65 4d 6f  .  ){.    VdbeMo
12250 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61  duleComment((pPa
12260 72 73 65 2d 3e 70 56 64 62 65 2c 20 22 42 65 67  rse->pVdbe, "Beg
12270 69 6e 20 52 6f 77 45 78 70 72 53 74 65 70 28 29  in RowExprStep()
12280 22 29 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43  "));.    windowC
12290 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 70  odeRowExprStep(p
122a0 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f  Parse, p, pWInfo
122b0 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
122c0 47 6f 73 75 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  Gosub);.  }else{
122d0 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  .    Window *pWi
122e0 6e 3b 0a 20 20 20 20 69 6e 74 20 62 43 61 63 68  n;.    int bCach
122f0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
12300 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
12310 75 73 65 20 43 61 63 68 65 53 74 65 70 28 29 20  use CacheStep() 
12320 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4d 57 69  */..    if( pMWi
12330 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
12340 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e  RRENT && pMWin->
12350 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
12360 45 44 20 29 7b 0a 20 20 20 20 20 20 62 43 61 63  ED ){.      bCac
12370 68 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  he = 1;.    }els
12380 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 57 69  e{.      for(pWi
12390 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70  n=pMWin; pWin; p
123a0 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
123b0 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 46 75 6e  in){.        Fun
123c0 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57  cDef *pFunc = pW
123d0 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20  in->pFunc;.     
123e0 20 20 20 69 66 28 20 28 70 46 75 6e 63 2d 3e 66     if( (pFunc->f
123f0 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
12400 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49  E_FUNC_WINDOW_SI
12410 5a 45 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ZE).         || 
12420 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e  (pFunc->zName==n
12430 74 68 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20  th_valueName).  
12440 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63         || (pFunc
12450 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76  ->zName==first_v
12460 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 20  alueName).      
12470 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e     || (pFunc->zN
12480 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29 0a 20  ame==leadName). 
12490 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e          || (pFun
124a0 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d  c->zName==lagNam
124b0 65 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  e).        ){.  
124c0 20 20 20 20 20 20 20 20 62 43 61 63 68 65 20 3d          bCache =
124d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
124e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
124f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12500 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
12510 63 61 6c 6c 20 77 69 6e 64 6f 77 43 6f 64 65 44  call windowCodeD
12520 65 66 61 75 6c 74 53 74 65 70 28 29 2e 20 20 2a  efaultStep().  *
12530 2f 0a 20 20 20 20 69 66 28 20 62 43 61 63 68 65  /.    if( bCache
12540 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 4d 6f   ){.      VdbeMo
12550 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61  duleComment((pPa
12560 72 73 65 2d 3e 70 56 64 62 65 2c 20 22 42 65 67  rse->pVdbe, "Beg
12570 69 6e 20 43 61 63 68 65 53 74 65 70 28 29 22 29  in CacheStep()")
12580 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 43  );.      windowC
12590 6f 64 65 43 61 63 68 65 53 74 65 70 28 70 50 61  odeCacheStep(pPa
125a0 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
125b0 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
125c0 73 75 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  sub);.    }else{
125d0 0a 20 20 20 20 20 20 56 64 62 65 4d 6f 64 75 6c  .      VdbeModul
125e0 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65  eComment((pParse
125f0 2d 3e 70 56 64 62 65 2c 20 22 42 65 67 69 6e 20  ->pVdbe, "Begin 
12600 44 65 66 61 75 6c 74 53 74 65 70 28 29 22 29 29  DefaultStep()"))
12610 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 43 6f  ;.      windowCo
12620 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 70 50  deDefaultStep(pP
12630 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
12640 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
12650 6f 73 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  osub);.    }.  }
12660 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
12670 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
12680 46 55 4e 43 20 2a 2f 0a                          FUNC */.