/ Hex Artifact Content
Login

Artifact df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9:


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 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  d(pParse, 0, 0, 
69a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  0);.    if( p->p
69b0: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
69c0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
69d0: 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20  ct = pSub;.     
69e0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
69f0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
6a00: 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  rse, p->pSrc);. 
6a10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6a20: 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70  ExpandSubquery(p
6a30: 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d  Parse, &p->pSrc-
6a40: 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  >a[0]) ){.      
6a50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
6a60: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
6a70: 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  {.        pSub->
6a80: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
6a90: 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 20  xpanded;.       
6aa0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
6ab0: 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20  ~SF_Aggregate;. 
6ac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
6ad0: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
6ae0: 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20   pSub, 0);.     
6af0: 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
6b00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6b10: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
6b20: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
6b30: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
6b40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6b50: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
6b60: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
6b70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6b80: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6b90: 64 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  d ) rc = SQLITE_
6ba0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65  NOMEM;.  }..  re
6bb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6bc0: 2a 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f  * Free the Windo
6bd0: 77 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  w object passed 
6be0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6bf0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
6c00: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c  sqlite3WindowDel
6c10: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
6c20: 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69   Window *p){.  i
6c30: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
6c40: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6c50: 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20  , p->pFilter);. 
6c60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
6c70: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
6c80: 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20  pPartition);.   
6c90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6ca0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
6cb0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
6cc0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6cd0: 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  b, p->pEnd);.   
6ce0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6cf0: 74 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74  te(db, p->pStart
6d00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
6d10: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d  Free(db, p->zNam
6d20: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
6d30: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
6d40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
6d50: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
6d60: 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
6d70: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68  s starting at th
6d80: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6d90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6da0: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65  e3WindowListDele
6db0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
6dc0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68  Window *p){.  wh
6dd0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69  ile( p ){.    Wi
6de0: 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d  ndow *pNext = p-
6df0: 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73  >pNextWin;.    s
6e00: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
6e10: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  te(db, p);.    p
6e20: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
6e30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
6e40: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
6e50: 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f  s an PRECEDING o
6e60: 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73  r FOLLOWING offs
6e70: 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75  et.  The.** valu
6e80: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  e should be a no
6e90: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
6ea0: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
6eb0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f  e is not a.** co
6ec0: 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69  nstant, change i
6ed0: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20  t to NULL.  The 
6ee0: 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73 20  fact that it is 
6ef0: 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  then a non-negat
6f00: 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77  ive.** integer w
6f10: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61  ill be caught la
6f20: 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73 20  ter.  But it is 
6f30: 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f  important not to
6f40: 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62   leave.** variab
6f50: 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  le values in the
6f60: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
6f80: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f   *sqlite3WindowO
6f90: 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65 20  ffsetExpr(Parse 
6fa0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
6fb0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Expr){.  if( 0==
6fc0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
6fd0: 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
6fe0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
6ff0: 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74  E_OBJECT ) sqlit
7000: 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61  e3RenameExprUnma
7010: 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  p(pParse, pExpr)
7020: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7030: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
7040: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  db, pExpr);.    
7050: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
7060: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
7070: 3e 64 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c  >db, TK_NULL, 0,
7080: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
7090: 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pExpr;.}../*.*
70a0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
70b0: 65 74 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64  eturn a new Wind
70c0: 6f 77 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  ow object descri
70d0: 62 69 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65  bing a Window De
70e0: 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e  finition..*/.Win
70f0: 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64  dow *sqlite3Wind
7100: 6f 77 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65  owAlloc(.  Parse
7110: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
7120: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
7130: 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20  */.  int eType, 
7140: 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
7150: 74 79 70 65 2e 20 54 4b 5f 52 41 4e 47 45 20 6f  type. TK_RANGE o
7160: 72 20 54 4b 5f 52 4f 57 53 20 2a 2f 0a 20 20 69  r TK_ROWS */.  i
7170: 6e 74 20 65 53 74 61 72 74 2c 20 20 20 20 20 20  nt eStart,      
7180: 20 2f 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20   /* Start type: 
7190: 43 55 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49  CURRENT, PRECEDI
71a0: 4e 47 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55  NG, FOLLOWING, U
71b0: 4e 42 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78  NBOUNDED */.  Ex
71c0: 70 72 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  pr *pStart,     
71d0: 2f 2a 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20  /* Start window 
71e0: 73 69 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45  size if TK_PRECE
71f0: 44 49 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e  DING or FOLLOWIN
7200: 47 20 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c  G */.  int eEnd,
7210: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
7220: 74 79 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46  type: CURRENT, F
7230: 4f 4c 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42  OLLOWING, TK_UNB
7240: 4f 55 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e  OUNDED, PRECEDIN
7250: 47 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e  G */.  Expr *pEn
7260: 64 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  d        /* End 
7270: 77 69 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54  window size if T
7280: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50  K_FOLLOWING or P
7290: 52 45 43 45 44 49 4e 47 20 2a 2f 0a 29 7b 0a 20  RECEDING */.){. 
72a0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20   Window *pWin = 
72b0: 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20  0;..  /* Parser 
72c0: 61 73 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c  assures the foll
72d0: 6f 77 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65  owing: */.  asse
72e0: 72 74 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41  rt( eType==TK_RA
72f0: 4e 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b  NGE || eType==TK
7300: 5f 52 4f 57 53 20 29 3b 0a 20 20 61 73 73 65 72  _ROWS );.  asser
7310: 74 28 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  t( eStart==TK_CU
7320: 52 52 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d  RRENT || eStart=
7330: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20  =TK_PRECEDING.  
7340: 20 20 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61           || eSta
7350: 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
7360: 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46   || eStart==TK_F
7370: 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73  OLLOWING );.  as
7380: 73 65 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43  sert( eEnd==TK_C
7390: 55 52 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d  URRENT || eEnd==
73a0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20  TK_FOLLOWING.   
73b0: 20 20 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d          || eEnd=
73c0: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c  =TK_UNBOUNDED ||
73d0: 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44   eEnd==TK_PRECED
73e0: 49 4e 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ING );.  assert(
73f0: 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45   (eStart==TK_PRE
7400: 43 45 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74  CEDING || eStart
7410: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d  ==TK_FOLLOWING)=
7420: 3d 28 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a  =(pStart!=0) );.
7430: 20 20 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d    assert( (eEnd=
7440: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c  =TK_FOLLOWING ||
7450: 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44   eEnd==TK_PRECED
7460: 49 4e 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20  ING)==(pEnd!=0) 
7470: 29 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 61 20 66  );...  /* If a f
7480: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
7490: 20 22 52 41 4e 47 45 22 20 28 6e 6f 74 20 22 52   "RANGE" (not "R
74a0: 4f 57 53 22 29 2c 20 74 68 65 6e 20 69 74 20 6d  OWS"), then it m
74b0: 61 79 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20  ay not use.  ** 
74c0: 65 69 74 68 65 72 20 22 3c 65 78 70 72 3e 20 50  either "<expr> P
74d0: 52 45 43 45 44 49 4e 47 22 20 6f 72 20 22 3c 65  RECEDING" or "<e
74e0: 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2e  xpr> FOLLOWING".
74f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
7500: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 26 26 20 28  e==TK_RANGE && (
7510: 70 53 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e  pStart!=0 || pEn
7520: 64 21 3d 30 29 20 29 7b 0a 20 20 20 20 73 71 6c  d!=0) ){.    sql
7530: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7540: 72 73 65 2c 20 22 52 41 4e 47 45 20 6d 75 73 74  rse, "RANGE must
7550: 20 75 73 65 20 6f 6e 6c 79 20 55 4e 42 4f 55 4e   use only UNBOUN
7560: 44 45 44 20 6f 72 20 43 55 52 52 45 4e 54 20 52  DED or CURRENT R
7570: 4f 57 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77  OW");.    goto w
7580: 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20  indowAllocErr;. 
7590: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f   }..  /* Additio
75a0: 6e 61 6c 6c 79 2c 20 74 68 65 0a 20 20 2a 2a 20  nally, the.  ** 
75b0: 73 74 61 72 74 69 6e 67 20 62 6f 75 6e 64 61 72  starting boundar
75c0: 79 20 74 79 70 65 20 6d 61 79 20 6e 6f 74 20 6f  y type may not o
75d0: 63 63 75 72 20 65 61 72 6c 69 65 72 20 69 6e 20  ccur earlier in 
75e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69  the following li
75f0: 73 74 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65  st than.  ** the
7600: 20 65 6e 64 69 6e 67 20 62 6f 75 6e 64 61 72 79   ending boundary
7610: 20 74 79 70 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   type:.  **.  **
7620: 20 20 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45     UNBOUNDED PRE
7630: 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 3c 65  CEDING.  **   <e
7640: 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 20  xpr> PRECEDING. 
7650: 20 2a 2a 20 20 20 43 55 52 52 45 4e 54 20 52 4f   **   CURRENT RO
7660: 57 0a 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20  W.  **   <expr> 
7670: 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20  FOLLOWING.  **  
7680: 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
7690: 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  WING.  **.  ** T
76a0: 68 65 20 70 61 72 73 65 72 20 65 6e 73 75 72 65  he parser ensure
76b0: 73 20 74 68 61 74 20 22 55 4e 42 4f 55 4e 44 45  s that "UNBOUNDE
76c0: 44 20 50 52 45 43 45 44 49 4e 47 22 20 63 61 6e  D PRECEDING" can
76d0: 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61  not be used as a
76e0: 6e 20 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 6f  n ending.  ** bo
76f0: 75 6e 64 61 72 79 2c 20 61 6e 64 20 74 68 61 6e  undary, and than
7700: 20 22 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c   "UNBOUNDED FOLL
7710: 4f 57 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65  OWING" cannot be
7720: 20 75 73 65 64 20 61 73 20 61 20 73 74 61 72 74   used as a start
7730: 69 6e 67 0a 20 20 2a 2a 20 66 72 61 6d 65 20 62  ing.  ** frame b
7740: 6f 75 6e 64 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  oundary..  */.  
7750: 69 66 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f  if( (eStart==TK_
7760: 43 55 52 52 45 4e 54 20 26 26 20 65 45 6e 64 3d  CURRENT && eEnd=
7770: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 29 0a 20  =TK_PRECEDING). 
7780: 20 20 7c 7c 20 28 65 53 74 61 72 74 3d 3d 54 4b    || (eStart==TK
7790: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 28 65  _FOLLOWING && (e
77a0: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
77b0: 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 43 55  G || eEnd==TK_CU
77c0: 52 52 45 4e 54 29 29 0a 20 20 29 7b 0a 20 20 20  RRENT)).  ){.   
77d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
77e0: 28 70 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70  (pParse, "unsupp
77f0: 6f 72 74 65 64 20 66 72 61 6d 65 20 64 65 6c 69  orted frame deli
7800: 6d 69 74 65 72 20 66 6f 72 20 52 4f 57 53 22 29  miter for ROWS")
7810: 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f  ;.    goto windo
7820: 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a  wAllocErr;.  }..
7830: 20 20 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77    pWin = (Window
7840: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
7850: 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
7860: 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29  , sizeof(Window)
7870: 29 3b 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30  );.  if( pWin==0
7880: 20 29 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c   ) goto windowAl
7890: 6c 6f 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e  locErr;.  pWin->
78a0: 65 54 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20  eType = eType;. 
78b0: 20 70 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20   pWin->eStart = 
78c0: 65 53 74 61 72 74 3b 0a 20 20 70 57 69 6e 2d 3e  eStart;.  pWin->
78d0: 65 45 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 70  eEnd = eEnd;.  p
78e0: 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69  Win->pEnd = sqli
78f0: 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45  te3WindowOffsetE
7900: 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 6e 64  xpr(pParse, pEnd
7910: 29 3b 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61 72  );.  pWin->pStar
7920: 74 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  t = sqlite3Windo
7930: 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61 72  wOffsetExpr(pPar
7940: 73 65 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72  se, pStart);.  r
7950: 65 74 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69 6e  eturn pWin;..win
7960: 64 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20 73  dowAllocErr:.  s
7970: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7980: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 6e  (pParse->db, pEn
7990: 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  d);.  sqlite3Exp
79a0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
79b0: 64 62 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72  db, pStart);.  r
79c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
79d0: 2a 20 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20  * Attach window 
79e0: 6f 62 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65  object pWin to e
79f0: 78 70 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a  xpression p..*/.
7a00: 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64  void sqlite3Wind
7a10: 6f 77 41 74 74 61 63 68 28 50 61 72 73 65 20 2a  owAttach(Parse *
7a20: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
7a30: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a   Window *pWin){.
7a40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
7a50: 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
7a60: 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
7a70: 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
7a80: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
7a90: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 2e 20  for the parser. 
7aa0: 20 49 66 20 70 57 69 6e 20 77 61 73 20 6e 6f 74   If pWin was not
7ab0: 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  .    ** allocate
7ac0: 64 20 64 75 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c  d due to an OOM,
7ad0: 20 74 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   then the parser
7ae0: 20 77 6f 75 6c 64 20 66 61 69 6c 20 62 65 66 6f   would fail befo
7af0: 72 65 20 65 76 65 72 0a 20 20 20 20 2a 2a 20 69  re ever.    ** i
7b00: 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
7b10: 74 69 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  tine */.    if( 
7b20: 41 4c 57 41 59 53 28 70 57 69 6e 29 20 29 7b 0a  ALWAYS(pWin) ){.
7b30: 20 20 20 20 20 20 70 2d 3e 79 2e 70 57 69 6e 20        p->y.pWin 
7b40: 3d 20 70 57 69 6e 3b 0a 20 20 20 20 20 20 45 78  = pWin;.      Ex
7b50: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
7b60: 20 45 50 5f 57 69 6e 46 75 6e 63 29 3b 0a 20 20   EP_WinFunc);.  
7b70: 20 20 20 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72      pWin->pOwner
7b80: 20 3d 20 70 3b 0a 20 20 20 20 20 20 69 66 28 20   = p;.      if( 
7b90: 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69  p->flags & EP_Di
7ba0: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
7bb0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7bc0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
7bd0: 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 20 69       "DISTINCT i
7be0: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  s not supported 
7bf0: 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  for window funct
7c00: 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ions");.      }.
7c10: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
7c20: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
7c30: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
7c40: 62 2c 20 70 57 69 6e 29 3b 0a 20 20 7d 0a 7d 0a  b, pWin);.  }.}.
7c50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  ./*.** Return 0 
7c60: 69 66 20 74 68 65 20 74 77 6f 20 77 69 6e 64 6f  if the two windo
7c70: 77 20 6f 62 6a 65 63 74 73 20 61 72 65 20 69 64  w objects are id
7c80: 65 6e 74 69 63 61 6c 2c 20 6f 72 20 6e 6f 6e 2d  entical, or non-
7c90: 7a 65 72 6f 20 6f 74 68 65 72 77 69 73 65 2e 0a  zero otherwise..
7ca0: 2a 2a 20 49 64 65 6e 74 69 63 61 6c 20 77 69 6e  ** Identical win
7cb0: 64 6f 77 20 6f 62 6a 65 63 74 73 20 63 61 6e 20  dow objects can 
7cc0: 62 65 20 70 72 6f 63 65 73 73 65 64 20 69 6e 20  be processed in 
7cd0: 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 2e 0a 2a  a single scan..*
7ce0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e  /.int sqlite3Win
7cf0: 64 6f 77 43 6f 6d 70 61 72 65 28 50 61 72 73 65  dowCompare(Parse
7d00: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
7d10: 20 2a 70 31 2c 20 57 69 6e 64 6f 77 20 2a 70 32   *p1, Window *p2
7d20: 29 7b 0a 20 20 69 66 28 20 70 31 2d 3e 65 54 79  ){.  if( p1->eTy
7d30: 70 65 21 3d 70 32 2d 3e 65 54 79 70 65 20 29 20  pe!=p2->eType ) 
7d40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
7d50: 70 31 2d 3e 65 53 74 61 72 74 21 3d 70 32 2d 3e  p1->eStart!=p2->
7d60: 65 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  eStart ) return 
7d70: 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 45 6e  1;.  if( p1->eEn
7d80: 64 21 3d 70 32 2d 3e 65 45 6e 64 20 29 20 72 65  d!=p2->eEnd ) re
7d90: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
7da0: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
7db0: 28 70 50 61 72 73 65 2c 20 70 31 2d 3e 70 53 74  (pParse, p1->pSt
7dc0: 61 72 74 2c 20 70 32 2d 3e 70 53 74 61 72 74 2c  art, p2->pStart,
7dd0: 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b   -1) ) return 1;
7de0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
7df0: 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  prCompare(pParse
7e00: 2c 20 70 31 2d 3e 70 45 6e 64 2c 20 70 32 2d 3e  , p1->pEnd, p2->
7e10: 70 45 6e 64 2c 20 2d 31 29 20 29 20 72 65 74 75  pEnd, -1) ) retu
7e20: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
7e30: 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
7e40: 72 65 28 70 31 2d 3e 70 50 61 72 74 69 74 69 6f  re(p1->pPartitio
7e50: 6e 2c 20 70 32 2d 3e 70 50 61 72 74 69 74 69 6f  n, p2->pPartitio
7e60: 6e 2c 20 2d 31 29 20 29 20 72 65 74 75 72 6e 20  n, -1) ) return 
7e70: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
7e80: 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
7e90: 70 31 2d 3e 70 4f 72 64 65 72 42 79 2c 20 70 32  p1->pOrderBy, p2
7ea0: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 20  ->pOrderBy, -1) 
7eb0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
7ec0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
7ed0: 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
7ee0: 20 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65   by code in sele
7ef0: 63 74 2e 63 20 62 65 66 6f 72 65 20 69 74 20 63  ct.c before it c
7f00: 61 6c 6c 73 20 73 71 6c 69 74 65 33 57 68 65 72  alls sqlite3Wher
7f10: 65 42 65 67 69 6e 28 29 0a 2a 2a 20 74 6f 20 62  eBegin().** to b
7f20: 65 67 69 6e 20 69 74 65 72 61 74 69 6e 67 20 74  egin iterating t
7f30: 68 72 6f 75 67 68 20 74 68 65 20 73 75 62 2d 71  hrough the sub-q
7f40: 75 65 72 79 20 72 65 73 75 6c 74 73 2e 20 49 74  uery results. It
7f50: 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
7f60: 63 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  cate.** and init
7f70: 69 61 6c 69 7a 65 20 72 65 67 69 73 74 65 72 73  ialize registers
7f80: 20 61 6e 64 20 63 75 72 73 6f 72 73 20 75 73 65   and cursors use
7f90: 64 20 62 79 20 73 71 6c 69 74 65 33 57 69 6e 64  d by sqlite3Wind
7fa0: 6f 77 43 6f 64 65 53 74 65 70 28 29 2e 0a 2a 2f  owCodeStep()..*/
7fb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e  .void sqlite3Win
7fc0: 64 6f 77 43 6f 64 65 49 6e 69 74 28 50 61 72 73  dowCodeInit(Pars
7fd0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
7fe0: 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 57 69 6e  w *pMWin){.  Win
7ff0: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 56 64 62  dow *pWin;.  Vdb
8000: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
8010: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
8020: 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70 4d   int nPart = (pM
8030: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
8040: 3f 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  ? pMWin->pPartit
8050: 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ion->nExpr : 0);
8060: 0a 20 20 6e 50 61 72 74 20 2b 3d 20 28 70 4d 57  .  nPart += (pMW
8070: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20 70  in->pOrderBy ? p
8080: 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  MWin->pOrderBy->
8090: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 69 66  nExpr : 0);.  if
80a0: 28 20 6e 50 61 72 74 20 29 7b 0a 20 20 20 20 70  ( nPart ){.    p
80b0: 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 3d 20  MWin->regPart = 
80c0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
80d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
80e0: 20 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20 20 73   += nPart;.    s
80f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8100: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
8110: 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20  pMWin->regPart, 
8120: 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2b 6e  pMWin->regPart+n
8130: 50 61 72 74 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  Part-1);.  }..  
8140: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
8150: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
8160: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
8170: 46 75 6e 63 44 65 66 20 2a 70 20 3d 20 70 57 69  FuncDef *p = pWi
8180: 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66  n->pFunc;.    if
8190: 28 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  ( (p->funcFlags 
81a0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
81b0: 4e 4d 41 58 29 20 26 26 20 70 57 69 6e 2d 3e 65  NMAX) && pWin->e
81c0: 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e  Start!=TK_UNBOUN
81d0: 44 45 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  DED ){.      /* 
81e0: 54 68 65 20 69 6e 6c 69 6e 65 20 76 65 72 73 69  The inline versi
81f0: 6f 6e 73 20 6f 66 20 6d 69 6e 28 29 20 61 6e 64  ons of min() and
8200: 20 6d 61 78 28 29 20 72 65 71 75 69 72 65 20 61   max() require a
8210: 20 73 69 6e 67 6c 65 20 65 70 68 65 6d 65 72 61   single ephemera
8220: 6c 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  l.      ** table
8230: 20 61 6e 64 20 33 20 72 65 67 69 73 74 65 72 73   and 3 registers
8240: 2e 20 54 68 65 20 72 65 67 69 73 74 65 72 73 20  . The registers 
8250: 61 72 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c  are used as foll
8260: 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ows:.      **.  
8270: 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b      **   regApp+
8280: 30 3a 20 73 6c 6f 74 20 74 6f 20 63 6f 70 79 20  0: slot to copy 
8290: 6d 69 6e 28 29 2f 6d 61 78 28 29 20 61 72 67 75  min()/max() argu
82a0: 6d 65 6e 74 20 74 6f 20 66 6f 72 20 4d 61 6b 65  ment to for Make
82b0: 52 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2a 20  Record.      ** 
82c0: 20 20 72 65 67 41 70 70 2b 31 3a 20 69 6e 74 65    regApp+1: inte
82d0: 67 65 72 20 76 61 6c 75 65 20 75 73 65 64 20 74  ger value used t
82e0: 6f 20 65 6e 73 75 72 65 20 6b 65 79 73 20 61 72  o ensure keys ar
82f0: 65 20 75 6e 69 71 75 65 0a 20 20 20 20 20 20 2a  e unique.      *
8300: 2a 20 20 20 72 65 67 41 70 70 2b 32 3a 20 6f 75  *   regApp+2: ou
8310: 74 70 75 74 20 6f 66 20 4d 61 6b 65 52 65 63 6f  tput of MakeReco
8320: 72 64 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  rd.      */.    
8330: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8340: 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  t = pWin->pOwner
8350: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  ->x.pList;.     
8360: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
8370: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
8380: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
8390: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 30  pParse, pList, 0
83a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 57 69 6e  , 0);.      pWin
83b0: 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73  ->csrApp = pPars
83c0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
83d0: 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20   pWin->regApp = 
83e0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
83f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
8400: 65 6d 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 69  em += 3;.      i
8410: 66 28 20 70 4b 65 79 49 6e 66 6f 20 26 26 20 70  f( pKeyInfo && p
8420: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d  Win->pFunc->zNam
8430: 65 5b 31 5d 3d 3d 27 69 27 20 29 7b 0a 20 20 20  e[1]=='i' ){.   
8440: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
8450: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
8460: 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  r[0]==0 );.     
8470: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f     pKeyInfo->aSo
8480: 72 74 4f 72 64 65 72 5b 30 5d 20 3d 20 31 3b 0a  rtOrder[0] = 1;.
8490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
84a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
84b0: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
84c0: 72 61 6c 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  ral, pWin->csrAp
84d0: 70 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 2);.      sql
84e0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
84f0: 28 76 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 50 34  (v, pKeyInfo, P4
8500: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
8510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8520: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8530: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  , 0, pWin->regAp
8540: 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p+1);.    }.    
8550: 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d  else if( p->zNam
8560: 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
8570: 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 66 69   || p->zName==fi
8580: 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  rst_valueName ){
8590: 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  .      /* Alloca
85a0: 74 65 20 74 77 6f 20 72 65 67 69 73 74 65 72 73  te two registers
85b0: 20 61 74 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   at pWin->regApp
85c0: 2e 20 54 68 65 73 65 20 77 69 6c 6c 20 62 65 20  . These will be 
85d0: 75 73 65 64 20 74 6f 0a 20 20 20 20 20 20 2a 2a  used to.      **
85e0: 20 73 74 6f 72 65 20 74 68 65 20 73 74 61 72 74   store the start
85f0: 20 61 6e 64 20 65 6e 64 20 69 6e 64 65 78 20 6f   and end index o
8600: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  f the current fr
8610: 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61  ame.  */.      a
8620: 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45  ssert( pMWin->iE
8630: 70 68 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70  phCsr );.      p
8640: 57 69 6e 2d 3e 72 65 67 41 70 70 20 3d 20 70 50  Win->regApp = pP
8650: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
8660: 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70      pWin->csrApp
8670: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
8680: 2b 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  +;.      pParse-
8690: 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a 20 20 20 20  >nMem += 2;.    
86a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
86b0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
86c0: 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  p, pWin->csrApp,
86d0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
86e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
86f0: 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c   if( p->zName==l
8700: 65 61 64 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e  eadName || p->zN
8710: 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a  ame==lagName ){.
8720: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
8730: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a  Win->iEphCsr );.
8740: 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73 72 41        pWin->csrA
8750: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  pp = pParse->nTa
8760: 62 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b++;.      sqlit
8770: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8780: 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e  OP_OpenDup, pWin
8790: 2d 3e 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d  ->csrApp, pMWin-
87a0: 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d  >iEphCsr);.    }
87b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
87c0: 22 50 52 45 43 45 44 49 4e 47 20 3c 65 78 70 72  "PRECEDING <expr
87d0: 3e 22 20 28 65 43 6f 6e 64 3d 3d 30 29 20 6f 72  >" (eCond==0) or
87e0: 20 22 46 4f 4c 4c 4f 57 49 4e 47 20 3c 65 78 70   "FOLLOWING <exp
87f0: 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 31 29 20 6f  r>" (eCond==1) o
8800: 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  r the.** value o
8810: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
8820: 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c  ument to nth_val
8830: 75 65 28 29 20 28 65 43 6f 6e 64 3d 3d 32 29 20  ue() (eCond==2) 
8840: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 0a 2a 2a  has just been.**
8850: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 74   evaluated and t
8860: 68 65 20 72 65 73 75 6c 74 20 6c 65 66 74 20 69  he result left i
8870: 6e 20 72 65 67 69 73 74 65 72 20 72 65 67 2e 20  n register reg. 
8880: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67 65  This function ge
8890: 6e 65 72 61 74 65 73 20 56 4d 0a 2a 2a 20 63 6f  nerates VM.** co
88a0: 64 65 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74  de to check that
88b0: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20   the value is a 
88c0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74  non-negative int
88d0: 65 67 65 72 20 61 6e 64 20 74 68 72 6f 77 73 20  eger and throws 
88e0: 61 6e 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  an.** exception 
88f0: 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2a 2f  if it is not..*/
8900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
8910: 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65  dowCheckIntValue
8920: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8930: 69 6e 74 20 72 65 67 2c 20 69 6e 74 20 65 43 6f  int reg, int eCo
8940: 6e 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  nd){.  static co
8950: 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 72 72 5b  nst char *azErr[
8960: 5d 20 3d 20 7b 0a 20 20 20 20 22 66 72 61 6d 65  ] = {.    "frame
8970: 20 73 74 61 72 74 69 6e 67 20 6f 66 66 73 65 74   starting offset
8980: 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e   must be a non-n
8990: 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72 22  egative integer"
89a0: 2c 0a 20 20 20 20 22 66 72 61 6d 65 20 65 6e 64  ,.    "frame end
89b0: 69 6e 67 20 6f 66 66 73 65 74 20 6d 75 73 74 20  ing offset must 
89c0: 62 65 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  be a non-negativ
89d0: 65 20 69 6e 74 65 67 65 72 22 2c 0a 20 20 20 20  e integer",.    
89e0: 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74  "second argument
89f0: 20 74 6f 20 6e 74 68 5f 76 61 6c 75 65 20 6d 75   to nth_value mu
8a00: 73 74 20 62 65 20 61 20 70 6f 73 69 74 69 76 65  st be a positive
8a10: 20 69 6e 74 65 67 65 72 22 0a 20 20 7d 3b 0a 20   integer".  };. 
8a20: 20 73 74 61 74 69 63 20 69 6e 74 20 61 4f 70 5b   static int aOp[
8a30: 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c 20 4f 50 5f  ] = { OP_Ge, OP_
8a40: 47 65 2c 20 4f 50 5f 47 74 20 7d 3b 0a 20 20 56  Ge, OP_Gt };.  V
8a50: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
8a60: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
8a70: 0a 20 20 69 6e 74 20 72 65 67 5a 65 72 6f 20 3d  .  int regZero =
8a80: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
8a90: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  eg(pParse);.  as
8aa0: 73 65 72 74 28 20 65 43 6f 6e 64 3d 3d 30 20 7c  sert( eCond==0 |
8ab0: 7c 20 65 43 6f 6e 64 3d 3d 31 20 7c 7c 20 65 43  | eCond==1 || eC
8ac0: 6f 6e 64 3d 3d 32 20 29 3b 0a 20 20 73 71 6c 69  ond==2 );.  sqli
8ad0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8ae0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8af0: 72 65 67 5a 65 72 6f 29 3b 0a 20 20 73 71 6c 69  regZero);.  sqli
8b00: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8b10: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 72   OP_MustBeInt, r
8b20: 65 67 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  eg, sqlite3VdbeC
8b30: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
8b40: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
8b50: 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b  If(v, eCond==0);
8b60: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  .  VdbeCoverageI
8b70: 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a  f(v, eCond==1);.
8b80: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
8b90: 28 76 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20  (v, eCond==2);. 
8ba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8bb0: 70 33 28 76 2c 20 61 4f 70 5b 65 43 6f 6e 64 5d  p3(v, aOp[eCond]
8bc0: 2c 20 72 65 67 5a 65 72 6f 2c 20 73 71 6c 69 74  , regZero, sqlit
8bd0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
8be0: 72 28 76 29 2b 32 2c 20 72 65 67 29 3b 0a 20 20  r(v)+2, reg);.  
8bf0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
8c00: 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64  rNullIf(v, eCond
8c10: 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  ==0);.  VdbeCove
8c20: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28  rageNeverNullIf(
8c30: 76 2c 20 65 43 6f 6e 64 3d 3d 31 29 3b 0a 20 20  v, eCond==1);.  
8c40: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
8c50: 72 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64  rNullIf(v, eCond
8c60: 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  ==2);.  sqlite3M
8c70: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
8c80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
8c90: 64 4f 70 32 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp2(v, OP_Halt,
8ca0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 4f   SQLITE_ERROR, O
8cb0: 45 5f 41 62 6f 72 74 29 3b 0a 20 20 73 71 6c 69  E_Abort);.  sqli
8cc0: 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
8cd0: 76 2c 20 28 76 6f 69 64 2a 29 61 7a 45 72 72 5b  v, (void*)azErr[
8ce0: 65 43 6f 6e 64 5d 2c 20 50 34 5f 53 54 41 54 49  eCond], P4_STATI
8cf0: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  C);.  sqlite3Rel
8d00: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
8d10: 73 65 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 7d 0a  se, regZero);.}.
8d20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8d30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  e number of argu
8d40: 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
8d50: 74 68 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  the window-funct
8d60: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ion associated.*
8d70: 2a 20 77 69 74 68 20 74 68 65 20 6f 62 6a 65 63  * with the objec
8d80: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
8d90: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f  only argument to
8da0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
8dc0: 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 57 69 6e  ndowArgCount(Win
8dd0: 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20 45 78  dow *pWin){.  Ex
8de0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
8df0: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
8e00: 70 4c 69 73 74 3b 0a 20 20 72 65 74 75 72 6e 20  pList;.  return 
8e10: 28 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e  (pList ? pList->
8e20: 6e 45 78 70 72 20 3a 20 30 29 3b 0a 7d 0a 0a 2f  nExpr : 0);.}../
8e30: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d  *.** Generate VM
8e40: 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20   code to invoke 
8e50: 65 69 74 68 65 72 20 78 53 74 65 70 28 29 20 28  either xStep() (
8e60: 69 66 20 62 49 6e 76 65 72 73 65 20 69 73 20 30  if bInverse is 0
8e70: 29 20 6f 72 20 0a 2a 2a 20 78 49 6e 76 65 72 73  ) or .** xInvers
8e80: 65 20 28 69 66 20 62 49 6e 76 65 72 73 65 20 69  e (if bInverse i
8e90: 73 20 6e 6f 6e 2d 7a 65 72 6f 29 20 66 6f 72 20  s non-zero) for 
8ea0: 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
8eb0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 0a 2a 2a 20  tion in the .** 
8ec0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
8ed0: 74 69 6e 67 20 61 74 20 70 4d 57 69 6e 2e 20 4f  ting at pMWin. O
8ee0: 72 2c 20 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20  r, for built-in 
8ef0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
8f00: 0a 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  .** that do not 
8f10: 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  use the standard
8f20: 20 66 75 6e 63 74 69 6f 6e 20 41 50 49 2c 20 67   function API, g
8f30: 65 6e 65 72 61 74 65 20 74 68 65 20 72 65 71 75  enerate the requ
8f40: 69 72 65 64 0a 2a 2a 20 69 6e 6c 69 6e 65 20 56  ired.** inline V
8f50: 4d 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  M code..**.** If
8f60: 20 61 72 67 75 6d 65 6e 74 20 63 73 72 20 69 73   argument csr is
8f70: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
8f80: 20 65 71 75 61 6c 20 74 6f 20 30 2c 20 74 68 65   equal to 0, the
8f90: 6e 20 61 72 67 75 6d 65 6e 74 20 72 65 67 20 69  n argument reg i
8fa0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 72  s.** the first r
8fb0: 65 67 69 73 74 65 72 20 69 6e 20 61 6e 20 61 72  egister in an ar
8fc0: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
8fd0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
8fe0: 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
8ff0: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72  h to hold the ar
9000: 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ray of arguments
9010: 20 66 6f 72 20 65 61 63 68 20 66 75 6e 63 74 69   for each functi
9020: 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
9030: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
9040: 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
9050: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
9060: 20 72 6f 77 20 6f 66 20 63 73 72 20 69 6e 74 6f   row of csr into
9070: 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 6f 66   the.** array of
9080: 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f 72   registers befor
9090: 65 20 69 6e 76 6f 6b 69 6e 67 20 4f 50 5f 41 67  e invoking OP_Ag
90a0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 41 67 67 49  gStep or OP_AggI
90b0: 6e 76 65 72 73 65 0a 2a 2a 0a 2a 2a 20 4f 72 2c  nverse.**.** Or,
90c0: 20 69 66 20 63 73 72 20 69 73 20 6c 65 73 73 20   if csr is less 
90d0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
90e0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 72 65 67  the array of reg
90f0: 69 73 74 65 72 73 20 61 74 20 72 65 67 20 69 73  isters at reg is
9100: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 70 6f 70 75  .** already popu
9110: 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20 63  lated with all c
9120: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
9130: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
9140: 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
9150: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
9160: 72 65 67 50 61 72 74 53 69 7a 65 20 69 73 20 6e  regPartSize is n
9170: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74  on-zero, then it
9180: 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 63   is a register c
9190: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 2a 2a  ontaining the.**
91a0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
91b0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  in the current p
91c0: 61 72 74 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  artition..*/.sta
91d0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 41  tic void windowA
91e0: 67 67 53 74 65 70 28 0a 20 20 50 61 72 73 65 20  ggStep(.  Parse 
91f0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
9200: 6f 77 20 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20  ow *pMWin,      
9210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9220: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 77 69  inked list of wi
9230: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ndow functions *
9240: 2f 0a 20 20 69 6e 74 20 63 73 72 2c 20 20 20 20  /.  int csr,    
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9260: 20 20 20 20 2f 2a 20 52 65 61 64 20 61 72 67 75      /* Read argu
9270: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20  ments from this 
9280: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  cursor */.  int 
9290: 62 49 6e 76 65 72 73 65 2c 20 20 20 20 20 20 20  bInverse,       
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
92b0: 72 75 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 49  rue to invoke xI
92c0: 6e 76 65 72 73 65 20 69 6e 73 74 65 61 64 20 6f  nverse instead o
92d0: 66 20 78 53 74 65 70 20 2a 2f 0a 20 20 69 6e 74  f xStep */.  int
92e0: 20 72 65 67 2c 20 20 20 20 20 20 20 20 20 20 20   reg,           
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9300: 41 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  Array of registe
9310: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  rs */.  int regP
9320: 61 72 74 53 69 7a 65 20 20 20 20 20 20 20 20 20  artSize         
9330: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
9340: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  ter containing s
9350: 69 7a 65 20 6f 66 20 70 61 72 74 69 74 69 6f 6e  ize of partition
9360: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
9370: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
9380: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e  e(pParse);.  Win
9390: 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72  dow *pWin;.  for
93a0: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
93b0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
93c0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 6e 74  extWin){.    int
93d0: 20 66 6c 61 67 73 20 3d 20 70 57 69 6e 2d 3e 70   flags = pWin->p
93e0: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 3b  Func->funcFlags;
93f0: 0a 20 20 20 20 69 6e 74 20 72 65 67 41 72 67 3b  .    int regArg;
9400: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  .    int nArg = 
9410: 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70  windowArgCount(p
9420: 57 69 6e 29 3b 0a 0a 20 20 20 20 69 66 28 20 63  Win);..    if( c
9430: 73 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  sr>=0 ){.      i
9440: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
9450: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
9460: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9470: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9480: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20  OP_Column, csr, 
9490: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 69 2c  pWin->iArgCol+i,
94a0: 20 72 65 67 2b 69 29 3b 0a 20 20 20 20 20 20 7d   reg+i);.      }
94b0: 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d 20  .      regArg = 
94c0: 72 65 67 3b 0a 20 20 20 20 20 20 69 66 28 20 66  reg;.      if( f
94d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
94e0: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 20 29  NC_WINDOW_SIZE )
94f0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41  {.        if( nA
9500: 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rg==0 ){.       
9510: 20 20 20 72 65 67 41 72 67 20 3d 20 72 65 67 50     regArg = regP
9520: 61 72 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  artSize;.       
9530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9550: 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
9560: 20 72 65 67 50 61 72 74 53 69 7a 65 2c 20 72 65   regPartSize, re
9570: 67 2b 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 20  g+nArg);.       
9580: 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 72 67 2b   }.        nArg+
9590: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
95a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
95b0: 72 74 28 20 21 28 66 6c 61 67 73 20 26 20 53 51  rt( !(flags & SQ
95c0: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
95d0: 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 20 20  _SIZE) );.      
95e0: 72 65 67 41 72 67 20 3d 20 72 65 67 20 2b 20 70  regArg = reg + p
95f0: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 3b 0a 20 20  Win->iArgCol;.  
9600: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 57    }..    if( (pW
9610: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  in->pFunc->funcF
9620: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
9630: 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20 20 20  NC_MINMAX) .    
9640: 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61 72    && pWin->eStar
9650: 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t!=TK_UNBOUNDED 
9660: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
9670: 74 20 61 64 64 72 49 73 4e 75 6c 6c 20 3d 20 73  t addrIsNull = s
9680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
9690: 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
96a0: 65 67 41 72 67 29 3b 0a 20 20 20 20 20 20 56 64  egArg);.      Vd
96b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
96c0: 20 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73       if( bInvers
96d0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
96e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
96f0: 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  2(v, OP_AddImm, 
9700: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20  pWin->regApp+1, 
9710: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
9720: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9730: 20 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 41 72   OP_SCopy, regAr
9740: 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29  g, pWin->regApp)
9750: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9760: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9770: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 57  P_MakeRecord, pW
9780: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 32 2c 20 70  in->regApp, 2, p
9790: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b 0a  Win->regApp+2);.
97a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
97b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
97c0: 49 64 78 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d  IdxInsert, pWin-
97d0: 3e 63 73 72 41 70 70 2c 20 70 57 69 6e 2d 3e 72  >csrApp, pWin->r
97e0: 65 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20  egApp+2);.      
97f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9810: 49 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45  Int(v, OP_SeekGE
9820: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
9830: 30 2c 20 72 65 67 41 72 67 2c 20 31 29 3b 0a 20  0, regArg, 1);. 
9840: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
9850: 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29  ageNeverTaken(v)
9860: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9870: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
9880: 50 5f 44 65 6c 65 74 65 2c 20 70 57 69 6e 2d 3e  P_Delete, pWin->
9890: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 20  csrApp);.       
98a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
98b0: 48 65 72 65 28 76 2c 20 73 71 6c 69 74 65 33 56  Here(v, sqlite3V
98c0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
98d0: 29 2d 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  )-2);.      }.  
98e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
98f0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
9900: 73 4e 75 6c 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  sNull);.    }els
9910: 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41  e if( pWin->regA
9920: 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pp ){.      asse
9930: 72 74 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d  rt( pWin->pFunc-
9940: 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
9950: 65 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20  eName.          
9960: 20 7c 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d   || pWin->pFunc-
9970: 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61  >zName==first_va
9980: 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  lueName.      );
9990: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62  .      assert( b
99a0: 49 6e 76 65 72 73 65 3d 3d 30 20 7c 7c 20 62 49  Inverse==0 || bI
99b0: 6e 76 65 72 73 65 3d 3d 31 20 29 3b 0a 20 20 20  nverse==1 );.   
99c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
99d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
99e0: 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  m, pWin->regApp+
99f0: 31 2d 62 49 6e 76 65 72 73 65 2c 20 31 29 3b 0a  1-bInverse, 1);.
9a00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57      }else if( pW
9a10: 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  in->pFunc->zName
9a20: 3d 3d 6c 65 61 64 4e 61 6d 65 0a 20 20 20 20 20  ==leadName.     
9a30: 20 20 20 20 20 20 7c 7c 20 70 57 69 6e 2d 3e 70        || pWin->p
9a40: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67  Func->zName==lag
9a50: 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  Name.    ){.    
9a60: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
9a70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
9a80: 6e 74 20 61 64 64 72 49 66 20 3d 20 30 3b 0a 20  nt addrIf = 0;. 
9a90: 20 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70       if( pWin->p
9aa0: 46 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Filter ){.      
9ab0: 20 20 69 6e 74 20 72 65 67 54 6d 70 3b 0a 20 20    int regTmp;.  
9ac0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
9ad0: 72 67 3d 3d 30 20 7c 7c 20 6e 41 72 67 3d 3d 70  rg==0 || nArg==p
9ae0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
9af0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
9b00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
9b10: 41 72 67 20 7c 7c 20 70 57 69 6e 2d 3e 70 4f 77  Arg || pWin->pOw
9b20: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  ner->x.pList==0 
9b30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
9b40: 73 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  sr>0 ){.        
9b50: 20 20 72 65 67 54 6d 70 20 3d 20 73 71 6c 69 74    regTmp = sqlit
9b60: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
9b70: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rse);.          
9b80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9b90: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
9ba0: 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43  csr, pWin->iArgC
9bb0: 6f 6c 2b 6e 41 72 67 2c 72 65 67 54 6d 70 29 3b  ol+nArg,regTmp);
9bc0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9bd0: 20 20 20 20 20 20 20 20 20 20 72 65 67 54 6d 70            regTmp
9be0: 20 3d 20 72 65 67 41 72 67 20 2b 20 6e 41 72 67   = regArg + nArg
9bf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9c00: 20 20 20 20 61 64 64 72 49 66 20 3d 20 73 71 6c      addrIf = sql
9c10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9c20: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 54  , OP_IfNot, regT
9c30: 6d 70 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20  mp, 0, 1);.     
9c40: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
9c50: 76 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  v);.        if( 
9c60: 63 73 72 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  csr>0 ){.       
9c70: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
9c80: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
9c90: 20 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20   regTmp);.      
9ca0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9cb0: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e    if( pWin->pFun
9cc0: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
9cd0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43  QLITE_FUNC_NEEDC
9ce0: 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OLL ){.        C
9cf0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
9d00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
9d10: 41 72 67 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Arg>0 );.       
9d20: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9d30: 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50  ExprNNCollSeq(pP
9d40: 61 72 73 65 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e  arse, pWin->pOwn
9d50: 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  er->x.pList->a[0
9d60: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
9d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9d80: 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
9d90: 71 2c 20 30 2c 30 2c 30 2c 20 28 63 6f 6e 73 74  q, 0,0,0, (const
9da0: 20 63 68 61 72 2a 29 70 43 6f 6c 6c 2c 20 50 34   char*)pColl, P4
9db0: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
9dc0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9dd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 62 49  VdbeAddOp3(v, bI
9de0: 6e 76 65 72 73 65 3f 20 4f 50 5f 41 67 67 49 6e  nverse? OP_AggIn
9df0: 76 65 72 73 65 20 3a 20 4f 50 5f 41 67 67 53 74  verse : OP_AggSt
9e00: 65 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ep, .           
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 49 6e               bIn
9e20: 76 65 72 73 65 2c 20 72 65 67 41 72 67 2c 20 70  verse, regArg, p
9e30: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a  Win->regAccum);.
9e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9e50: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69  eAppendP4(v, pWi
9e60: 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  n->pFunc, P4_FUN
9e70: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71 6c  CDEF);.      sql
9e80: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
9e90: 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20  (v, (u8)nArg);. 
9ea0: 20 20 20 20 20 69 66 28 20 61 64 64 72 49 66 20       if( addrIf 
9eb0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
9ec0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 29  pHere(v, addrIf)
9ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9ee0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 4d  *.** Generate VM
9ef0: 20 63 6f 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20   code to invoke 
9f00: 65 69 74 68 65 72 20 78 56 61 6c 75 65 28 29 20  either xValue() 
9f10: 28 62 46 69 6e 61 6c 3d 3d 30 29 20 6f 72 20 78  (bFinal==0) or x
9f20: 46 69 6e 61 6c 69 7a 65 28 29 0a 2a 2a 20 28 62  Finalize().** (b
9f30: 46 69 6e 61 6c 3d 3d 31 29 20 66 6f 72 20 65 61  Final==1) for ea
9f40: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
9f50: 6f 6e 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  on in the linked
9f60: 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
9f70: 74 0a 2a 2a 20 70 4d 57 69 6e 2e 20 4f 72 2c 20  t.** pMWin. Or, 
9f80: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
9f90: 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow-functions th
9fa0: 61 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68  at do not use th
9fb0: 65 20 73 74 61 6e 64 61 72 64 0a 2a 2a 20 41 50  e standard.** AP
9fc0: 49 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  I, generate the 
9fd0: 65 71 75 69 76 61 6c 65 6e 74 20 56 4d 20 63 6f  equivalent VM co
9fe0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
9ff0: 69 64 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61  id windowAggFina
a000: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
a010: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
a020: 69 6e 74 20 62 46 69 6e 61 6c 29 7b 0a 20 20 56  int bFinal){.  V
a030: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
a040: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
a050: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b  .  Window *pWin;
a060: 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ..  for(pWin=pMW
a070: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
a080: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
a090: 20 20 20 20 69 66 28 20 28 70 57 69 6e 2d 3e 70      if( (pWin->p
a0a0: 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
a0b0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
a0c0: 4e 4d 41 58 29 20 0a 20 20 20 20 20 26 26 20 70  NMAX) .     && p
a0d0: 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f  Win->eStart!=TK_
a0e0: 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 29  UNBOUNDED .    )
a0f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a100: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a110: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
a120: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
a130: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a140: 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70  p1(v, OP_Last, p
a150: 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20  Win->csrApp);.  
a160: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
a170: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
a180: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a190: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 57 69 6e 2d  OP_Column, pWin-
a1a0: 3e 63 73 72 41 70 70 2c 20 30 2c 20 70 57 69 6e  >csrApp, 0, pWin
a1b0: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
a1c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
a1d0: 75 6d 70 48 65 72 65 28 76 2c 20 73 71 6c 69 74  umpHere(v, sqlit
a1e0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a1f0: 72 28 76 29 2d 32 29 3b 0a 20 20 20 20 20 20 69  r(v)-2);.      i
a200: 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20 20 20  f( bFinal ){.   
a210: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a220: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
a230: 65 74 53 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e  etSorter, pWin->
a240: 63 73 72 41 70 70 29 3b 0a 20 20 20 20 20 20 7d  csrApp);.      }
a250: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
a260: 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20  Win->regApp ){. 
a270: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a280: 69 66 28 20 62 46 69 6e 61 6c 20 29 7b 0a 20 20  if( bFinal ){.  
a290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a2a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67  eAddOp2(v, OP_Ag
a2b0: 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65  gFinal, pWin->re
a2c0: 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41 72  gAccum, windowAr
a2d0: 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20  gCount(pWin));. 
a2e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a2f0: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
a300: 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
a310: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 20 20  NCDEF);.        
a320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a330: 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57  2(v, OP_Copy, pW
a340: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57  in->regAccum, pW
a350: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
a360: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a370: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a380: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
a390: 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20  egAccum);.      
a3a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
a3b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
a3c0: 28 76 2c 20 4f 50 5f 41 67 67 56 61 6c 75 65 2c  (v, OP_AggValue,
a3d0: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
a3e0: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
a3f0: 70 57 69 6e 29 2c 0a 20 20 20 20 20 20 20 20 20  pWin),.         
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65 73      pWin->regRes
a420: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ult);.        sq
a430: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
a440: 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63  4(v, pWin->pFunc
a450: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
a460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
a480: 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61 74 65  unction generate
a490: 73 20 56 4d 20 63 6f 64 65 20 74 6f 20 69 6e 76  s VM code to inv
a4a0: 6f 6b 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74  oke the sub-rout
a4b0: 69 6e 65 20 61 74 20 61 64 64 72 65 73 73 0a 2a  ine at address.*
a4c0: 2a 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 6f  * lblFlushPart o
a4d0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 72  nce for each par
a4e0: 74 69 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  tition with the 
a4f0: 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f 6e  entire partition
a500: 20 63 61 63 68 65 64 20 69 6e 0a 2a 2a 20 74 68   cached in.** th
a510: 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43 73 72  e Window.iEphCsr
a520: 20 74 65 6d 70 20 74 61 62 6c 65 2e 0a 2a 2f 0a   temp table..*/.
a530: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
a540: 6f 77 50 61 72 74 69 74 69 6f 6e 43 61 63 68 65  owPartitionCache
a550: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a560: 65 2c 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  e,.  Select *p, 
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a580: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 77 72       /* The rewr
a590: 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61  itten SELECT sta
a5a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72  tement */.  Wher
a5b0: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
a5d0: 68 65 72 65 49 6e 66 6f 20 74 6f 20 63 61 6c 6c  hereInfo to call
a5e0: 20 57 68 65 72 65 45 6e 64 28 29 20 6f 6e 20 2a   WhereEnd() on *
a5f0: 2f 0a 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68  /.  int regFlush
a600: 50 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 20  Part,           
a610: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
a620: 74 6f 20 75 73 65 20 77 69 74 68 20 47 6f 73 75  to use with Gosu
a630: 62 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 2a  b lblFlushPart *
a640: 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  /.  int lblFlush
a650: 50 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 20  Part,           
a660: 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e      /* Subroutin
a670: 65 20 74 6f 20 47 6f 73 75 62 20 74 6f 20 2a 2f  e to Gosub to */
a680: 0a 20 20 69 6e 74 20 2a 70 52 65 67 53 69 7a 65  .  int *pRegSize
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69 73     /* OUT: Regis
a6b0: 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ter containing p
a6c0: 61 72 74 69 74 69 6f 6e 20 73 69 7a 65 20 2a 2f  artition size */
a6d0: 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  .){.  Window *pM
a6e0: 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20  Win = p->pWin;. 
a6f0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
a700: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
a710: 29 3b 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72  );.  int iSubCsr
a720: 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
a730: 2e 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20  .iCursor;.  int 
a740: 6e 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  nSub = p->pSrc->
a750: 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b  a[0].pTab->nCol;
a760: 0a 20 20 69 6e 74 20 6b 3b 0a 0a 20 20 69 6e 74  .  int k;..  int
a770: 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e   reg = pParse->n
a780: 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20 72 65 67  Mem+1;.  int reg
a790: 52 65 63 6f 72 64 20 3d 20 72 65 67 2b 6e 53 75  Record = reg+nSu
a7a0: 62 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  b;.  int regRowi
a7b0: 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b 31 3b  d = regRecord+1;
a7c0: 0a 0a 20 20 2a 70 52 65 67 53 69 7a 65 20 3d 20  ..  *pRegSize = 
a7d0: 72 65 67 52 6f 77 69 64 3b 0a 20 20 70 50 61 72  regRowid;.  pPar
a7e0: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62  se->nMem += nSub
a7f0: 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64   + 2;..  /* Load
a800: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75   the column valu
a810: 65 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 72  es for the row r
a820: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
a830: 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 69  ub-select.  ** i
a840: 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20  nto an array of 
a850: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
a860: 6e 67 20 61 74 20 72 65 67 2e 20 2a 2f 0a 20 20  ng at reg. */.  
a870: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62 3b  for(k=0; k<nSub;
a880: 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   k++){.    sqlit
a890: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a8a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62 43  OP_Column, iSubC
a8b0: 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a 20  sr, k, reg+k);. 
a8c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
a8d0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
a8e0: 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20 6e 53  eRecord, reg, nS
a8f0: 75 62 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ub, regRecord);.
a900: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
a910: 68 69 73 20 69 73 20 74 68 65 20 73 74 61 72 74  his is the start
a920: 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69 74   of a new partit
a930: 69 6f 6e 2e 20 49 66 20 73 6f 2c 20 63 61 6c 6c  ion. If so, call
a940: 20 74 68 65 0a 20 20 2a 2a 20 66 6c 75 73 68 5f   the.  ** flush_
a950: 70 61 72 74 69 74 69 6f 6e 20 73 75 62 2d 72 6f  partition sub-ro
a960: 75 74 69 6e 65 2e 20 20 2a 2f 0a 20 20 69 66 28  utine.  */.  if(
a970: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
a980: 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  on ){.    int ad
a990: 64 72 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  dr;.    ExprList
a9a0: 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e 2d   *pPart = pMWin-
a9b0: 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20  >pPartition;.   
a9c0: 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 70 50 61   int nPart = pPa
a9d0: 72 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69  rt->nExpr;.    i
a9e0: 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d 20  nt regNewPart = 
a9f0: 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75  reg + pMWin->nBu
aa00: 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 4b 65 79  fferCol;.    Key
aa10: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
aa20: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
aa30: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
aa40: 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20 30 29  se, pPart, 0, 0)
aa50: 3b 0a 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  ;..    addr = sq
aa60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
aa70: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
aa80: 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69 6e  egNewPart, pMWin
aa90: 2d 3e 72 65 67 50 61 72 74 2c 6e 50 61 72 74 29  ->regPart,nPart)
aaa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
aab0: 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f  eAppendP4(v, (vo
aac0: 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  id*)pKeyInfo, P4
aad0: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
aae0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
aaf0: 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
ab00: 72 2b 32 2c 20 61 64 64 72 2b 34 2c 20 61 64 64  r+2, addr+4, add
ab10: 72 2b 32 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  r+2);.    VdbeCo
ab20: 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a 20  verageEqNe(v);. 
ab30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ab40: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
ab50: 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57   regNewPart, pMW
ab60: 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61  in->regPart, nPa
ab70: 72 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  rt-1);.    sqlit
ab80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ab90: 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75  OP_Gosub, regFlu
aba0: 73 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68  shPart, lblFlush
abb0: 50 61 72 74 29 3b 0a 20 20 20 20 56 64 62 65 43  Part);.    VdbeC
abc0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c  omment((v, "call
abd0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
abe0: 22 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  "));.  }..  /* B
abf0: 75 66 66 65 72 20 74 68 65 20 63 75 72 72 65 6e  uffer the curren
ac00: 74 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70 68  t row in the eph
ac10: 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f  emeral table. */
ac20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ac30: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
ac40: 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  wid, pMWin->iEph
ac50: 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Csr, regRowid);.
ac60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ac70: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
ac80: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
ac90: 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67  , regRecord, reg
aca0: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Rowid);..  /* En
acb0: 64 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c  d of the input l
acc0: 6f 6f 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  oop */.  sqlite3
acd0: 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
ace0: 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 22  ;..  /* Invoke "
acf0: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22  flush_partition"
ad00: 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
ad10: 65 20 66 69 6e 61 6c 20 28 6f 72 20 6f 6e 6c 79  e final (or only
ad20: 29 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20  ) partition */. 
ad30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ad40: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
ad50: 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62  regFlushPart, lb
ad60: 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 56  lFlushPart);.  V
ad70: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
ad80: 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61 72 74 69  call flush_parti
ad90: 74 69 6f 6e 22 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  tion"));.}../*.*
ada0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75 62  * Invoke the sub
adb0: 2d 72 6f 75 74 69 6e 65 20 61 74 20 72 65 67 47  -routine at regG
adc0: 6f 73 75 62 20 28 67 65 6e 65 72 61 74 65 64 20  osub (generated 
add0: 62 79 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63  by code in selec
ade0: 74 2e 63 29 20 74 6f 0a 2a 2a 20 72 65 74 75 72  t.c) to.** retur
adf0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
ae00: 77 20 6f 66 20 57 69 6e 64 6f 77 2e 69 45 70 68  w of Window.iEph
ae10: 43 73 72 2e 20 49 66 20 61 6c 6c 20 77 69 6e 64  Csr. If all wind
ae20: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  ow functions are
ae30: 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 20 77 69  .** aggregate wi
ae40: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74  ndow functions t
ae50: 68 61 74 20 75 73 65 20 74 68 65 20 73 74 61 6e  hat use the stan
ae60: 64 61 72 64 20 41 50 49 2c 20 61 20 73 69 6e 67  dard API, a sing
ae70: 6c 65 0a 2a 2a 20 4f 50 5f 47 6f 73 75 62 20 69  le.** OP_Gosub i
ae80: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6c  nstruction is al
ae90: 6c 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  l that this rout
aea0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 2e 20 45  ine generates. E
aeb0: 78 74 72 61 20 56 4d 20 63 6f 64 65 0a 2a 2a 20  xtra VM code.** 
aec0: 66 6f 72 20 70 65 72 2d 72 6f 77 20 70 72 6f 63  for per-row proc
aed0: 65 73 73 69 6e 67 20 69 73 20 6f 6e 6c 79 20 67  essing is only g
aee0: 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 65  enerated for the
aef0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74   following built
af00: 2d 69 6e 20 77 69 6e 64 6f 77 0a 2a 2a 20 66 75  -in window.** fu
af10: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20  nctions:.**.**  
af20: 20 6e 74 68 5f 76 61 6c 75 65 28 29 0a 2a 2a 20   nth_value().** 
af30: 20 20 66 69 72 73 74 5f 76 61 6c 75 65 28 29 0a    first_value().
af40: 2a 2a 20 20 20 6c 61 67 28 29 0a 2a 2a 20 20 20  **   lag().**   
af50: 6c 65 61 64 28 29 0a 2a 2f 0a 73 74 61 74 69 63  lead().*/.static
af60: 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 74 75   void windowRetu
af70: 72 6e 4f 6e 65 52 6f 77 28 0a 20 20 50 61 72 73  rnOneRow(.  Pars
af80: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57 69 6e  e *pParse,.  Win
af90: 64 6f 77 20 2a 70 4d 57 69 6e 2c 0a 20 20 69 6e  dow *pMWin,.  in
afa0: 74 20 72 65 67 47 6f 73 75 62 2c 0a 20 20 69 6e  t regGosub,.  in
afb0: 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20  t addrGosub.){. 
afc0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
afd0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
afe0: 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  );.  Window *pWi
aff0: 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  n;.  for(pWin=pM
b000: 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
b010: 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
b020: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46  .    FuncDef *pF
b030: 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e  unc = pWin->pFun
b040: 63 3b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  c;.    if( pFunc
b050: 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c  ->zName==nth_val
b060: 75 65 4e 61 6d 65 0a 20 20 20 20 20 7c 7c 20 70  ueName.     || p
b070: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72  Func->zName==fir
b080: 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20  st_valueName.   
b090: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 73   ){.      int cs
b0a0: 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  r = pWin->csrApp
b0b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20  ;.      int lbl 
b0c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
b0d0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a  eLabel(pParse);.
b0e0: 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65 67        int tmpReg
b0f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
b100: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
b110: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b120: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
b130: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
b140: 73 75 6c 74 29 3b 0a 0a 20 20 20 20 20 20 69 66  sult);..      if
b150: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
b160: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 20 29 7b  nth_valueName ){
b170: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b180: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b190: 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57 69 6e 2d 3e  _Column, pMWin->
b1a0: 69 45 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e 69  iEphCsr, pWin->i
b1b0: 41 72 67 43 6f 6c 2b 31 2c 74 6d 70 52 65 67 29  ArgCol+1,tmpReg)
b1c0: 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  ;.        window
b1d0: 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70 50  CheckIntValue(pP
b1e0: 61 72 73 65 2c 20 74 6d 70 52 65 67 2c 20 32 29  arse, tmpReg, 2)
b1f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b200: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b210: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b220: 6e 74 65 67 65 72 2c 20 31 2c 20 74 6d 70 52 65  nteger, 1, tmpRe
b230: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
b240: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b250: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 74  Op3(v, OP_Add, t
b260: 6d 70 52 65 67 2c 20 70 57 69 6e 2d 3e 72 65 67  mpReg, pWin->reg
b270: 41 70 70 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  App, tmpReg);.  
b280: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b290: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 74 2c 20  ddOp3(v, OP_Gt, 
b2a0: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 2c 20  pWin->regApp+1, 
b2b0: 6c 62 6c 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20  lbl, tmpReg);.  
b2c0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
b2d0: 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20 20  NeverNull(v);.  
b2e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b2f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
b300: 52 6f 77 69 64 2c 20 63 73 72 2c 20 30 2c 20 74  Rowid, csr, 0, t
b310: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 56 64  mpReg);.      Vd
b320: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
b330: 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 73  aken(v);.      s
b340: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b350: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
b360: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
b370: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
b380: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
b390: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
b3a0: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
b3b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
b3c0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
b3d0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  tmpReg);.    }. 
b3e0: 20 20 20 65 6c 73 65 20 69 66 28 20 70 46 75 6e     else if( pFun
b3f0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61  c->zName==leadNa
b400: 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61  me || pFunc->zNa
b410: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20 29 7b 0a 20  me==lagName ){. 
b420: 20 20 20 20 20 69 6e 74 20 6e 41 72 67 20 3d 20       int nArg = 
b430: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
b440: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
b450: 20 20 20 20 69 6e 74 20 69 45 70 68 20 3d 20 70      int iEph = p
b460: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20  MWin->iEphCsr;. 
b470: 20 20 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70       int csr = p
b480: 57 69 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20  Win->csrApp;.   
b490: 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c     int lbl = sql
b4a0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
b4b0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
b4c0: 20 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71   int tmpReg = sq
b4d0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
b4e0: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
b4f0: 69 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20  if( nArg<3 ){.  
b500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b510: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
b520: 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67  ll, 0, pWin->reg
b530: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
b540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
b550: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b560: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45  v, OP_Column, iE
b570: 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  ph, pWin->iArgCo
b580: 6c 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  l+2, pWin->regRe
b590: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sult);.      }. 
b5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b5b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
b5c0: 69 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65 67  id, iEph, tmpReg
b5d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  );.      if( nAr
b5e0: 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69  g<2 ){.        i
b5f0: 6e 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d  nt val = (pFunc-
b600: 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65  >zName==leadName
b610: 20 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20   ? 1 : -1);.    
b620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b630: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
b640: 6d 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c 29  mm, tmpReg, val)
b650: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b660: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
b670: 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c  (pFunc->zName==l
b680: 65 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41 64 64  eadName ? OP_Add
b690: 20 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29 3b   : OP_Subtract);
b6a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70  .        int tmp
b6b0: 52 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Reg2 = sqlite3Ge
b6c0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b6d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
b6e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b6f0: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20  P_Column, iEph, 
b700: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c  pWin->iArgCol+1,
b710: 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20   tmpReg2);.     
b720: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b730: 64 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52  dOp3(v, op, tmpR
b740: 65 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70  eg2, tmpReg, tmp
b750: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Reg);.        sq
b760: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
b770: 52 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52  Reg(pParse, tmpR
b780: 65 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  eg2);.      }.. 
b790: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b7a0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65  AddOp3(v, OP_See
b7b0: 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c  kRowid, csr, lbl
b7c0: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
b7d0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
b7e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b7f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b800: 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69  Column, csr, pWi
b810: 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e  n->iArgCol, pWin
b820: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
b830: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
b840: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
b850: 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  bl);.      sqlit
b860: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
b870: 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29  (pParse, tmpReg)
b880: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
b890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b8a0: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
b8b0: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
b8c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
b8d0: 6b 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  ke the code gene
b8e0: 72 61 74 65 64 20 62 79 20 77 69 6e 64 6f 77 52  rated by windowR
b8f0: 65 74 75 72 6e 4f 6e 65 52 6f 77 28 29 20 61 6e  eturnOneRow() an
b900: 64 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20 74  d, optionally, t
b910: 68 65 0a 2a 2a 20 78 49 6e 76 65 72 73 65 28 29  he.** xInverse()
b920: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61   function for ea
b930: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
b940: 6f 6e 2c 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d  on, for one or m
b950: 6f 72 65 20 72 6f 77 73 0a 2a 2a 20 66 72 6f 6d  ore rows.** from
b960: 20 74 68 65 20 57 69 6e 64 6f 77 2e 69 45 70 68   the Window.iEph
b970: 43 73 72 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  Csr temp table. 
b980: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
b990: 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 0a 2a  erates VM code.*
b9a0: 2a 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  * similar to:.**
b9b0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 72 65 67  .**   while( reg
b9c0: 43 74 72 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20  Ctr>0 ){.**     
b9d0: 72 65 67 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20 20  regCtr--;.**    
b9e0: 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65   windowReturnOne
b9f0: 52 6f 77 28 29 0a 2a 2a 20 20 20 20 20 69 66 28  Row().**     if(
ba00: 20 62 49 6e 76 65 72 73 65 20 29 7b 0a 2a 2a 20   bInverse ){.** 
ba10: 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65        AggInverse
ba20: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
ba30: 20 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e 69 45   Next (Window.iE
ba40: 70 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a 2f  phCsr).**   }.*/
ba50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
ba60: 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a 20  dowReturnRows(. 
ba70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
ba80: 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c    Window *pMWin,
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77 69 6e    /* List of win
bab0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  dow functions */
bac0: 0a 20 20 69 6e 74 20 72 65 67 43 74 72 2c 20 20  .  int regCtr,  
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63     /* Register c
baf0: 6f 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62 65 72  ontaining number
bb00: 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e   of rows */.  in
bb10: 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20  t regGosub,     
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb30: 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 47 6f   Register for Go
bb40: 73 75 62 20 61 64 64 72 47 6f 73 75 62 20 2a 2f  sub addrGosub */
bb50: 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62  .  int addrGosub
bb60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bb70: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
bb80: 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 66 6f 72   sub-routine for
bb90: 20 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20 2a 2f   ReturnOneRow */
bba0: 0a 20 20 69 6e 74 20 72 65 67 49 6e 76 41 72 67  .  int regInvArg
bbb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bbc0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
bbd0: 65 67 69 73 74 65 72 73 20 66 6f 72 20 78 49 6e  egisters for xIn
bbe0: 76 65 72 73 65 20 61 72 67 73 20 2a 2f 0a 20 20  verse args */.  
bbf0: 69 6e 74 20 72 65 67 49 6e 76 53 69 7a 65 20 20  int regInvSize  
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74  /* Register cont
bc20: 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70  aining size of p
bc30: 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  artition */.){. 
bc40: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64 62   int addr;.  Vdb
bc50: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
bc60: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
bc70: 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
bc80: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30  pParse, pMWin, 0
bc90: 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  );.  addr = sqli
bca0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
bcb0: 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43 74   OP_IfPos, regCt
bcc0: 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
bcd0: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 20 2c  rrentAddr(v)+2 ,
bce0: 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  1);.  VdbeCovera
bcf0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
bd00: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bd10: 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  _Goto, 0, 0);.  
bd20: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
bd30: 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ow(pParse, pMWin
bd40: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
bd50: 47 6f 73 75 62 29 3b 0a 20 20 69 66 28 20 72 65  Gosub);.  if( re
bd60: 67 49 6e 76 41 72 67 20 29 7b 0a 20 20 20 20 77  gInvArg ){.    w
bd70: 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61  indowAggStep(pPa
bd80: 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69  rse, pMWin, pMWi
bd90: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c 20 72  n->iEphCsr, 1, r
bda0: 65 67 49 6e 76 41 72 67 2c 20 72 65 67 49 6e 76  egInvArg, regInv
bdb0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Size);.  }.  sql
bdc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bdd0: 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e  , OP_Next, pMWin
bde0: 2d 3e 69 45 70 68 43 73 72 2c 20 61 64 64 72 29  ->iEphCsr, addr)
bdf0: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
be00: 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
be10: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
be20: 64 72 2b 31 29 3b 20 20 20 2f 2a 20 54 68 65 20  dr+1);   /* The 
be30: 4f 50 5f 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a  OP_Goto */.}../*
be40: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
be50: 65 20 74 6f 20 73 65 74 20 74 68 65 20 61 63 63  e to set the acc
be60: 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
be70: 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  r for each windo
be80: 77 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  w function.** in
be90: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
bea0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
beb0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
bec0: 6f 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66  o NULL. And perf
bed0: 6f 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76  orm.** any equiv
bee0: 61 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61  alent initializa
bef0: 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
bf00: 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69   any built-in wi
bf10: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  ndow functions.*
bf20: 2a 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  * in the list..*
bf30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
bf40: 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72  dowInitAccum(Par
bf50: 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64  se *pParse, Wind
bf60: 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64  ow *pMWin){.  Vd
bf70: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
bf80: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
bf90: 20 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20    int regArg;.  
bfa0: 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20  int nArg = 0;.  
bfb0: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
bfc0: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
bfd0: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
bfe0: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
bff0: 46 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d  FuncDef *pFunc =
c000: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
c010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c020: 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
c030: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75  0, pWin->regAccu
c040: 6d 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d  m);.    nArg = M
c050: 41 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41  AX(nArg, windowA
c060: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a  rgCount(pWin));.
c070: 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a      if( pFunc->z
c080: 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e  Name==nth_valueN
c090: 61 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e  ame.     || pFun
c0a0: 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f  c->zName==first_
c0b0: 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b  valueName.    ){
c0c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c0d0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
c0e0: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
c0f0: 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20  >regApp);.      
c100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c110: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
c120: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70   0, pWin->regApp
c130: 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +1);.    }..    
c140: 69 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63  if( (pFunc->func
c150: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
c160: 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70  UNC_MINMAX) && p
c170: 57 69 6e 2d 3e 63 73 72 41 70 70 20 29 7b 0a 20  Win->csrApp ){. 
c180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
c190: 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
c1a0: 42 4f 55 4e 44 45 44 20 29 3b 0a 20 20 20 20 20  BOUNDED );.     
c1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c1c0: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
c1d0: 72 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41  rter, pWin->csrA
c1e0: 70 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pp);.      sqlit
c1f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c200: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
c210: 57 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a  Win->regApp+1);.
c220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 67 41      }.  }.  regA
c230: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  rg = pParse->nMe
c240: 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  m+1;.  pParse->n
c250: 4d 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20 20 72  Mem += nArg;.  r
c260: 65 74 75 72 6e 20 72 65 67 41 72 67 3b 0a 7d 0a  eturn regArg;.}.
c270: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c280: 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77  ction does the w
c290: 6f 72 6b 20 6f 66 20 73 71 6c 69 74 65 33 57 69  ork of sqlite3Wi
c2a0: 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66  ndowCodeStep() f
c2b0: 6f 72 20 61 6c 6c 20 22 52 4f 57 53 22 0a 2a 2a  or all "ROWS".**
c2c0: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 74 79   window frame ty
c2d0: 70 65 73 20 65 78 63 65 70 74 20 66 6f 72 20 22  pes except for "
c2e0: 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45  BETWEEN UNBOUNDE
c2f0: 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20  D PRECEDING AND 
c300: 43 55 52 52 45 4e 54 0a 2a 2a 20 52 4f 57 22 2e  CURRENT.** ROW".
c310: 20 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72   Pseudo-code for
c320: 20 65 61 63 68 20 66 6f 6c 6c 6f 77 73 2e 0a 2a   each follows..*
c330: 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  *.** ROWS BETWEE
c340: 4e 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44  N <expr1> PRECED
c350: 49 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20  ING AND <expr2> 
c360: 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20  FOLLOWING.**.** 
c370: 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
c380: 20 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69   if( new partiti
c390: 6f 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  on ){.**        
c3a0: 20 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72   Gosub flush_par
c3b0: 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tition.**       
c3c0: 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72  }.**       Inser
c3d0: 74 20 28 72 65 63 6f 72 64 20 69 6e 20 65 70 68  t (record in eph
c3e0: 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20 20 20 73  -table).**     s
c3f0: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
c400: 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 66 6c  .**     Gosub fl
c410: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ush_partition.**
c420: 20 20 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61    .**   flush_pa
c430: 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20  rtition:.**     
c440: 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Once {.**       
c450: 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72  OpenDup (iEphCsr
c460: 20 2d 3e 20 63 73 72 53 74 61 72 74 29 0a 2a 2a   -> csrStart).**
c470: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
c480: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 45 6e  iEphCsr -> csrEn
c490: 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  d).**     }.**  
c4a0: 20 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65     regStart = <e
c4b0: 78 70 72 31 3e 20 20 20 20 20 20 20 20 20 20 20  xpr1>           
c4c0: 20 20 20 20 20 2f 2f 20 50 52 45 43 45 44 49 4e       // PRECEDIN
c4d0: 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  G expression.** 
c4e0: 20 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78      regEnd = <ex
c4f0: 70 72 32 3e 20 20 20 20 20 20 20 20 20 20 20 20  pr2>            
c500: 20 20 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57 49        // FOLLOWI
c510: 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  NG expression.**
c520: 20 20 20 20 20 69 66 28 20 72 65 67 53 74 61 72       if( regStar
c530: 74 3c 30 20 7c 7c 20 72 65 67 45 6e 64 3c 30 20  t<0 || regEnd<0 
c540: 29 7b 20 65 72 72 6f 72 21 20 7d 0a 2a 2a 20 20  ){ error! }.**  
c550: 20 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63     Rewind (csr,c
c560: 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20  srStart,csrEnd) 
c570: 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67       // if EOF g
c580: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
c590: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
c5a0: 20 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20    Next(csrEnd)  
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5c0: 20 20 2f 2f 20 69 66 20 45 4f 46 20 73 6b 69 70    // if EOF skip
c5d0: 20 41 67 67 73 74 65 70 0a 2a 2a 20 20 20 20 20   Aggstep.**     
c5e0: 20 20 41 67 67 73 74 65 70 20 28 63 73 72 45 6e    Aggstep (csrEn
c5f0: 64 29 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  d).**       if( 
c600: 28 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b  (regEnd--)<=0 ){
c610: 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46  .**         AggF
c620: 69 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a  inal (xValue).**
c630: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
c640: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
c650: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
c670: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
c680: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
c690: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20  .**         if( 
c6a0: 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20  (regStart--)<=0 
c6b0: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ){.**           
c6c0: 41 67 67 49 6e 76 65 72 73 65 20 28 63 73 72 53  AggInverse (csrS
c6d0: 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20  tart).**        
c6e0: 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74     Next(csrStart
c6f0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  ).**         }.*
c700: 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 66  *       }.**   f
c710: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
c720: 6f 6e 65 3a 0a 2a 2a 20 20 20 20 20 52 65 73 65  one:.**     Rese
c730: 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a  tSorter (csr).**
c740: 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a       Return.**.*
c750: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c  * ROWS BETWEEN <
c760: 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20  expr> PRECEDING 
c770: 20 20 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52     AND CURRENT R
c780: 4f 57 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  OW.** ROWS BETWE
c790: 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20  EN CURRENT ROW  
c7a0: 20 20 20 20 20 20 20 41 4e 44 20 3c 65 78 70 72         AND <expr
c7b0: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52  > FOLLOWING.** R
c7c0: 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  OWS BETWEEN UNBO
c7d0: 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
c7e0: 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  AND <expr> FOLLO
c7f0: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  WING.**.**   The
c800: 73 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74  se are similar t
c810: 6f 20 74 68 65 20 61 62 6f 76 65 2e 20 46 6f 72  o the above. For
c820: 20 22 43 55 52 52 45 4e 54 20 52 4f 57 22 2c 20   "CURRENT ROW", 
c830: 69 6e 74 69 61 6c 69 7a 65 20 74 68 65 0a 2a 2a  intialize the.**
c840: 20 20 20 72 65 67 69 73 74 65 72 20 74 6f 20 30     register to 0
c850: 2e 20 46 6f 72 20 22 55 4e 42 4f 55 4e 44 45 44  . For "UNBOUNDED
c860: 20 50 52 45 43 45 44 49 4e 47 22 20 74 6f 20 69   PRECEDING" to i
c870: 6e 66 69 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 52  nfinity..**.** R
c880: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
c890: 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20  r> PRECEDING    
c8a0: 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
c8b0: 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20  LLOWING.** ROWS 
c8c0: 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20  BETWEEN CURRENT 
c8d0: 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44 20  ROW         AND 
c8e0: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
c8f0: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  ING.**.**     Re
c900: 77 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61  wind (csr,csrSta
c910: 72 74 2c 63 73 72 45 6e 64 29 20 20 20 20 2f 2f  rt,csrEnd)    //
c920: 20 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75   if EOF goto flu
c930: 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e  sh_partition_don
c940: 65 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20  e.**     while( 
c950: 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 4e 65  1 ){.**       Ne
c960: 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20 20  xt(csrEnd)      
c970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 45              // E
c980: 78 69 74 20 77 68 69 6c 65 28 31 29 20 61 74 20  xit while(1) at 
c990: 45 4f 46 0a 2a 2a 20 20 20 20 20 20 20 41 67 67  EOF.**       Agg
c9a0: 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a  step (csrEnd).**
c9b0: 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68       }.**     wh
c9c0: 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20  ile( 1 ){.**    
c9d0: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
c9e0: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f  lue).**       Go
c9f0: 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
ca00: 20 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 29         Next(csr)
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67       // if EOF g
ca30: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
ca40: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
ca50: 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d    if( (regStart-
ca60: 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20  -)<=0 ){.**     
ca70: 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28      AggInverse (
ca80: 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20  csrStart).**    
ca90: 20 20 20 20 20 4e 65 78 74 28 63 73 72 53 74 61       Next(csrSta
caa0: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  rt).**       }.*
cab0: 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20  *     }.**.**   
cac0: 46 6f 72 20 74 68 65 20 22 43 55 52 52 45 4e 54  For the "CURRENT
cad0: 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44   ROW AND UNBOUND
cae0: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61  ED FOLLOWING" ca
caf0: 73 65 2c 20 74 68 65 20 66 69 6e 61 6c 20 69 66  se, the final if
cb00: 28 29 20 0a 2a 2a 20 20 20 63 6f 6e 64 69 74 69  () .**   conditi
cb10: 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 74 72 75  on is always tru
cb20: 65 20 28 61 73 20 69 66 20 72 65 67 53 74 61 72  e (as if regStar
cb30: 74 20 77 65 72 65 20 69 6e 69 74 69 61 6c 69 7a  t were initializ
cb40: 65 64 20 74 6f 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  ed to 0)..**.** 
cb50: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
cb60: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
cb70: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
cb80: 47 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 69 73 20  G.** .**   This 
cb90: 69 73 20 74 68 65 20 6f 6e 6c 79 20 52 41 4e 47  is the only RANG
cba0: 45 20 63 61 73 65 20 68 61 6e 64 6c 65 64 20 62  E case handled b
cbb0: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
cbc0: 49 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a  It modifies the.
cbd0: 2a 2a 20 20 20 73 65 63 6f 6e 64 20 77 68 69 6c  **   second whil
cbe0: 65 28 20 31 20 29 20 6c 6f 6f 70 20 69 6e 20 22  e( 1 ) loop in "
cbf0: 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55 52  ROWS BETWEEN CUR
cc00: 52 45 4e 54 20 2e 2e 2e 20 55 4e 42 4f 55 4e 44  RENT ... UNBOUND
cc10: 45 44 2e 2e 2e 22 20 74 6f 0a 2a 2a 20 20 20 62  ED..." to.**   b
cc20: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77 68 69  e:.**.**     whi
cc30: 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
cc40: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
cc50: 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 77 68 69  ue).**       whi
cc60: 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
cc70: 20 20 20 20 72 65 67 50 65 65 72 2b 2b 0a 2a 2a      regPeer++.**
cc80: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
cc90: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
cca0: 20 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20      Next(csr)   
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
ccd0: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
cce0: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  _done.**        
ccf0: 20 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 20   if( new peer ) 
cd00: 62 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20  break;.**       
cd10: 7d 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65  }.**       while
cd20: 28 20 28 72 65 67 50 65 65 72 2d 2d 29 3e 30 20  ( (regPeer--)>0 
cd30: 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67  ){.**         Ag
cd40: 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61  gInverse (csrSta
cd50: 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e  rt).**         N
cd60: 65 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a  ext(csrStart).**
cd70: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
cd80: 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  }.**.** ROWS BET
cd90: 57 45 45 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c  WEEN <expr> FOLL
cda0: 4f 57 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78  OWING    AND <ex
cdb0: 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  pr> FOLLOWING.**
cdc0: 0a 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72  .**   regEnd = r
cdd0: 65 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74  egEnd - regStart
cde0: 0a 2a 2a 20 20 20 52 65 77 69 6e 64 20 28 63 73  .**   Rewind (cs
cdf0: 72 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e  r,csrStart,csrEn
ce00: 64 29 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67  d)   // if EOF g
ce10: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
ce20: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
ce30: 41 67 67 73 74 65 70 20 28 63 73 72 45 6e 64 29  Aggstep (csrEnd)
ce40: 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72  .**     Next(csr
ce50: 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20  End)            
ce60: 20 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 66       // if EOF f
ce70: 61 6c 6c 2d 74 68 72 6f 75 67 68 0a 2a 2a 20 20  all-through.**  
ce80: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
ce90: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
cea0: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
ceb0: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
cec0: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
ced0: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  lue).**         
cee0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
cef0: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
cf00: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
cf10: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
cf20: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
cf30: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 7d  _done.**       }
cf40: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 49 6e 76  .**       AggInv
cf50: 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29 0a  erse (csrStart).
cf60: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28 63  **       Next (c
cf70: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
cf80: 7d 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54  }.**.** ROWS BET
cf90: 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43  WEEN <expr> PREC
cfa0: 45 44 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78  EDING    AND <ex
cfb0: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a  pr> PRECEDING.**
cfc0: 0a 2a 2a 20 20 20 52 65 70 6c 61 63 65 20 74 68  .**   Replace th
cfd0: 65 20 62 69 74 20 61 66 74 65 72 20 22 52 65 77  e bit after "Rew
cfe0: 69 6e 64 22 20 69 6e 20 74 68 65 20 61 62 6f 76  ind" in the abov
cff0: 65 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20  e with:.**.**   
d000: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
d010: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
d020: 41 67 67 53 74 65 70 20 28 63 73 72 45 6e 64 29  AggStep (csrEnd)
d030: 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28  .**       Next (
d040: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d  csrEnd).**     }
d050: 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c  .**     AggFinal
d060: 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20   (xValue).**    
d070: 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
d080: 0a 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72  .**     Next(csr
d090: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
d0a0: 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74     // if EOF got
d0b0: 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  o flush_partitio
d0c0: 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 69 66  n_done.**     if
d0d0: 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d  ( (regStart--)<=
d0e0: 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  0 ){.**       Ag
d0f0: 67 49 6e 76 65 72 73 65 20 28 63 73 72 32 29 0a  gInverse (csr2).
d100: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28 63  **       Next (c
d110: 73 72 32 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  sr2).**     }.**
d120: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d130: 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70  windowCodeRowExp
d140: 72 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a  rStep(.  Parse *
d150: 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63  pParse, .  Selec
d160: 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66  t *p,.  WhereInf
d170: 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74  o *pWInfo,.  int
d180: 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e   regGosub, .  in
d190: 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20  t addrGosub.){. 
d1a0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
d1b0: 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65   p->pWin;.  Vdbe
d1c0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
d1d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d1e0: 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74  int regFlushPart
d1f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d200: 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
d210: 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72  "Gosub flush_par
d220: 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  tition" */.  int
d230: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 20 20   lblFlushPart;  
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d250: 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75 62  Label for "Gosub
d260: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
d270: 22 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c  " */.  int lblFl
d280: 75 73 68 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  ushDone;        
d290: 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
d2a0: 66 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68  for "Gosub flush
d2b0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 22  _partition_done"
d2c0: 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 65 67 41 72   */..  int regAr
d2d0: 67 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  g;.  int addr;. 
d2e0: 20 69 6e 74 20 63 73 72 53 74 61 72 74 20 3d 20   int csrStart = 
d2f0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
d300: 20 20 69 6e 74 20 63 73 72 45 6e 64 20 3d 20 70    int csrEnd = p
d310: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d320: 20 69 6e 74 20 72 65 67 53 74 61 72 74 3b 20 20   int regStart;  
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65    /* Value of <e
d350: 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a  xpr> PRECEDING *
d360: 2f 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 3b 20  /.  int regEnd; 
d370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d380: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
d390: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
d3a0: 47 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47  G */.  int addrG
d3b0: 6f 74 6f 3b 0a 20 20 69 6e 74 20 61 64 64 72 54  oto;.  int addrT
d3c0: 6f 70 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66  op;.  int addrIf
d3d0: 50 6f 73 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Pos1 = 0;.  int 
d3e0: 61 64 64 72 49 66 50 6f 73 32 20 3d 20 30 3b 0a  addrIfPos2 = 0;.
d3f0: 20 20 69 6e 74 20 72 65 67 53 69 7a 65 20 3d 20    int regSize = 
d400: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d  0;..  assert( pM
d410: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
d420: 50 52 45 43 45 44 49 4e 47 20 0a 20 20 20 20 20  PRECEDING .     
d430: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
d440: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  rt==TK_CURRENT .
d450: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
d460: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
d470: 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c  OWING .       ||
d480: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
d490: 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20  TK_UNBOUNDED .  
d4a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  );.  assert( pMW
d4b0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
d4c0: 4c 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20 7c  LOWING .       |
d4d0: 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  | pMWin->eEnd==T
d4e0: 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20  K_CURRENT .     
d4f0: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64    || pMWin->eEnd
d500: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a  ==TK_UNBOUNDED .
d510: 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d         || pMWin-
d520: 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44  >eEnd==TK_PRECED
d530: 49 4e 47 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  ING .  );..  /* 
d540: 41 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65  Allocate registe
d550: 72 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f 72 20  r and label for 
d560: 74 68 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69  the "flush_parti
d570: 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74 69 6e  tion" sub-routin
d580: 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75 73 68  e. */.  regFlush
d590: 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Part = ++pParse-
d5a0: 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75 73  >nMem;.  lblFlus
d5b0: 68 50 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  hPart = sqlite3V
d5c0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61  dbeMakeLabel(pPa
d5d0: 72 73 65 29 3b 0a 20 20 6c 62 6c 46 6c 75 73 68  rse);.  lblFlush
d5e0: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
d5f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50 61 72  beMakeLabel(pPar
d600: 73 65 29 3b 0a 0a 20 20 72 65 67 53 74 61 72 74  se);..  regStart
d610: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d620: 6d 3b 0a 20 20 72 65 67 45 6e 64 20 3d 20 2b 2b  m;.  regEnd = ++
d630: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
d640: 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e   windowPartition
d650: 43 61 63 68 65 28 70 50 61 72 73 65 2c 20 70 2c  Cache(pParse, p,
d660: 20 70 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75 73   pWInfo, regFlus
d670: 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50  hPart, lblFlushP
d680: 61 72 74 2c 20 26 72 65 67 53 69 7a 65 29 3b 0a  art, &regSize);.
d690: 0a 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71  .  addrGoto = sq
d6a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
d6b0: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20  v, OP_Goto);..  
d6c0: 2f 2a 20 53 74 61 72 74 20 6f 66 20 22 66 6c 75  /* Start of "flu
d6d0: 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f  sh_partition" */
d6e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
d6f0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
d700: 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 73  lFlushPart);.  s
d710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d720: 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20  (v, OP_Once, 0, 
d730: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
d740: 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20  ntAddr(v)+3);.  
d750: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d760: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
d770: 76 2c 20 22 46 6c 75 73 68 5f 70 61 72 74 69 74  v, "Flush_partit
d780: 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 22 29  ion subroutine")
d790: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
d7a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
d7b0: 6e 44 75 70 2c 20 63 73 72 53 74 61 72 74 2c 20  nDup, csrStart, 
d7c0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b  pMWin->iEphCsr);
d7d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
d7e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
d7f0: 75 70 2c 20 63 73 72 45 6e 64 2c 20 70 4d 57 69  up, csrEnd, pMWi
d800: 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20  n->iEphCsr);..  
d810: 2f 2a 20 49 66 20 65 69 74 68 65 72 20 72 65 67  /* If either reg
d820: 53 74 61 72 74 20 6f 72 20 72 65 67 45 6e 64 20  Start or regEnd 
d830: 61 72 65 20 6e 6f 74 20 6e 6f 6e 2d 6e 65 67 61  are not non-nega
d840: 74 69 76 65 20 69 6e 74 65 67 65 72 73 2c 20 74  tive integers, t
d850: 68 72 6f 77 20 0a 20 20 2a 2a 20 61 6e 20 65 78  hrow .  ** an ex
d860: 63 65 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 69  ception.  */.  i
d870: 66 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74  f( pMWin->pStart
d880: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
d890: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d8a0: 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72  pMWin->pStart, r
d8b0: 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20 77 69  egStart);.    wi
d8c0: 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75  ndowCheckIntValu
d8d0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 53 74 61  e(pParse, regSta
d8e0: 72 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  rt, 0);.  }.  if
d8f0: 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 20 29 7b  ( pMWin->pEnd ){
d900: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
d910: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4d 57  Code(pParse, pMW
d920: 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45 6e 64  in->pEnd, regEnd
d930: 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65  );.    windowChe
d940: 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73  ckIntValue(pPars
d950: 65 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a 20  e, regEnd, 1);. 
d960: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
d970: 20 69 73 20 22 52 4f 57 53 20 3c 65 78 70 72 31   is "ROWS <expr1
d980: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 41 4e 44 20  > FOLLOWING AND 
d990: 52 4f 57 53 20 3c 65 78 70 72 32 3e 20 46 4f 4c  ROWS <expr2> FOL
d9a0: 4c 4f 57 49 4e 47 22 2c 20 64 6f 3a 0a 20 20 2a  LOWING", do:.  *
d9b0: 2a 0a 20 20 2a 2a 20 20 20 69 66 28 20 72 65 67  *.  **   if( reg
d9c0: 45 6e 64 3c 72 65 67 53 74 61 72 74 20 29 7b 0a  End<regStart ){.
d9d0: 20 20 2a 2a 20 20 20 20 20 2f 2f 20 54 68 65 20    **     // The 
d9e0: 66 72 61 6d 65 20 61 6c 77 61 79 73 20 63 6f 6e  frame always con
d9f0: 73 69 73 74 73 20 6f 66 20 30 20 72 6f 77 73 0a  sists of 0 rows.
da00: 20 20 2a 2a 20 20 20 20 20 72 65 67 53 74 61 72    **     regStar
da10: 74 20 3d 20 72 65 67 53 69 7a 65 3b 0a 20 20 2a  t = regSize;.  *
da20: 2a 20 20 20 7d 0a 20 20 2a 2a 20 20 20 72 65 67  *   }.  **   reg
da30: 45 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d 20 72  End = regEnd - r
da40: 65 67 53 74 61 72 74 3b 0a 20 20 2a 2f 0a 20 20  egStart;.  */.  
da50: 69 66 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 20  if( pMWin->pEnd 
da60: 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  && pMWin->eStart
da70: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
da80: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
da90: 57 69 6e 2d 3e 70 53 74 61 72 74 21 3d 30 20 29  Win->pStart!=0 )
daa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
dab0: 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f  Win->eEnd==TK_FO
dac0: 4c 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 20 20 73  LLOWING );.    s
dad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
dae0: 28 76 2c 20 4f 50 5f 47 65 2c 20 72 65 67 53 74  (v, OP_Ge, regSt
daf0: 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  art, sqlite3Vdbe
db00: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
db10: 2c 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 56  , regEnd);.    V
db20: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
db30: 4e 75 6c 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c  Null(v);.    sql
db40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
db50: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69  , OP_Copy, regSi
db60: 7a 65 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20  ze, regStart);. 
db70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
db80: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 75 62 74 72  dOp3(v, OP_Subtr
db90: 61 63 74 2c 20 72 65 67 53 74 61 72 74 2c 20 72  act, regStart, r
dba0: 65 67 45 6e 64 2c 20 72 65 67 45 6e 64 29 3b 0a  egEnd, regEnd);.
dbb0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e    }..  if( pMWin
dbc0: 2d 3e 70 53 74 61 72 74 20 26 26 20 70 4d 57 69  ->pStart && pMWi
dbd0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
dbe0: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73  EDING ){.    ass
dbf0: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 70 45 6e 64  ert( pMWin->pEnd
dc00: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
dc10: 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  t( pMWin->eStart
dc20: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
dc30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
dc40: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 65  eAddOp3(v, OP_Le
dc50: 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c 69  , regStart, sqli
dc60: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
dc70: 64 72 28 76 29 2b 33 2c 20 72 65 67 45 6e 64 29  dr(v)+3, regEnd)
dc80: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
dc90: 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a  geNeverNull(v);.
dca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
dcb0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
dcc0: 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53 74  , regSize, regSt
dcd0: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
dce0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dcf0: 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c  P_Copy, regSize,
dd00: 20 72 65 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20   regEnd);.  }.. 
dd10: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
dd20: 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
dd30: 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63 68  egister for each
dd40: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
dd50: 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65   to NULL */.  re
dd60: 67 41 72 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69  gArg = windowIni
dd70: 74 41 63 63 75 6d 28 70 50 61 72 73 65 2c 20 70  tAccum(pParse, p
dd80: 4d 57 69 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65  MWin);..  sqlite
dd90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
dda0: 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d  P_Rewind, pMWin-
ddb0: 3e 69 45 70 68 43 73 72 2c 20 6c 62 6c 46 6c 75  >iEphCsr, lblFlu
ddc0: 73 68 44 6f 6e 65 29 3b 0a 20 20 56 64 62 65 43  shDone);.  VdbeC
ddd0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
dde0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ddf0: 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73  v, OP_Rewind, cs
de00: 72 53 74 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68  rStart, lblFlush
de10: 44 6f 6e 65 29 3b 0a 20 20 56 64 62 65 43 6f 76  Done);.  VdbeCov
de20: 65 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28  erageNeverTaken(
de30: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
de40: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
de50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
de60: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
de70: 64 2c 20 63 73 72 45 6e 64 2c 20 6c 62 6c 46 6c  d, csrEnd, lblFl
de80: 75 73 68 44 6f 6e 65 29 3b 0a 20 20 56 64 62 65  ushDone);.  Vdbe
de90: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
dea0: 65 6e 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  en(v);.  sqlite3
deb0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
dec0: 31 29 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  1);..  /* Invoke
ded0: 20 41 67 67 53 74 65 70 20 66 75 6e 63 74 69 6f   AggStep functio
dee0: 6e 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f  n for each windo
def0: 77 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67  w function using
df00: 20 74 68 65 20 72 6f 77 20 74 68 61 74 0a 20 20   the row that.  
df10: 2a 2a 20 63 73 72 45 6e 64 20 63 75 72 72 65 6e  ** csrEnd curren
df20: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 4f  tly points to. O
df30: 72 2c 20 69 66 20 63 73 72 45 6e 64 20 69 73 20  r, if csrEnd is 
df40: 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46 2c 0a  already at EOF,.
df50: 20 20 2a 2a 20 64 6f 20 6e 6f 74 68 69 6e 67 2e    ** do nothing.
df60: 20 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d    */.  addrTop =
df70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
df80: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
df90: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
dfa0: 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20  K_PRECEDING ){. 
dfb0: 20 20 20 61 64 64 72 49 66 50 6f 73 31 20 3d 20     addrIfPos1 = 
dfc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dfd0: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
dfe0: 65 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b 0a 20  egEnd, 0 , 1);. 
dff0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
e000: 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  v);.  }.  sqlite
e010: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e020: 50 5f 4e 65 78 74 2c 20 63 73 72 45 6e 64 2c 20  P_Next, csrEnd, 
e030: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
e040: 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20 20  ntAddr(v)+2);.  
e050: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e060: 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  .  addr = sqlite
e070: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
e080: 50 5f 47 6f 74 6f 29 3b 0a 20 20 77 69 6e 64 6f  P_Goto);.  windo
e090: 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
e0a0: 20 70 4d 57 69 6e 2c 20 63 73 72 45 6e 64 2c 20   pMWin, csrEnd, 
e0b0: 30 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69  0, regArg, regSi
e0c0: 7a 65 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e  ze);.  if( pMWin
e0d0: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
e0e0: 4e 44 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  NDED ){.    sqli
e0f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e100: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
e110: 72 54 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  rTop);.    sqlit
e120: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
e130: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 61 64 64  , addr);.    add
e140: 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
e150: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e160: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
e170: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
e180: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
e190: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64   if( pMWin->eEnd
e1a0: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
e1b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
e1c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
e1d0: 64 64 72 49 66 50 6f 73 31 29 3b 0a 20 20 20 20  ddrIfPos1);.    
e1e0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57  }.  }..  if( pMW
e1f0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c  in->eEnd==TK_FOL
e200: 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 64  LOWING ){.    ad
e210: 64 72 49 66 50 6f 73 31 20 3d 20 73 71 6c 69 74  drIfPos1 = sqlit
e220: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
e230: 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e 64  OP_IfPos, regEnd
e240: 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56 64  , 0 , 1);.    Vd
e250: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
e260: 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
e270: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
e280: 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72  WING ){.    addr
e290: 49 66 50 6f 73 32 20 3d 20 73 71 6c 69 74 65 33  IfPos2 = sqlite3
e2a0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
e2b0: 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74  _IfPos, regStart
e2c0: 2c 20 30 20 2c 20 31 29 3b 0a 20 20 20 20 56 64  , 0 , 1);.    Vd
e2d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
e2e0: 20 7d 0a 20 20 77 69 6e 64 6f 77 41 67 67 46 69   }.  windowAggFi
e2f0: 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
e300: 6e 2c 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77 52  n, 0);.  windowR
e310: 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72  eturnOneRow(pPar
e320: 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f  se, pMWin, regGo
e330: 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
e340: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
e350: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
e360: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
e370: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
e380: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
e390: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
e3a0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
e3b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
e3c0: 2c 20 30 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  , 0, lblFlushDon
e3d0: 65 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d  e);.  if( pMWin-
e3e0: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
e3f0: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c  OWING ){.    sql
e400: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e410: 28 76 2c 20 61 64 64 72 49 66 50 6f 73 32 29 3b  (v, addrIfPos2);
e420: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69  .  }..  if( pMWi
e430: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
e440: 52 52 45 4e 54 20 0a 20 20 20 7c 7c 20 70 4d 57  RRENT .   || pMW
e450: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50  in->eStart==TK_P
e460: 52 45 43 45 44 49 4e 47 20 0a 20 20 20 7c 7c 20  RECEDING .   || 
e470: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
e480: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20 29  K_FOLLOWING .  )
e490: 7b 0a 20 20 20 20 69 6e 74 20 6c 62 6c 53 6b 69  {.    int lblSki
e4a0: 70 49 6e 76 65 72 73 65 20 3d 20 73 71 6c 69 74  pInverse = sqlit
e4b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
e4c0: 70 50 61 72 73 65 29 3b 3b 0a 20 20 20 20 69 66  pParse);;.    if
e4d0: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
e4e0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b  =TK_PRECEDING ){
e4f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e500: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
e510: 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c 20  fPos, regStart, 
e520: 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 2c 20  lblSkipInverse, 
e530: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
e540: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
e550: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
e560: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
e570: 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71  WING ){.      sq
e580: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e590: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53  v, OP_Next, csrS
e5a0: 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62  tart, sqlite3Vdb
e5b0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e5c0: 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
e5d0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
e5e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e5f0: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
e600: 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65  , lblSkipInverse
e610: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
e620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e630: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
e640: 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c 69  , csrStart, sqli
e650: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e660: 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20 20 20  dr(v)+1);.      
e670: 56 64 62 65 43 6f 76 65 72 61 67 65 41 6c 77 61  VdbeCoverageAlwa
e680: 79 73 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20  ysTaken(v);.    
e690: 7d 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53  }.    windowAggS
e6a0: 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
e6b0: 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c 20  n, csrStart, 1, 
e6c0: 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29  regArg, regSize)
e6d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e6e0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e6f0: 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 29   lblSkipInverse)
e700: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  ;.  }.  if( pMWi
e710: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
e720: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c  OWING ){.    sql
e730: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e740: 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29 3b  (v, addrIfPos1);
e750: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
e760: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
e770: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  oto, 0, addrTop)
e780: 3b 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70 61  ;..  /* flush_pa
e790: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a 2f  rtition_done: */
e7a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
e7b0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
e7c0: 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73  lFlushDone);.  s
e7d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
e7e0: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
e7f0: 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  er, pMWin->iEphC
e800: 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  sr);.  sqlite3Vd
e810: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
e820: 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50  eturn, regFlushP
e830: 61 72 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  art);.  VdbeComm
e840: 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 66 6c 75  ent((v, "end flu
e850: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62  sh_partition sub
e860: 72 6f 75 74 69 6e 65 22 29 29 3b 0a 0a 20 20 2f  routine"));..  /
e870: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74  * Jump to here t
e880: 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73  o skip over flus
e890: 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20  h_partition */. 
e8a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e8b0: 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f  Here(v, addrGoto
e8c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e8d0: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
e8e0: 68 65 20 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74  he work of sqlit
e8f0: 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
e900: 28 29 20 66 6f 72 20 63 61 73 65 73 20 74 68 61  () for cases tha
e910: 74 0a 2a 2a 20 77 6f 75 6c 64 20 6e 6f 72 6d 61  t.** would norma
e920: 6c 6c 79 20 62 65 20 68 61 6e 64 6c 65 64 20 62  lly be handled b
e930: 79 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61  y windowCodeDefa
e940: 75 6c 74 53 74 65 70 28 29 20 77 68 65 6e 20 74  ultStep() when t
e950: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 6e 65 20  here are.** one 
e960: 6f 72 20 6d 6f 72 65 20 62 75 69 6c 74 2d 69 6e  or more built-in
e970: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
e980: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 74  s that require t
e990: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
e9a0: 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 63 61 63  ion.** to be cac
e9b0: 68 65 64 20 69 6e 20 61 20 74 65 6d 70 20 74 61  hed in a temp ta
e9c0: 62 6c 65 20 62 65 66 6f 72 65 20 61 6e 79 20 72  ble before any r
e9d0: 6f 77 73 20 63 61 6e 20 62 65 20 72 65 74 75 72  ows can be retur
e9e0: 6e 65 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ned. Additionall
e9f0: 79 2e 0a 2a 2a 20 22 52 41 4e 47 45 20 42 45 54  y..** "RANGE BET
ea00: 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
ea10: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
ea20: 4f 4c 4c 4f 57 49 4e 47 22 20 69 73 20 61 6c 77  OLLOWING" is alw
ea30: 61 79 73 20 68 61 6e 64 6c 65 64 20 62 79 0a 2a  ays handled by.*
ea40: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  * this function.
ea50: 0a 2a 2a 0a 2a 2a 20 50 73 65 75 64 6f 2d 63 6f  .**.** Pseudo-co
ea60: 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  de corresponding
ea70: 20 74 6f 20 74 68 65 20 56 4d 20 63 6f 64 65 20   to the VM code 
ea80: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 69  generated by thi
ea90: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  s function.** fo
eaa0: 72 20 65 61 63 68 20 74 79 70 65 20 6f 66 20 77  r each type of w
eab0: 69 6e 64 6f 77 20 66 6f 6c 6c 6f 77 73 2e 0a 2a  indow follows..*
eac0: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
ead0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
eae0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
eaf0: 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 66  NT ROW.**.**   f
eb00: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a  lush_partition:.
eb10: 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a  **     Once {.**
eb20: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
eb30: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 4c 65  iEphCsr -> csrLe
eb40: 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ad).**     }.** 
eb50: 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20      Integer ctr 
eb60: 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  0.**     foreach
eb70: 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a   row (csrLead){.
eb80: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  **       if( new
eb90: 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20   peer ){.**     
eba0: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
ebb0: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20  alue).**        
ebc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
ebd0: 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
ebe0: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
ebf0: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  sub.**          
ec00: 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a   Next iEphCsr.**
ec10: 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
ec20: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74        Integer ct
ec30: 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  r 0.**       }.*
ec40: 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20  *       AggStep 
ec50: 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20  (csrLead).**    
ec60: 20 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20     Incr ctr.**  
ec70: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41     }.**.**     A
ec80: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
ec90: 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69  ze).**     for(i
eca0: 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b  =0; i<ctr; i++){
ecb0: 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
ecc0: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
ecd0: 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a     Next iEphCsr.
ece0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20  **     }.**.**  
ecf0: 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 28     ResetSorter (
ed00: 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75  csr).**     Retu
ed10: 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  rn.**.** ROWS BE
ed20: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
ed30: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
ed40: 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20  RRENT ROW.**.** 
ed50: 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65    As above, exce
ed60: 70 74 20 74 68 61 74 20 74 68 65 20 22 69 66 28  pt that the "if(
ed70: 20 6e 65 77 20 70 65 65 72 20 29 22 20 62 72 61   new peer )" bra
ed80: 6e 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 61  nch is always ta
ed90: 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45  ken..**.** RANGE
eda0: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
edb0: 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54   ROW AND CURRENT
edc0: 20 52 4f 57 20 0a 2a 2a 0a 2a 2a 20 20 20 41 73   ROW .**.**   As
edd0: 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
ede0: 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65 20  hat each of the 
edf0: 66 6f 72 28 29 20 6c 6f 6f 70 73 20 62 65 63 6f  for() loops beco
ee00: 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  mes:.**.**      
ee10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74     for(i=0; i<ct
ee20: 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20  r; i++){.**     
ee30: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
ee40: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20  Gosub.**        
ee50: 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28 69     AggInverse (i
ee60: 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20 20  EphCsr).**      
ee70: 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73       Next iEphCs
ee80: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  r.**         }.*
ee90: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
eea0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
eeb0: 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55  CEDING AND UNBOU
eec0: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
eed0: 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72  *.**   flush_par
eee0: 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f  tition:.**     O
eef0: 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f  nce {.**       O
ef00: 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20  penDup (iEphCsr 
ef10: 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  -> csrLead).**  
ef20: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65     }.**     fore
ef30: 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64  ach row (csrLead
ef40: 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67  ) {.**       Agg
ef50: 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a 2a  Step (csrLead).*
ef60: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66  *     }.**     f
ef70: 6f 72 65 61 63 68 20 72 6f 77 20 28 69 45 70 68  oreach row (iEph
ef80: 43 73 72 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Csr) {.**       
ef90: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
efa0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a 20  **     }.** .** 
efb0: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
efc0: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
efd0: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
efe0: 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f  G.**.**   flush_
eff0: 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20  partition:.**   
f000: 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20    Once {.**     
f010: 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43    OpenDup (iEphC
f020: 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a  sr -> csrLead).*
f030: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66  *     }.**     f
f040: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
f050: 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  ead){.**       A
f060: 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29  ggStep (csrLead)
f070: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
f080: 20 52 65 77 69 6e 64 20 28 63 73 72 4c 65 61 64   Rewind (csrLead
f090: 29 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65 72  ).**     Integer
f0a0: 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66 6f   ctr 0.**     fo
f0b0: 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65  reach row (csrLe
f0c0: 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  ad){.**       if
f0d0: 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a  ( new peer ){.**
f0e0: 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e 61           AggFina
f0f0: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
f100: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f110: 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20  <ctr; i++){.**  
f120: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
f130: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
f140: 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65        AggInverse
f150: 20 28 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20   (iEphCsr).**   
f160: 20 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70          Next iEp
f170: 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  hCsr.**         
f180: 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 6e 74  }.**         Int
f190: 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20  eger ctr 0.**   
f1a0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
f1b0: 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d  ncr ctr.**     }
f1c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46 69  .**.**     AggFi
f1d0: 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a  nal (xFinalize).
f1e0: 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  **     for(i=0; 
f1f0: 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
f200: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
f210: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e  Gosub.**       N
f220: 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20  ext iEphCsr.**  
f230: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52     }.**.**     R
f240: 65 73 65 74 53 6f 72 74 65 72 20 28 63 73 72 29  esetSorter (csr)
f250: 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a  .**     Return.*
f260: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
f270: 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65  ndowCodeCacheSte
f280: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
f290: 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70  se, .  Select *p
f2a0: 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ,.  WhereInfo *p
f2b0: 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67  WInfo,.  int reg
f2c0: 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64  Gosub, .  int ad
f2d0: 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e  drGosub.){.  Win
f2e0: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
f2f0: 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  pWin;.  Vdbe *v 
f300: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f310: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
f320: 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  k;.  int addr;. 
f330: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
f340: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
f350: 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74  tion;.  ExprList
f360: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57   *pOrderBy = pMW
f370: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  in->pOrderBy;.  
f380: 69 6e 74 20 6e 50 65 65 72 20 3d 20 70 4f 72 64  int nPeer = pOrd
f390: 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d  erBy ? pOrderBy-
f3a0: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 69 6e  >nExpr : 0;.  in
f3b0: 74 20 72 65 67 4e 65 77 50 65 65 72 3b 0a 0a 20  t regNewPeer;.. 
f3c0: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 20 20   int addrGoto;  
f3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 47   /* Address of G
f3f0: 6f 74 6f 20 75 73 65 64 20 74 6f 20 6a 75 6d 70  oto used to jump
f400: 20 66 6c 75 73 68 5f 70 61 72 2e 2e 20 2a 2f 0a   flush_par.. */.
f410: 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 20    int addrNext; 
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f430: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
f440: 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  or next iteratio
f450: 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  n of loop */.  i
f460: 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74 3b  nt regFlushPart;
f470: 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50  .  int lblFlushP
f480: 61 72 74 3b 0a 20 20 69 6e 74 20 63 73 72 4c 65  art;.  int csrLe
f490: 61 64 3b 0a 20 20 69 6e 74 20 72 65 67 43 74 72  ad;.  int regCtr
f4a0: 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 20  ;.  int regArg; 
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4c0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
f4d0: 61 72 72 61 79 20 74 6f 20 6d 61 72 74 69 61 6c  array to martial
f4e0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 73 20 2a   function args *
f4f0: 2f 0a 20 20 69 6e 74 20 72 65 67 53 69 7a 65 3b  /.  int regSize;
f500: 0a 20 20 69 6e 74 20 6c 62 6c 45 6d 70 74 79 3b  .  int lblEmpty;
f510: 0a 20 20 69 6e 74 20 62 52 65 76 65 72 73 65 20  .  int bReverse 
f520: 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
f530: 79 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61  y && pMWin->eSta
f540: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  rt==TK_CURRENT .
f550: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4d 57            && pMW
f560: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
f570: 4f 55 4e 44 45 44 3b 0a 0a 20 20 61 73 73 65 72  OUNDED;..  asser
f580: 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  t( (pMWin->eStar
f590: 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t==TK_UNBOUNDED 
f5a0: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
f5b0: 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 20  TK_CURRENT) .   
f5c0: 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
f5d0: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
f5e0: 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
f5f0: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
f600: 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  ) .       || (pM
f610: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
f620: 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
f630: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
f640: 4e 54 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  NT) .       || (
f650: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
f660: 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57  K_CURRENT && pMW
f670: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
f680: 4f 55 4e 44 45 44 29 20 0a 20 20 29 3b 0a 0a 20  OUNDED) .  );.. 
f690: 20 6c 62 6c 45 6d 70 74 79 20 3d 20 73 71 6c 69   lblEmpty = sqli
f6a0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f6b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 4e  (pParse);.  regN
f6c0: 65 77 50 65 65 72 20 3d 20 70 50 61 72 73 65 2d  ewPeer = pParse-
f6d0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73  >nMem+1;.  pPars
f6e0: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72  e->nMem += nPeer
f6f0: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
f700: 20 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61   register and la
f710: 62 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75  bel for the "flu
f720: 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75  sh_partition" su
f730: 62 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20  b-routine. */.  
f740: 72 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b  regFlushPart = +
f750: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
f760: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20   lblFlushPart = 
f770: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
f780: 61 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20  abel(pParse);.. 
f790: 20 63 73 72 4c 65 61 64 20 3d 20 70 50 61 72 73   csrLead = pPars
f7a0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 72 65 67  e->nTab++;.  reg
f7b0: 43 74 72 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Ctr = ++pParse->
f7c0: 6e 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50  nMem;..  windowP
f7d0: 61 72 74 69 74 69 6f 6e 43 61 63 68 65 28 70 50  artitionCache(pP
f7e0: 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c  arse, p, pWInfo,
f7f0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
f800: 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 26 72 65  blFlushPart, &re
f810: 67 53 69 7a 65 29 3b 0a 20 20 61 64 64 72 47 6f  gSize);.  addrGo
f820: 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
f830: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
f840: 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20  o);..  /* Start 
f850: 6f 66 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74  of "flush_partit
f860: 69 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ion" */.  sqlite
f870: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f880: 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72  l(v, lblFlushPar
f890: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
f8a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e  eAddOp2(v, OP_On
f8b0: 63 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64  ce, 0, sqlite3Vd
f8c0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f8d0: 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  +2);.  VdbeCover
f8e0: 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
f8f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f900: 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 4c 65  P_OpenDup, csrLe
f910: 61 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  ad, pMWin->iEphC
f920: 73 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  sr);..  /* Initi
f930: 61 6c 69 7a 65 20 74 68 65 20 61 63 63 75 6d 75  alize the accumu
f940: 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66  lator register f
f950: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
f960: 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20  unction to NULL 
f970: 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20 77 69  */.  regArg = wi
f980: 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70 50  ndowInitAccum(pP
f990: 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20  arse, pMWin);.. 
f9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
f9b0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
f9c0: 2c 20 30 2c 20 72 65 67 43 74 72 29 3b 0a 20 20  , 0, regCtr);.  
f9d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f9e0: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
f9f0: 63 73 72 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74  csrLead, lblEmpt
fa00: 79 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  y);.  VdbeCovera
fa10: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
fa20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fa30: 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e  _Rewind, pMWin->
fa40: 69 45 70 68 43 73 72 2c 20 6c 62 6c 45 6d 70 74  iEphCsr, lblEmpt
fa50: 79 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  y);.  VdbeCovera
fa60: 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b  geNeverTaken(v);
fa70: 0a 0a 20 20 69 66 28 20 62 52 65 76 65 72 73 65  ..  if( bReverse
fa80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
fa90: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
faa0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
fab0: 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70     windowAggStep
fac0: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
fad0: 63 73 72 4c 65 61 64 2c 20 30 2c 20 72 65 67 41  csrLead, 0, regA
fae0: 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20  rg, regSize);.  
faf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fb00: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
fb10: 63 73 72 4c 65 61 64 2c 20 61 64 64 72 32 29 3b  csrLead, addr2);
fb20: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
fb30: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
fb40: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
fb50: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 4c 65 61  P_Rewind, csrLea
fb60: 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20  d, lblEmpty);.  
fb70: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
fb80: 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 7d  verTaken(v);.  }
fb90: 0a 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71  .  addrNext = sq
fba0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
fbb0: 41 64 64 72 28 76 29 3b 0a 0a 20 20 69 66 28 20  Addr(v);..  if( 
fbc0: 70 4f 72 64 65 72 42 79 20 26 26 20 28 70 4d 57  pOrderBy && (pMW
fbd0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  in->eEnd==TK_CUR
fbe0: 52 45 4e 54 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65  RENT || pMWin->e
fbf0: 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
fc00: 54 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  T) ){.    int bC
fc10: 75 72 72 65 6e 74 20 3d 20 28 70 4d 57 69 6e 2d  urrent = (pMWin-
fc20: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52  >eStart==TK_CURR
fc30: 45 4e 54 29 3b 0a 20 20 20 20 69 6e 74 20 61 64  ENT);.    int ad
fc40: 64 72 4a 75 6d 70 20 3d 20 30 3b 20 20 20 20 20  drJump = 0;     
fc50: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
fc60: 73 73 20 6f 66 20 4f 50 5f 4a 75 6d 70 20 62 65  ss of OP_Jump be
fc70: 6c 6f 77 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  low */.    if( p
fc80: 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f  MWin->eType==TK_
fc90: 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 69  RANGE ){.      i
fca0: 6e 74 20 69 4f 66 66 20 3d 20 70 4d 57 69 6e 2d  nt iOff = pMWin-
fcb0: 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b 20 28 70  >nBufferCol + (p
fcc0: 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45  Part ? pPart->nE
fcd0: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
fce0: 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 70 4d  int regPeer = pM
fcf0: 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 2b 20 28  Win->regPart + (
fd00: 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e  pPart ? pPart->n
fd10: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20  Expr : 0);.     
fd20: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
fd30: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
fd40: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
fd50: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
fd60: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 66  , 0, 0);.      f
fd70: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 50 65 65 72 3b  or(k=0; k<nPeer;
fd80: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   k++){.        s
fd90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fda0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
fdb0: 73 72 4c 65 61 64 2c 20 69 4f 66 66 2b 6b 2c 20  srLead, iOff+k, 
fdc0: 72 65 67 4e 65 77 50 65 65 72 2b 6b 29 3b 0a 20  regNewPeer+k);. 
fdd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64       }.      add
fde0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
fdf0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
fe00: 61 72 65 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  are, regNewPeer,
fe10: 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29   regPeer, nPeer)
fe20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
fe30: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
fe40: 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  void*)pKeyInfo, 
fe50: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
fe60: 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71     addrJump = sq
fe70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fe80: 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
fe90: 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a  +2, 0, addr+2);.
fea0: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
feb0: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
fec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fed0: 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65  , OP_Copy, regNe
fee0: 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20  wPeer, regPeer, 
fef0: 6e 50 65 65 72 2d 31 29 3b 0a 20 20 20 20 7d 0a  nPeer-1);.    }.
ff00: 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74 75 72  .    windowRetur
ff10: 6e 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d  nRows(pParse, pM
ff20: 57 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67  Win, regCtr, reg
ff30: 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
ff40: 2c 20 0a 20 20 20 20 20 20 20 20 28 62 43 75 72  , .        (bCur
ff50: 72 65 6e 74 20 3f 20 72 65 67 41 72 67 20 3a 20  rent ? regArg : 
ff60: 30 29 2c 20 28 62 43 75 72 72 65 6e 74 20 3f 20  0), (bCurrent ? 
ff70: 72 65 67 53 69 7a 65 20 3a 20 30 29 0a 20 20 20  regSize : 0).   
ff80: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72   );.    if( addr
ff90: 4a 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64  Jump ) sqlite3Vd
ffa0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
ffb0: 64 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20  drJump);.  }..  
ffc0: 69 66 28 20 62 52 65 76 65 72 73 65 3d 3d 30 20  if( bReverse==0 
ffd0: 29 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67  ){.    windowAgg
ffe0: 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
fff0: 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20 30 2c 20  in, csrLead, 0, 
10000 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29  regArg, regSize)
10010 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
10020 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10030 41 64 64 49 6d 6d 2c 20 72 65 67 43 74 72 2c 20  AddImm, regCtr, 
10040 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
10050 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10060 78 74 2c 20 63 73 72 4c 65 61 64 2c 20 61 64 64  xt, csrLead, add
10070 72 4e 65 78 74 29 3b 0a 20 20 56 64 62 65 43 6f  rNext);.  VdbeCo
10080 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 77 69  verage(v);..  wi
10090 6e 64 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 70  ndowReturnRows(p
100a0 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65  Parse, pMWin, re
100b0 67 43 74 72 2c 20 72 65 67 47 6f 73 75 62 2c 20  gCtr, regGosub, 
100c0 61 64 64 72 47 6f 73 75 62 2c 20 30 2c 20 30 29  addrGosub, 0, 0)
100d0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ;..  sqlite3Vdbe
100e0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
100f0 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 73 71 6c  lblEmpty);.  sql
10100 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10110 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72  , OP_ResetSorter
10120 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
10130 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
10140 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
10150 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50 61 72  urn, regFlushPar
10160 74 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  t);..  /* Jump t
10170 6f 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 6f  o here to skip o
10180 76 65 72 20 66 6c 75 73 68 5f 70 61 72 74 69 74  ver flush_partit
10190 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
101a0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
101b0 61 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 0a 2f  addrGoto);.}.../
101c0 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
101d0 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
101e0 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
101f0 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 2e  NT ROW.**.**   .
10200 2e 2e 0a 2a 2a 20 20 20 20 20 69 66 28 20 6e 65  ...**     if( ne
10210 77 20 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a  w partition ){.*
10220 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c  *       AggFinal
10230 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20   (xFinalize).** 
10240 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
10250 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52  Gosub.**       R
10260 65 73 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74  esetSorter eph-t
10270 61 62 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  able.**     }.**
10280 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 65       else if( ne
10290 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20  w peer ){.**    
102a0 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
102b0 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f  lue).**       Go
102c0 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
102d0 20 20 20 20 20 20 20 52 65 73 65 74 53 6f 72 74         ResetSort
102e0 65 72 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20  er eph-table.** 
102f0 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67      }.**     Agg
10300 53 74 65 70 0a 2a 2a 20 20 20 20 20 49 6e 73 65  Step.**     Inse
10310 72 74 20 28 72 65 63 6f 72 64 20 69 6e 74 6f 20  rt (record into 
10320 65 70 68 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20  eph-table).**   
10330 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
10340 29 0a 2a 2a 20 20 20 41 67 67 46 69 6e 61 6c 20  ).**   AggFinal 
10350 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20  (xFinalize).**  
10360 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
10370 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
10380 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50  WEEN UNBOUNDED P
10390 52 45 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42  RECEDING AND UNB
103a0 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
103b0 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76  .**.**   As abov
103c0 65 2c 20 65 78 63 65 70 74 20 74 61 6b 65 20 6e  e, except take n
103d0 6f 20 61 63 74 69 6f 6e 20 66 6f 72 20 61 20 22  o action for a "
103e0 6e 65 77 20 70 65 65 72 22 2e 20 49 6e 76 6f 6b  new peer". Invok
103f0 65 0a 2a 2a 20 20 20 74 68 65 20 73 75 62 2d 72  e.**   the sub-r
10400 6f 75 74 69 6e 65 20 6f 6e 63 65 20 6f 6e 6c 79  outine once only
10410 20 66 6f 72 20 65 61 63 68 20 70 61 72 74 69 74   for each partit
10420 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45  ion..**.** RANGE
10430 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
10440 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54   ROW AND CURRENT
10450 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20   ROW.**.**   As 
10460 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68  above, except th
10470 61 74 20 74 68 65 20 22 6e 65 77 20 70 65 65 72  at the "new peer
10480 22 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 68  " condition is h
10490 61 6e 64 6c 65 64 20 69 6e 20 74 68 65 0a 2a 2a  andled in the.**
104a0 20 20 20 73 61 6d 65 20 77 61 79 20 61 73 20 22     same way as "
104b0 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 22 20 28  new partition" (
104c0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 22  so there is no "
104d0 65 6c 73 65 20 69 66 22 20 62 6c 6f 63 6b 29 2e  else if" block).
104e0 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  .**.** ROWS BETW
104f0 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
10500 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
10510 45 4e 54 20 52 4f 57 0a 2a 2a 20 0a 2a 2a 20 20  ENT ROW.** .**  
10520 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   As above, excep
10530 74 20 61 73 73 75 6d 65 20 65 76 65 72 79 20 72  t assume every r
10540 6f 77 20 69 73 20 61 20 22 6e 65 77 20 70 65 65  ow is a "new pee
10550 72 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  r"..*/.static vo
10560 69 64 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  id windowCodeDef
10570 61 75 6c 74 53 74 65 70 28 0a 20 20 50 61 72 73  aultStep(.  Pars
10580 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65  e *pParse, .  Se
10590 6c 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65  lect *p,.  Where
105a0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20  Info *pWInfo,.  
105b0 69 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20  int regGosub, . 
105c0 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29   int addrGosub.)
105d0 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  {.  Window *pMWi
105e0 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56  n = p->pWin;.  V
105f0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
10600 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
10610 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20  .  int k;.  int 
10620 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72  iSubCsr = p->pSr
10630 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
10640 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d  .  int nSub = p-
10650 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
10660 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 65  ->nCol;.  int re
10670 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
10680 2b 31 3b 0a 20 20 69 6e 74 20 72 65 67 52 65 63  +1;.  int regRec
10690 6f 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a  ord = reg+nSub;.
106a0 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 20 3d    int regRowid =
106b0 20 72 65 67 52 65 63 6f 72 64 2b 31 3b 0a 20 20   regRecord+1;.  
106c0 69 6e 74 20 61 64 64 72 3b 0a 20 20 45 78 70 72  int addr;.  Expr
106d0 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20 70 4d  List *pPart = pM
106e0 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b  Win->pPartition;
106f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
10700 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70  derBy = pMWin->p
10710 4f 72 64 65 72 42 79 3b 0a 0a 20 20 61 73 73 65  OrderBy;..  asse
10720 72 74 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  rt( pMWin->eType
10730 3d 3d 54 4b 5f 52 41 4e 47 45 20 0a 20 20 20 20  ==TK_RANGE .    
10740 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
10750 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  art==TK_UNBOUNDE
10760 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  D && pMWin->eEnd
10770 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20  ==TK_CURRENT).  
10780 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70  );..  assert( (p
10790 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
107a0 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d  _UNBOUNDED && pM
107b0 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55  Win->eEnd==TK_CU
107c0 52 52 45 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c  RRENT).       ||
107d0 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d   (pMWin->eStart=
107e0 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26  =TK_UNBOUNDED &&
107f0 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
10800 5f 55 4e 42 4f 55 4e 44 45 44 29 0a 20 20 20 20  _UNBOUNDED).    
10810 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53     || (pMWin->eS
10820 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
10830 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
10840 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 20  =TK_CURRENT).   
10850 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
10860 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
10870 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  T && pMWin->eEnd
10880 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26  ==TK_UNBOUNDED &
10890 26 20 21 70 4f 72 64 65 72 42 79 29 0a 20 20 29  & !pOrderBy).  )
108a0 3b 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  ;..  if( pMWin->
108b0 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44  eEnd==TK_UNBOUND
108c0 45 44 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  ED ){.    pOrder
108d0 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  By = 0;.  }..  p
108e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
108f0 53 75 62 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4c  Sub + 2;..  /* L
10900 6f 61 64 20 74 68 65 20 69 6e 64 69 76 69 64 75  oad the individu
10910 61 6c 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  al column values
10920 20 6f 66 20 74 68 65 20 72 6f 77 20 72 65 74 75   of the row retu
10930 72 6e 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  rned by.  ** the
10940 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e 74 6f   sub-select into
10950 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
10960 69 73 74 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72  isters. */.  for
10970 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b  (k=0; k<nSub; k+
10980 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
10990 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
109a0 43 6f 6c 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c  Column, iSubCsr,
109b0 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a   k, reg+k);.  }.
109c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
109d0 68 69 73 20 69 73 20 74 68 65 20 73 74 61 72 74  his is the start
109e0 20 6f 66 20 61 20 6e 65 77 20 70 61 72 74 69 74   of a new partit
109f0 69 6f 6e 20 6f 72 20 70 65 65 72 20 67 72 6f 75  ion or peer grou
10a00 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  p. */.  if( pPar
10a10 74 20 7c 7c 20 70 4f 72 64 65 72 42 79 20 29 7b  t || pOrderBy ){
10a20 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d  .    int nPart =
10a30 20 28 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d   (pPart ? pPart-
10a40 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20  >nExpr : 0);.   
10a50 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 20 3d 20   int addrGoto = 
10a60 30 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a  0;.    int addrJ
10a70 75 6d 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ump = 0;.    int
10a80 20 6e 50 65 65 72 20 3d 20 28 70 4f 72 64 65 72   nPeer = (pOrder
10a90 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By ? pOrderBy->n
10aa0 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20  Expr : 0);..    
10ab0 69 66 28 20 70 50 61 72 74 20 29 7b 0a 20 20 20  if( pPart ){.   
10ac0 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72     int regNewPar
10ad0 74 20 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d  t = reg + pMWin-
10ae0 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20  >nBufferCol;.   
10af0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
10b00 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
10b10 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
10b20 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c  t(pParse, pPart,
10b30 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64   0, 0);.      ad
10b40 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
10b50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
10b60 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74  pare, regNewPart
10b70 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
10b80 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20 20 20 73  ,nPart);.      s
10b90 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
10ba0 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65  P4(v, (void*)pKe
10bb0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
10bc0 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75  O);.      addrJu
10bd0 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
10be0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
10bf0 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64  p, addr+2, 0, ad
10c00 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  dr+2);.      Vdb
10c10 65 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29  eCoverageEqNe(v)
10c20 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67  ;.      windowAg
10c30 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
10c40 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20  MWin, 1);.      
10c50 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
10c60 20 20 20 20 20 20 20 20 61 64 64 72 47 6f 74 6f          addrGoto
10c70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10c80 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
10c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10ca0 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
10cb0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  y ){.      int r
10cc0 65 67 4e 65 77 50 65 65 72 20 3d 20 72 65 67 20  egNewPeer = reg 
10cd0 2b 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72  + pMWin->nBuffer
10ce0 43 6f 6c 20 2b 20 6e 50 61 72 74 3b 0a 20 20 20  Col + nPart;.   
10cf0 20 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d     int regPeer =
10d00 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 20   pMWin->regPart 
10d10 2b 20 6e 50 61 72 74 3b 0a 0a 20 20 20 20 20 20  + nPart;..      
10d20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73  if( addrJump ) s
10d30 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
10d40 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b  re(v, addrJump);
10d50 0a 20 20 20 20 20 20 69 66 28 20 70 4d 57 69 6e  .      if( pMWin
10d60 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ->eType==TK_RANG
10d70 45 20 29 7b 0a 20 20 20 20 20 20 20 20 4b 65 79  E ){.        Key
10d80 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
10d90 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
10da0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
10db0 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 2c  se, pOrderBy, 0,
10dc0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64   0);.        add
10dd0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
10de0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp3(v, OP_Comp
10df0 61 72 65 2c 20 72 65 67 4e 65 77 50 65 65 72 2c  are, regNewPeer,
10e00 20 72 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29   regPeer, nPeer)
10e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10e20 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
10e30 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
10e40 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
10e50 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20         addrJump 
10e60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
10e70 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
10e80 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
10e90 32 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  2);.        Vdbe
10ea0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
10eb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10ec0 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 0a    addrJump = 0;.
10ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 69        }.      wi
10ee0 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
10ef0 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69  rse, pMWin, pMWi
10f00 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
10f10 52 52 45 4e 54 29 3b 0a 20 20 20 20 20 20 69 66  RRENT);.      if
10f20 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73 71 6c  ( addrGoto ) sql
10f30 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10f40 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20  (v, addrGoto);. 
10f50 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
10f60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10f70 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d  P_Rewind, pMWin-
10f80 3e 69 45 70 68 43 73 72 2c 73 71 6c 69 74 65 33  >iEphCsr,sqlite3
10f90 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10fa0 76 29 2b 33 29 3b 0a 20 20 20 20 56 64 62 65 43  v)+3);.    VdbeC
10fb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10fc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10fd0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
10fe0 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
10ff0 75 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ub);.    sqlite3
11000 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11010 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  _Next, pMWin->iE
11020 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56 64  phCsr, sqlite3Vd
11030 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
11040 2d 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76  -1);.    VdbeCov
11050 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 73  erage(v);..    s
11060 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11070 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
11080 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  er, pMWin->iEphC
11090 73 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sr);.    sqlite3
110a0 56 64 62 65 41 64 64 4f 70 33 28 0a 20 20 20 20  VdbeAddOp3(.    
110b0 20 20 20 20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20      v, OP_Copy, 
110c0 72 65 67 2b 70 4d 57 69 6e 2d 3e 6e 42 75 66 66  reg+pMWin->nBuff
110d0 65 72 43 6f 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65  erCol, pMWin->re
110e0 67 50 61 72 74 2c 20 6e 50 61 72 74 2b 6e 50 65  gPart, nPart+nPe
110f0 65 72 2d 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20  er-1.    );..   
11100 20 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20   if( addrJump ) 
11110 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
11120 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29  ere(v, addrJump)
11130 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 6f  ;.  }..  /* Invo
11140 6b 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  ke step function
11150 20 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63   for window func
11160 74 69 6f 6e 73 20 2a 2f 0a 20 20 77 69 6e 64 6f  tions */.  windo
11170 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
11180 20 70 4d 57 69 6e 2c 20 2d 31 2c 20 30 2c 20 72   pMWin, -1, 0, r
11190 65 67 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 42 75  eg, 0);..  /* Bu
111a0 66 66 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  ffer the current
111b0 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70 68 65   row in the ephe
111c0 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a  meral table. */.
111d0 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 6e 42 75    if( pMWin->nBu
111e0 66 66 65 72 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  fferCol>0 ){.   
111f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11200 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
11210 6f 72 64 2c 20 72 65 67 2c 20 70 4d 57 69 6e 2d  ord, reg, pMWin-
11220 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 72 65 67  >nBufferCol, reg
11230 52 65 63 6f 72 64 29 3b 0a 20 20 7d 65 6c 73 65  Record);.  }else
11240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
11250 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 42 6c  eAddOp2(v, OP_Bl
11260 6f 62 2c 20 30 2c 20 72 65 67 52 65 63 6f 72 64  ob, 0, regRecord
11270 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11280 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
11290 6f 69 64 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d  oid*)"", 0);.  }
112a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
112b0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
112c0 77 69 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  wid, pMWin->iEph
112d0 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Csr, regRowid);.
112e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
112f0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
11300 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
11310 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67  , regRecord, reg
11320 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e  Rowid);..  /* En
11330 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
11340 63 61 6e 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 73  can loop. */.  s
11350 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
11360 57 49 6e 66 6f 29 3b 0a 0a 20 20 77 69 6e 64 6f  WInfo);..  windo
11370 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
11380 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 73  , pMWin, 1);.  s
11390 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
113a0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
113b0 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71  MWin->iEphCsr,sq
113c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
113d0 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 56 64  Addr(v)+3);.  Vd
113e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
113f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11400 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
11410 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
11420 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  sub);.  sqlite3V
11430 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11440 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  Next, pMWin->iEp
11450 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62  hCsr, sqlite3Vdb
11460 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d  eCurrentAddr(v)-
11470 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  1);.  VdbeCovera
11480 67 65 28 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ge(v);.}../*.** 
11490 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
114a0 75 72 6e 20 61 20 64 75 70 6c 69 63 61 74 65 20  urn a duplicate 
114b0 6f 66 20 74 68 65 20 57 69 6e 64 6f 77 20 6f 62  of the Window ob
114c0 6a 65 63 74 20 69 6e 64 69 63 61 74 65 64 20 62  ject indicated b
114d0 79 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 61  y the.** third a
114e0 72 67 75 6d 65 6e 74 2e 20 53 65 74 20 74 68 65  rgument. Set the
114f0 20 57 69 6e 64 6f 77 2e 70 4f 77 6e 65 72 20 66   Window.pOwner f
11500 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65 77 20  ield of the new 
11510 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 70 4f 77  object to.** pOw
11520 6e 65 72 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a  ner..*/.Window *
11530 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70  sqlite3WindowDup
11540 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
11550 70 72 20 2a 70 4f 77 6e 65 72 2c 20 57 69 6e 64  pr *pOwner, Wind
11560 6f 77 20 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77  ow *p){.  Window
11570 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66   *pNew = 0;.  if
11580 28 20 41 4c 57 41 59 53 28 70 29 20 29 7b 0a 20  ( ALWAYS(p) ){. 
11590 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
115a0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
115b0 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29  , sizeof(Window)
115c0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
115d0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a  ){.      pNew->z
115e0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
115f0 53 74 72 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e  StrDup(db, p->zN
11600 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ame);.      pNew
11610 2d 3e 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69  ->pFilter = sqli
11620 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
11630 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20  ->pFilter, 0);. 
11640 20 20 20 20 20 70 4e 65 77 2d 3e 70 46 75 6e 63       pNew->pFunc
11650 20 3d 20 70 2d 3e 70 46 75 6e 63 3b 0a 20 20 20   = p->pFunc;.   
11660 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 74 69 74     pNew->pPartit
11670 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ion = sqlite3Exp
11680 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
11690 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
116a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64        pNew->pOrd
116b0 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
116c0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
116d0 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  >pOrderBy, 0);. 
116e0 20 20 20 20 20 70 4e 65 77 2d 3e 65 54 79 70 65       pNew->eType
116f0 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20   = p->eType;.   
11700 20 20 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20     pNew->eEnd = 
11710 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70  p->eEnd;.      p
11720 4e 65 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d  New->eStart = p-
11730 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70  >eStart;.      p
11740 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71  New->pStart = sq
11750 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
11760 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a   p->pStart, 0);.
11770 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64        pNew->pEnd
11780 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
11790 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30  p(db, p->pEnd, 0
117a0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
117b0 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a  Owner = pOwner;.
117c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
117d0 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
117e0 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20  * Return a copy 
117f0 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  of the linked li
11800 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a  st of Window obj
11810 65 63 74 73 20 70 61 73 73 65 64 20 61 73 20 74  ects passed as t
11820 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67  he.** second arg
11830 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77  ument..*/.Window
11840 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c   *sqlite3WindowL
11850 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
11860 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
11870 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
11880 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d    Window *pRet =
11890 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70   0;.  Window **p
118a0 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f  p = &pRet;..  fo
118b0 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20  r(pWin=p; pWin; 
118c0 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
118d0 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20  Win){.    *pp = 
118e0 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70  sqlite3WindowDup
118f0 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20  (db, 0, pWin);. 
11900 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20     if( *pp==0 ) 
11910 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20  break;.    pp = 
11920 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69  &((*pp)->pNextWi
11930 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
11940 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
11950 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
11960 69 6e 28 29 20 68 61 73 20 61 6c 72 65 61 64 79  in() has already
11970 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72   been called for
11980 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
11990 65 6d 65 6e 74 20 0a 2a 2a 20 70 61 73 73 65 64  ement .** passed
119a0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
119b0 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 69  rgument when thi
119c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
119d0 76 6f 6b 65 64 2e 20 49 74 20 67 65 6e 65 72 61  voked. It genera
119e0 74 65 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 70  tes.** code to p
119f0 6f 70 75 6c 61 74 65 20 74 68 65 20 57 69 6e 64  opulate the Wind
11a00 6f 77 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67  ow.regResult reg
11a10 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
11a20 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61  indow function a
11a30 6e 64 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  nd.** invoke the
11a40 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20   sub-routine at 
11a50 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
11a60 47 6f 73 75 62 20 6f 6e 63 65 20 66 6f 72 20 65  Gosub once for e
11a70 61 63 68 20 72 6f 77 2e 0a 2a 2a 20 54 68 69 73  ach row..** This
11a80 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
11a90 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
11aa0 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
11ab0 6e 67 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ng. .*/.void sql
11ac0 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
11ad0 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
11ae0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
11af0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
11b00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
11b10 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
11b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11b30 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20  ewritten SELECT 
11b40 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57  statement */.  W
11b50 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
11b60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11b70 2a 20 43 6f 6e 74 65 78 74 20 72 65 74 75 72 6e  * Context return
11b80 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
11b90 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  reBegin() */.  i
11ba0 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20  nt regGosub,    
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11bc0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 4f  * Register for O
11bd0 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74  P_Gosub */.  int
11be0 20 61 64 64 72 47 6f 73 75 62 20 20 20 20 20 20   addrGosub      
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c00 4f 50 5f 47 6f 73 75 62 20 68 65 72 65 20 74 6f  OP_Gosub here to
11c10 20 72 65 74 75 72 6e 20 65 61 63 68 20 72 6f 77   return each row
11c20 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20   */.){.  Window 
11c30 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
11c40 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 61 72  ;..  /* There ar
11c50 65 20 74 68 72 65 65 20 64 69 66 66 65 72 65 6e  e three differen
11c60 74 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  t functions that
11c70 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
11c80 64 6f 20 74 68 65 20 77 6f 72 6b 0a 20 20 2a 2a  do the work.  **
11c90 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 64 65   of this one, de
11ca0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 77  pending on the w
11cb0 69 6e 64 6f 77 20 66 72 61 6d 65 20 61 6e 64 20  indow frame and 
11cc0 74 68 65 20 73 70 65 63 69 66 69 63 20 62 75 69  the specific bui
11cd0 6c 74 2d 69 6e 0a 20 20 2a 2a 20 77 69 6e 64 6f  lt-in.  ** windo
11ce0 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  w functions used
11cf0 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 2a 2a 0a   (if any)..  **.
11d00 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65 52    ** windowCodeR
11d10 6f 77 45 78 70 72 53 74 65 70 28 29 20 68 61 6e  owExprStep() han
11d20 64 6c 65 73 20 61 6c 6c 20 22 52 4f 57 53 22 20  dles all "ROWS" 
11d30 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20 65  window frames, e
11d40 78 63 65 70 74 20 66 6f 72 3a 0a 20 20 2a 2a 0a  xcept for:.  **.
11d50 20 20 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57    **   ROWS BETW
11d60 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
11d70 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
11d80 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a  ENT ROW.  **.  *
11d90 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  * The exception 
11da0 69 73 20 62 65 63 61 75 73 65 20 77 69 6e 64 6f  is because windo
11db0 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70  wCodeRowExprStep
11dc0 28 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6c  () implements al
11dd0 6c 20 77 69 6e 64 6f 77 0a 20 20 2a 2a 20 66 72  l window.  ** fr
11de0 61 6d 65 20 74 79 70 65 73 20 62 79 20 63 61 63  ame types by cac
11df0 68 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20  hing the entire 
11e00 70 61 72 74 69 74 69 6f 6e 20 69 6e 20 61 20 74  partition in a t
11e10 65 6d 70 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20  emp table, and. 
11e20 20 2a 2a 20 22 52 4f 57 53 20 42 45 54 57 45 45   ** "ROWS BETWEE
11e30 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
11e40 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
11e50 54 20 52 4f 57 22 20 69 73 20 65 61 73 79 20 65  T ROW" is easy e
11e60 6e 6f 75 67 68 20 74 6f 0a 20 20 2a 2a 20 69 6d  nough to.  ** im
11e70 70 6c 65 6d 65 6e 74 20 77 69 74 68 6f 75 74 20  plement without 
11e80 73 75 63 68 20 61 20 63 61 63 68 65 2e 0a 20 20  such a cache..  
11e90 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f  **.  ** windowCo
11ea0 64 65 43 61 63 68 65 53 74 65 70 28 29 20 69 73  deCacheStep() is
11eb0 20 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a   used for:.  **.
11ec0 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54    **   RANGE BET
11ed0 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
11ee0 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
11ef0 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20  OLLOWING.  **.  
11f00 2a 2a 20 49 74 20 69 73 20 61 6c 73 6f 20 75 73  ** It is also us
11f10 65 64 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 20  ed for anything 
11f20 6e 6f 74 20 68 61 6e 64 6c 65 64 20 62 79 20 77  not handled by w
11f30 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72  indowCodeRowExpr
11f40 53 74 65 70 28 29 20 0a 20 20 2a 2a 20 74 68 61  Step() .  ** tha
11f50 74 20 69 6e 76 6f 6b 65 73 20 61 20 62 75 69 6c  t invokes a buil
11f60 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
11f70 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72  tion that requir
11f80 65 73 20 74 68 65 20 65 6e 74 69 72 65 20 0a 20  es the entire . 
11f90 20 2a 2a 20 70 61 72 74 69 74 69 6f 6e 20 74 6f   ** partition to
11fa0 20 62 65 20 63 61 63 68 65 64 20 69 6e 20 61 20   be cached in a 
11fb0 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72  temp table befor
11fc0 65 20 61 6e 79 20 72 6f 77 73 20 61 72 65 20 72  e any rows are r
11fd0 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 28 65 2e  eturned.  ** (e.
11fe0 67 2e 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 6f  g. nth_value() o
11ff0 72 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28 29  r percent_rank()
12000 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 6e  )..  **.  ** Fin
12010 61 6c 6c 79 2c 20 61 73 73 75 6d 69 6e 67 20 74  ally, assuming t
12020 68 65 72 65 20 69 73 20 6e 6f 20 62 75 69 6c 74  here is no built
12030 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
12040 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65  ion that require
12050 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 74 69  s.  ** the parti
12060 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 63 68 65  tion to be cache
12070 64 2c 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  d, windowCodeDef
12080 61 75 6c 74 53 74 65 70 28 29 20 69 73 20 75 73  aultStep() is us
12090 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a  ed for:.  **.  *
120a0 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45  *   RANGE BETWEE
120b0 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
120c0 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
120d0 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52 41  T ROW .  **   RA
120e0 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
120f0 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
12100 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
12110 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 52  LLOWING.  **   R
12120 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52  ANGE BETWEEN CUR
12130 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52  RENT ROW AND CUR
12140 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20  RENT ROW .  **  
12150 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
12160 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
12170 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
12180 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64  W.  **.  ** wind
12190 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
121a0 70 28 29 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  p() is the only 
121b0 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 65  one of the three
121c0 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a   functions that.
121d0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 61    ** does not ca
121e0 63 68 65 20 65 61 63 68 20 70 61 72 74 69 74 69  che each partiti
121f0 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62  on in a temp tab
12200 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e  le before beginn
12210 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 72 65 74 75  ing to.  ** retu
12220 72 6e 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  rn rows..  */.  
12230 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  if( pMWin->eType
12240 3d 3d 54 4b 5f 52 4f 57 53 20 0a 20 20 20 26 26  ==TK_ROWS .   &&
12250 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21   (pMWin->eStart!
12260 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c 7c 70  =TK_UNBOUNDED||p
12270 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43  MWin->eEnd!=TK_C
12280 55 52 52 45 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e  URRENT||!pMWin->
12290 70 4f 72 64 65 72 42 79 29 0a 20 20 29 7b 0a 20  pOrderBy).  ){. 
122a0 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
122b0 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56  ment((pParse->pV
122c0 64 62 65 2c 20 22 42 65 67 69 6e 20 52 6f 77 45  dbe, "Begin RowE
122d0 78 70 72 53 74 65 70 28 29 22 29 29 3b 0a 20 20  xprStep()"));.  
122e0 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45    windowCodeRowE
122f0 78 70 72 53 74 65 70 28 70 50 61 72 73 65 2c 20  xprStep(pParse, 
12300 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f  p, pWInfo, regGo
12310 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
12320 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 57 69  .  }else{.    Wi
12330 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20  ndow *pWin;.    
12340 69 6e 74 20 62 43 61 63 68 65 20 3d 20 30 3b 20  int bCache = 0; 
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12360 20 54 72 75 65 20 74 6f 20 75 73 65 20 43 61 63   True to use Cac
12370 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a 20 20 20  heStep() */..   
12380 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
12390 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
123a0 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
123b0 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
123c0 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b       bCache = 1;
123d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
123e0 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
123f0 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
12400 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
12410 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
12420 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
12430 6e 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  nc;.        if( 
12440 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  (pFunc->funcFlag
12450 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
12460 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a 20 20 20  WINDOW_SIZE).   
12470 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d        || (pFunc-
12480 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
12490 65 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  eName).         
124a0 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  || (pFunc->zName
124b0 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  ==first_valueNam
124c0 65 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  e).         || (
124d0 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  pFunc->zName==le
124e0 61 64 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  adName).        
124f0 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
12500 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20 20  e==lagName).    
12510 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
12520 20 62 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20   bCache = 1;.   
12530 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12550 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74      }..    /* Ot
12560 68 65 72 77 69 73 65 2c 20 63 61 6c 6c 20 77 69  herwise, call wi
12570 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53  ndowCodeDefaultS
12580 74 65 70 28 29 2e 20 20 2a 2f 0a 20 20 20 20 69  tep().  */.    i
12590 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20 20  f( bCache ){.   
125a0 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
125b0 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56  ment((pParse->pV
125c0 64 62 65 2c 20 22 42 65 67 69 6e 20 43 61 63 68  dbe, "Begin Cach
125d0 65 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20  eStep()"));.    
125e0 20 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68    windowCodeCach
125f0 65 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c  eStep(pParse, p,
12600 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75   pWInfo, regGosu
12610 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
12620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12630 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
12640 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t((pParse->pVdbe
12650 2c 20 22 42 65 67 69 6e 20 44 65 66 61 75 6c 74  , "Begin Default
12660 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20 20  Step()"));.     
12670 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75   windowCodeDefau
12680 6c 74 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ltStep(pParse, p
12690 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73  , pWInfo, regGos
126a0 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
126b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
126c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
126d0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
126e0 0a                                               .