/ Hex Artifact Content
Login

Artifact d722f9b0cb3f12ee3fab8cc2d05407078d99346969e9c7e2030da21d0588675f:


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 73 74 61 74 69 63  ncs));.}..static
3f90: 20 57 69 6e 64 6f 77 20 2a 77 69 6e 64 6f 77 46   Window *windowF
3fa0: 69 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73  ind(Parse *pPars
3fb0: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74  e, Window *pList
3fc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
3fd0: 61 6d 65 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ame){.  Window *
3fe0: 70 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  p;.  for(p=pList
3ff0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 57  ; p; p=p->pNextW
4000: 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  in){.    if( sql
4010: 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 7a  ite3StrICmp(p->z
4020: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
4030: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
4040: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
4050: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4060: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
4070: 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 7a 4e 61  window: %s", zNa
4080: 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
4090: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n p;.}../*.** Th
40a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
40b0: 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  alled immediatel
40c0: 79 20 61 66 74 65 72 20 72 65 73 6f 6c 76 69 6e  y after resolvin
40d0: 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  g the function n
40e0: 61 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77 69 6e  ame.** for a win
40f0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  dow function wit
4100: 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  hin a SELECT sta
4110: 74 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65 6e 74  tement. Argument
4120: 20 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a 20 6c   pList is a.** l
4130: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 57 49  inked list of WI
4140: 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 73  NDOW definitions
4150: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
4160: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4170: 74 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  t..** Argument p
4180: 46 75 6e 63 20 69 73 20 74 68 65 20 66 75 6e 63  Func is the func
4190: 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20  tion definition 
41a0: 6a 75 73 74 20 72 65 73 6f 6c 76 65 64 20 61 6e  just resolved an
41b0: 64 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74 68 65  d pWin.** is the
41c0: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 72   Window object r
41d0: 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
41e0: 61 73 73 6f 63 69 61 74 65 64 20 4f 56 45 52 20  associated OVER 
41f0: 63 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a 2a 20  clause. This.** 
4200: 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
4210: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4220: 20 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f 77 73   pWin as follows
4230: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
4240: 68 65 20 4f 56 45 52 20 63 6c 61 75 73 65 20 72  he OVER clause r
4250: 65 66 65 72 65 64 20 74 6f 20 61 20 6e 61 6d 65  efered to a name
4260: 64 20 77 69 6e 64 6f 77 20 28 61 73 20 69 6e 20  d window (as in 
4270: 22 6d 61 78 28 78 29 20 4f 56 45 52 20 77 69 6e  "max(x) OVER win
4280: 22 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61 72 63  "),.**     searc
4290: 68 20 6c 69 73 74 20 70 4c 69 73 74 20 66 6f 72  h list pList for
42a0: 20 61 20 6d 61 74 63 68 69 6e 67 20 57 49 4e 44   a matching WIND
42b0: 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 61  OW definition, a
42c0: 6e 64 20 75 70 64 61 74 65 20 70 57 69 6e 0a 2a  nd update pWin.*
42d0: 2a 20 20 20 20 20 61 63 63 6f 72 64 69 6e 67 6c  *     accordingl
42e0: 79 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 57 49  y. If no such WI
42f0: 4e 44 4f 57 20 63 6c 61 75 73 65 20 63 61 6e 20  NDOW clause can 
4300: 62 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76 65 20  be found, leave 
4310: 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20 20 20  an error.**     
4320: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  in pParse..**.**
4330: 20 20 20 2a 20 49 66 20 74 68 65 20 66 75 6e 63     * If the func
4340: 74 69 6f 6e 20 69 73 20 61 20 62 75 69 6c 74 2d  tion is a built-
4350: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
4360: 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73  on that requires
4370: 20 74 68 65 0a 2a 2a 20 20 20 20 20 77 69 6e 64   the.**     wind
4380: 6f 77 20 74 6f 20 62 65 20 63 6f 65 72 63 65 64  ow to be coerced
4390: 20 28 73 65 65 20 22 42 55 49 4c 54 2d 49 4e 20   (see "BUILT-IN 
43a0: 57 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f 4e 53  WINDOW FUNCTIONS
43b0: 22 20 61 74 20 74 68 65 20 74 6f 70 0a 2a 2a 20  " at the top.** 
43c0: 20 20 20 20 6f 66 20 74 68 69 73 20 66 69 6c 65      of this file
43d0: 29 2c 20 70 57 69 6e 20 69 73 20 75 70 64 61 74  ), pWin is updat
43e0: 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ed here..*/.void
43f0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70   sqlite3WindowUp
4400: 64 61 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  date(.  Parse *p
4410: 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f 77  Parse, .  Window
4420: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
4430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
4440: 74 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e 64 6f  t of named windo
4450: 77 73 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45  ws for this SELE
4460: 43 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77 20 2a  CT */.  Window *
4470: 70 57 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  pWin,           
4480: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f          /* Windo
4490: 77 20 66 72 61 6d 65 20 74 6f 20 75 70 64 61 74  w frame to updat
44a0: 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a  e */.  FuncDef *
44b0: 70 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20  pFunc           
44c0: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77         /* Window
44d0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69   function defini
44e0: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tion */.){.  if(
44f0: 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26 26 20   pWin->zName && 
4500: 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 30 20 29  pWin->eType==0 )
4510: 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 20  {.    Window *p 
4520: 3d 20 77 69 6e 64 6f 77 46 69 6e 64 28 70 50 61  = windowFind(pPa
4530: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 57 69 6e  rse, pList, pWin
4540: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
4550: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
4560: 0a 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74  .    pWin->pPart
4570: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
4580: 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
4590: 65 2d 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69  e->db, p->pParti
45a0: 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57  tion, 0);.    pW
45b0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73  in->pOrderBy = s
45c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
45d0: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  p(pParse->db, p-
45e0: 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  >pOrderBy, 0);. 
45f0: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4600: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
4610: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
4620: 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20  pStart, 0);.    
4630: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
4640: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
4650: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c  se->db, p->pEnd,
4660: 20 30 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65   0);.    pWin->e
4670: 53 74 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72  Start = p->eStar
4680: 74 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e  t;.    pWin->eEn
4690: 64 20 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20  d = p->eEnd;.   
46a0: 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70   pWin->eType = p
46b0: 2d 3e 65 54 79 70 65 3b 0a 20 20 7d 65 6c 73 65  ->eType;.  }else
46c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e  {.    sqlite3Win
46d0: 64 6f 77 43 68 61 69 6e 28 70 50 61 72 73 65 2c  dowChain(pParse,
46e0: 20 70 57 69 6e 2c 20 70 4c 69 73 74 29 3b 0a 20   pWin, pList);. 
46f0: 20 7d 0a 20 20 69 66 28 20 70 46 75 6e 63 2d 3e   }.  if( pFunc->
4700: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
4710: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 20 29  TE_FUNC_WINDOW )
4720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
4730: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
4740: 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 46      if( pWin->pF
4750: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 73  ilter ){.      s
4760: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4770: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
4780: 20 20 22 46 49 4c 54 45 52 20 63 6c 61 75 73 65    "FILTER clause
4790: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
47a0: 64 20 77 69 74 68 20 61 67 67 72 65 67 61 74 65  d with aggregate
47b0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
47c0: 73 22 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  s".      );.    
47d0: 7d 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 46  }else.    if( pF
47e0: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 6f 77 5f  unc->zName==row_
47f0: 6e 75 6d 62 65 72 4e 61 6d 65 20 7c 7c 20 70 46  numberName || pF
4800: 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 69 6c  unc->zName==ntil
4810: 65 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73  eName ){.      s
4820: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4830: 28 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72  (db, pWin->pStar
4840: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4850: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
4860: 70 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  pWin->pEnd);.   
4870: 20 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20     pWin->pStart 
4880: 3d 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30  = pWin->pEnd = 0
4890: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54  ;.      pWin->eT
48a0: 79 70 65 20 3d 20 54 4b 5f 52 4f 57 53 3b 0a 20  ype = TK_ROWS;. 
48b0: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
48c0: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
48d0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
48e0: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
48f0: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
4900: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
4910: 3d 3d 64 65 6e 73 65 5f 72 61 6e 6b 4e 61 6d 65  ==dense_rankName
4920: 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65   || pFunc->zName
4930: 3d 3d 72 61 6e 6b 4e 61 6d 65 0a 20 20 20 20 20  ==rankName.     
4940: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
4950: 3d 70 65 72 63 65 6e 74 5f 72 61 6e 6b 4e 61 6d  =percent_rankNam
4960: 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d  e || pFunc->zNam
4970: 65 3d 3d 63 75 6d 65 5f 64 69 73 74 4e 61 6d 65  e==cume_distName
4980: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
4990: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
49a0: 64 62 2c 20 70 57 69 6e 2d 3e 70 53 74 61 72 74  db, pWin->pStart
49b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
49c0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
49d0: 57 69 6e 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20  Win->pEnd);.    
49e0: 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d    pWin->pStart =
49f0: 20 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 30 3b   pWin->pEnd = 0;
4a00: 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 54 79  .      pWin->eTy
4a10: 70 65 20 3d 20 54 4b 5f 52 41 4e 47 45 3b 0a 20  pe = TK_RANGE;. 
4a20: 20 20 20 20 20 70 57 69 6e 2d 3e 65 53 74 61 72       pWin->eStar
4a30: 74 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  t = TK_UNBOUNDED
4a40: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 65 45  ;.      pWin->eE
4a50: 6e 64 20 3d 20 54 4b 5f 43 55 52 52 45 4e 54 3b  nd = TK_CURRENT;
4a60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 69  .    }.  }.  pWi
4a70: 6e 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  n->pFunc = pFunc
4a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
4a90: 78 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  xt object passed
4aa0: 20 74 68 72 6f 75 67 68 20 73 71 6c 69 74 65 33   through sqlite3
4ab0: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 29 20 74  WalkExprList() t
4ac0: 6f 0a 2a 2a 20 73 65 6c 65 63 74 57 69 6e 64 6f  o.** selectWindo
4ad0: 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28 29  wRewriteExprCb()
4ae0: 20 62 79 20 73 65 6c 65 63 74 57 69 6e 64 6f 77   by selectWindow
4af0: 52 65 77 72 69 74 65 45 4c 69 73 74 28 29 2e 0a  RewriteEList()..
4b00: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
4b10: 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20  t WindowRewrite 
4b20: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 3b 0a 73  WindowRewrite;.s
4b30: 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72  truct WindowRewr
4b40: 69 74 65 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ite {.  Window *
4b50: 70 57 69 6e 3b 0a 20 20 53 72 63 4c 69 73 74 20  pWin;.  SrcList 
4b60: 2a 70 53 72 63 3b 0a 20 20 45 78 70 72 4c 69 73  *pSrc;.  ExprLis
4b70: 74 20 2a 70 53 75 62 3b 0a 20 20 53 65 6c 65 63  t *pSub;.  Selec
4b80: 74 20 2a 70 53 75 62 53 65 6c 65 63 74 3b 20 20  t *pSubSelect;  
4b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4ba0: 72 72 65 6e 74 20 73 75 62 2d 73 65 6c 65 63 74  rrent sub-select
4bb0: 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 7d 3b 0a 0a  , if any */.};..
4bc0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66  /*.** Callback f
4bd0: 75 6e 63 74 69 6f 6e 20 75 73 65 64 20 62 79 20  unction used by 
4be0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
4bf0: 69 74 65 45 4c 69 73 74 28 29 2e 20 49 66 20 6e  iteEList(). If n
4c00: 65 63 65 73 73 61 72 79 2c 0a 2a 2a 20 74 68 69  ecessary,.** thi
4c10: 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  s function appen
4c20: 64 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ds to the output
4c30: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
4c40: 20 61 6e 64 20 75 70 64 61 74 65 73 20 0a 2a 2a   and updates .**
4c50: 20 65 78 70 72 65 73 73 69 6f 6e 20 28 2a 70 70   expression (*pp
4c60: 45 78 70 72 29 20 69 6e 20 70 6c 61 63 65 2e 0a  Expr) in place..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
4c80: 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
4c90: 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
4ca0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
4cb0: 45 78 70 72 29 7b 0a 20 20 73 74 72 75 63 74 20  Expr){.  struct 
4cc0: 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 2a 70  WindowRewrite *p
4cd0: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52   = pWalker->u.pR
4ce0: 65 77 72 69 74 65 3b 0a 20 20 50 61 72 73 65 20  ewrite;.  Parse 
4cf0: 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
4d00: 72 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a  r->pParse;..  /*
4d10: 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
4d20: 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
4d30: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  d from within a 
4d40: 73 63 61 6c 61 72 20 73 75 62 2d 73 65 6c 65 63  scalar sub-selec
4d50: 74 0a 20 20 2a 2a 20 74 68 61 74 20 75 73 65 64  t.  ** that used
4d60: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
4d70: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
4d80: 72 6f 63 65 73 73 65 64 2c 20 6f 6e 6c 79 20 70  rocessed, only p
4d90: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 54 4b 5f 43  rocess.  ** TK_C
4da0: 4f 4c 55 4d 4e 20 65 78 70 72 65 73 73 69 6f 6e  OLUMN expression
4db0: 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
4dc0: 69 74 20 28 74 68 65 20 6f 75 74 65 72 20 53 45  it (the outer SE
4dd0: 4c 45 43 54 29 2e 20 44 6f 0a 20 20 2a 2a 20 6e  LECT). Do.  ** n
4de0: 6f 74 20 70 72 6f 63 65 73 73 20 61 67 67 72 65  ot process aggre
4df0: 67 61 74 65 73 20 6f 72 20 77 69 6e 64 6f 77 20  gates or window 
4e00: 66 75 6e 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  functions at all
4e10: 2c 20 61 73 20 74 68 65 79 20 62 65 6c 6f 6e 67  , as they belong
4e20: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 63 61  .  ** to the sca
4e30: 6c 61 72 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  lar sub-select. 
4e40: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 75   */.  if( p->pSu
4e50: 62 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 69  bSelect ){.    i
4e60: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
4e70: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
4e80: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
4e90: 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  inue;.    }else{
4ea0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 72 63 20  .      int nSrc 
4eb0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  = p->pSrc->nSrc;
4ec0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
4ed0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
4ee0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
4ef0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
4f00: 61 62 6c 65 3d 3d 70 2d 3e 70 53 72 63 2d 3e 61  able==p->pSrc->a
4f10: 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 20 62 72  [i].iCursor ) br
4f20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4f30: 20 20 20 69 66 28 20 69 3d 3d 6e 53 72 63 20 29     if( i==nSrc )
4f40: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
4f50: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  inue;.    }.  }.
4f60: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
4f70: 2d 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63 61 73  ->op ){..    cas
4f80: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
4f90: 20 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61       if( !ExprHa
4fa0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
4fb0: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
4fc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4fd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4fe0: 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e      Window *pWin
4ff0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 57  ;.        for(pW
5000: 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70 57 69 6e  in=p->pWin; pWin
5010: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
5020: 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20  xtWin){.        
5030: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79 2e 70    if( pExpr->y.p
5040: 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20 20  Win==pWin ){.   
5050: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
5060: 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d 70   pWin->pOwner==p
5070: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
5080: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
5090: 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rune;.          
50a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
50b0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
50c0: 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a  l through.  */..
50d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
50e0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
50f0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
5100: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
5110: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
5120: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  p(pParse->db, pE
5130: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  xpr, 0);.      p
5140: 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  ->pSub = sqlite3
5150: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
5160: 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62 2c 20  Parse, p->pSub, 
5170: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
5180: 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20 20 20   p->pSub ){.    
5190: 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72      assert( Expr
51a0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
51b0: 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d 3d 30  r, EP_Static)==0
51c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72   );.        Expr
51d0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
51e0: 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20  r, EP_Static);. 
51f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
5200: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
5210: 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  >db, pExpr);.   
5220: 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50 72       ExprClearPr
5230: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5240: 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20  _Static);.      
5250: 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72 2c 20    memset(pExpr, 
5260: 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29  0, sizeof(Expr))
5270: 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ;..        pExpr
5280: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
5290: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
52a0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53  >iColumn = p->pS
52b0: 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20 20  ub->nExpr-1;.   
52c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
52d0: 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69 45  le = p->pWin->iE
52e0: 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d 0a 0a  phCsr;.      }..
52f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5300: 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   }..    default:
5310: 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20   /* no-op */.   
5320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
5330: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
5340: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 69  inue;.}.static i
5350: 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52  nt selectWindowR
5360: 65 77 72 69 74 65 53 65 6c 65 63 74 43 62 28 57  ewriteSelectCb(W
5370: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
5380: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
5390: 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e 64 6f  {.  struct Windo
53a0: 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20 70 57  wRewrite *p = pW
53b0: 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72 69 74  alker->u.pRewrit
53c0: 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 61  e;.  Select *pSa
53d0: 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65 6c 65  ve = p->pSubSele
53e0: 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76 65 3d  ct;.  if( pSave=
53f0: 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  =pSelect ){.    
5400: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
5410: 6e 75 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nue;.  }else{.  
5420: 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20    p->pSubSelect 
5430: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 73  = pSelect;.    s
5440: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
5450: 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65 63  (pWalker, pSelec
5460: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75 62 53  t);.    p->pSubS
5470: 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b 0a 20  elect = pSave;. 
5480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
5490: 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  Prune;.}.../*.**
54a0: 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
54b0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
54c0: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c   in expression-l
54d0: 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f 72 20  ist pEList. For 
54e0: 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  each:.**.**   * 
54f0: 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20 20  TK_COLUMN,.**   
5500: 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  * aggregate func
5510: 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  tion, or.**   * 
5520: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
5530: 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20 6f 62  with a Window ob
5540: 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e 6f 74  ject that is not
5550: 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68 65   a member of the
5560: 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f 77 20   .**     Window 
5570: 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
5580: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
5590: 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a 2a 2a  nt (pWin)..**.**
55a0: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65   Append the node
55b0: 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70 72 65   to output expre
55c0: 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70 70 53  ssion-list (*ppS
55d0: 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61 63 65  ub). And replace
55e0: 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20 54 4b   it.** with a TK
55f0: 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 61  _COLUMN that rea
5600: 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68 20 65  ds the (N-1)th e
5610: 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c 65 20  lement of table 
5620: 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68 43 73  .** pWin->iEphCs
5630: 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  r, where N is th
5640: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
5650: 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75 62 29  ents in (*ppSub)
5660: 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65 6e 64   after.** append
5670: 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e  ing the new one.
5680: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5690: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
56a0: 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72 73  iteEList(.  Pars
56b0: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69  e *pParse, .  Wi
56c0: 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 53 72  ndow *pWin,.  Sr
56d0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20 20 45  cList *pSrc,.  E
56e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5700: 2a 20 52 65 77 72 69 74 65 20 65 78 70 72 65 73  * Rewrite expres
5710: 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c 69  sions in this li
5720: 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  st */.  ExprList
5730: 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20 20   **ppSub        
5740: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
5750: 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65 78  T: Sub-select ex
5760: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f  pression-list */
5770: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  .){.  Walker sWa
5780: 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65  lker;.  WindowRe
5790: 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b 0a  write sRewrite;.
57a0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
57b0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61  er, 0, sizeof(Wa
57c0: 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74  lker));.  memset
57d0: 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73  (&sRewrite, 0, s
57e0: 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72  izeof(WindowRewr
57f0: 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69  ite));..  sRewri
5800: 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62  te.pSub = *ppSub
5810: 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57 69  ;.  sRewrite.pWi
5820: 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52 65 77  n = pWin;.  sRew
5830: 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53 72 63  rite.pSrc = pSrc
5840: 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61  ;..  sWalker.pPa
5850: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
5860: 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c  sWalker.xExprCal
5870: 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69  lback = selectWi
5880: 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72 43  ndowRewriteExprC
5890: 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53 65  b;.  sWalker.xSe
58a0: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
58b0: 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
58c0: 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73 57  teSelectCb;.  sW
58d0: 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74 65  alker.u.pRewrite
58e0: 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a 20   = &sRewrite;.. 
58f0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61   (void)sqlite3Wa
5900: 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61 6c  lkExprList(&sWal
5910: 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a 20  ker, pEList);.. 
5920: 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72 69   *ppSub = sRewri
5930: 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  te.pSub;.}../*.*
5940: 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70 79 20  * Append a copy 
5950: 6f 66 20 65 61 63 68 20 65 78 70 72 65 73 73 69  of each expressi
5960: 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  on in expression
5970: 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20 74 6f  -list pAppend to
5980: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
5990: 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74 75 72  ist pList. Retur
59a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
59b0: 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  he result list..
59c0: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 4c 69  */.static ExprLi
59d0: 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70 70 65  st *exprListAppe
59e0: 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  ndList(.  Parse 
59f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5a00: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
5a10: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
5a20: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  st *pList,      
5a30: 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68 69    /* List to whi
5a40: 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69  ch to append. Mi
5a50: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
5a60: 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70 70 65   ExprList *pAppe
5a70: 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  nd       /* List
5a80: 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61 70   of values to ap
5a90: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
5aa0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
5ab0: 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20 69  pAppend ){.    i
5ac0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 49  nt i;.    int nI
5ad0: 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  nit = pList ? pL
5ae0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
5af0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5b00: 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b 20 69  Append->nExpr; i
5b10: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
5b20: 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45  *pDup = sqlite3E
5b30: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5b40: 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69 5d  b, pAppend->a[i]
5b50: 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
5b60: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5b70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5b80: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70  pParse, pList, p
5b90: 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Dup);.      if( 
5ba0: 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e 61  pList ) pList->a
5bb0: 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f 72  [nInit+i].sortOr
5bc0: 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e 61  der = pAppend->a
5bd0: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
5be0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5bf0: 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
5c00: 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20  * If the SELECT 
5c10: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
5c20: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
5c30: 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  rgument does not
5c40: 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20 53   invoke.** any S
5c50: 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  QL window functi
5c60: 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ons, this functi
5c70: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  on is a no-op. O
5c80: 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a 2a  therwise, it .**
5c90: 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53 45   rewrites the SE
5ca0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 73  LECT statement s
5cb0: 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66 75  o that window fu
5cc0: 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75 6e  nction xStep fun
5cd0: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69 6e  ctions.** are in
5ce0: 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f 72  voked in the cor
5cf0: 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64 65  rect order as de
5d00: 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22 53  scribed under "S
5d10: 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47 22  ELECT REWRITING"
5d20: 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20 6f  .** at the top o
5d30: 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f 0a  f this file..*/.
5d40: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  int sqlite3Windo
5d50: 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20 2a  wRewrite(Parse *
5d60: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
5d70: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
5d80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
5d90: 70 2d 3e 70 57 69 6e 20 26 26 20 70 2d 3e 70 50  p->pWin && p->pP
5da0: 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 56  rior==0 ){.    V
5db0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
5dc0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
5dd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
5de0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5df0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
5e00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5e10: 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
5e20: 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20   */.    SrcList 
5e30: 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
5e40: 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72  .    Expr *pWher
5e50: 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
5e60: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72     ExprList *pGr
5e70: 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
5e80: 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  pBy;.    Expr *p
5e90: 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
5ea0: 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  ing;.    ExprLis
5eb0: 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a 20  t *pSort = 0;.. 
5ec0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75     ExprList *pSu
5ed0: 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  blist = 0;      
5ee0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c   /* Expression l
5ef0: 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65 72  ist for sub-quer
5f00: 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20  y */.    Window 
5f10: 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
5f20: 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72  ;      /* Master
5f30: 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 2a   window object *
5f40: 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57  /.    Window *pW
5f50: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
5f60: 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f 62      /* Window ob
5f70: 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f  ject iterator */
5f80: 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ..    p->pSrc = 
5f90: 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  0;.    p->pWhere
5fa0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72   = 0;.    p->pGr
5fb0: 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  oupBy = 0;.    p
5fc0: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 0a  ->pHaving = 0;..
5fd0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
5fe0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
5ff0: 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d 73 65  e for the sub-se
6000: 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 74 68  lect. This is th
6010: 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a  e concatenation.
6020: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 77 69      ** of the wi
6030: 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e 20 61  ndow PARTITION a
6040: 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  nd ORDER BY clau
6050: 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20 74 68  ses. Then, if th
6060: 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20 20 20  is makes it.    
6070: 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20 72 65  ** redundant, re
6080: 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20 42  move the ORDER B
6090: 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  Y from the paren
60a0: 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a 20 20  t SELECT.  */.  
60b0: 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69 74 65    pSort = sqlite
60c0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
60d0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
60e0: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53 6f 72  on, 0);.    pSor
60f0: 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
6100: 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
6110: 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72  Sort, pMWin->pOr
6120: 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
6130: 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f 72 64  pSort && p->pOrd
6140: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
6150: 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
6160: 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 2c 20  tCompare(pSort, 
6170: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  p->pOrderBy, -1)
6180: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
6190: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
61a0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
61b0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 70  erBy);.        p
61c0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
61d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
61e0: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 63     /* Assign a c
61f0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
6200: 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
6210: 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75 66  able used to buf
6220: 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a  fer rows..    **
6230: 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   The OpenEphemer
6240: 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  al instruction i
6250: 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20 61  s coded later, a
6260: 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e  fter it is known
6270: 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   how.    ** many
6280: 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61 62   columns the tab
6290: 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a  le will have.  *
62a0: 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70  /.    pMWin->iEp
62b0: 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  hCsr = pParse->n
62c0: 54 61 62 2b 2b 3b 0a 20 20 20 20 70 50 61 72 73  Tab++;.    pPars
62d0: 65 2d 3e 6e 54 61 62 20 2b 3d 20 33 3b 0a 0a 20  e->nTab += 3;.. 
62e0: 20 20 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52     selectWindowR
62f0: 65 77 72 69 74 65 45 4c 69 73 74 28 70 50 61 72  ewriteEList(pPar
6300: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53 72 63 2c  se, pMWin, pSrc,
6310: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 53 75   p->pEList, &pSu
6320: 62 6c 69 73 74 29 3b 0a 20 20 20 20 73 65 6c 65  blist);.    sele
6330: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
6340: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d 57  List(pParse, pMW
6350: 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 4f 72  in, pSrc, p->pOr
6360: 64 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74  derBy, &pSublist
6370: 29 3b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 6e 42  );.    pMWin->nB
6380: 75 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62  ufferCol = (pSub
6390: 6c 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d  list ? pSublist-
63a0: 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20  >nExpr : 0);..  
63b0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
63c0: 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e 64  PARTITION BY and
63d0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
63e0: 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 74 6f 20  sions to the to 
63f0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d  the .    ** sub-
6400: 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
6410: 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72 65  n list. They are
6420: 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 67   required to fig
6430: 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 0a 20  ure out where . 
6440: 20 20 20 2a 2a 20 62 6f 75 6e 64 61 72 69 65 73     ** boundaries
6450: 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20   for partitions 
6460: 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65 72  and sets of peer
6470: 20 72 6f 77 73 20 6c 69 65 2e 20 20 2a 2f 0a 20   rows lie.  */. 
6480: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65 78     pSublist = ex
6490: 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74  prListAppendList
64a0: 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69 73  (pParse, pSublis
64b0: 74 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69  t, pMWin->pParti
64c0: 74 69 6f 6e 29 3b 0a 20 20 20 20 70 53 75 62 6c  tion);.    pSubl
64d0: 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ist = exprListAp
64e0: 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
64f0: 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57 69 6e   pSublist, pMWin
6500: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20  ->pOrderBy);..  
6510: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
6520: 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
6530: 20 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20   to each window 
6540: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a  function to the.
6550: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
6560: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
6570: 74 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  t. Also allocate
6580: 20 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66   two registers f
6590: 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77  or each.    ** w
65a0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d  indow function -
65b0: 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63   one for the acc
65c0: 75 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65  umulator, anothe
65d0: 72 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20  r for interim.  
65e0: 20 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a    ** results.  *
65f0: 2f 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70  /.    for(pWin=p
6600: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
6610: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
6620: 7b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41  {.      pWin->iA
6630: 72 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73  rgCol = (pSublis
6640: 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45  t ? pSublist->nE
6650: 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  xpr : 0);.      
6660: 70 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c  pSublist = exprL
6670: 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50  istAppendList(pP
6680: 61 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20  arse, pSublist, 
6690: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
66a0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
66b0: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
66c0: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
66d0: 2a 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74  *pFilter = sqlit
66e0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 57  e3ExprDup(db, pW
66f0: 69 6e 2d 3e 70 46 69 6c 74 65 72 2c 20 30 29 3b  in->pFilter, 0);
6700: 0a 20 20 20 20 20 20 20 20 70 53 75 62 6c 69 73  .        pSublis
6710: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
6720: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
6730: 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 46 69 6c  , pSublist, pFil
6740: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
6750: 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63      pWin->regAcc
6760: 75 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  um = ++pParse->n
6770: 4d 65 6d 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  Mem;.      pWin-
6780: 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70  >regResult = ++p
6790: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
67a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
67b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
67c0: 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63   0, pWin->regAcc
67d0: 75 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  um);.    }..    
67e0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
67f0: 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 50 41  o ORDER BY or PA
6800: 52 54 49 54 49 4f 4e 20 42 59 20 63 6c 61 75 73  RTITION BY claus
6810: 65 2c 20 61 6e 64 20 74 68 65 20 77 69 6e 64 6f  e, and the windo
6820: 77 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  w.    ** functio
6830: 6e 20 61 63 63 65 70 74 73 20 7a 65 72 6f 20 61  n accepts zero a
6840: 72 67 75 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68  rguments, and th
6850: 65 72 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72  ere are no other
6860: 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 2a 2a 20   columns.    ** 
6870: 73 65 6c 65 63 74 65 64 20 28 65 2e 67 2e 20 22  selected (e.g. "
6880: 53 45 4c 45 43 54 20 72 6f 77 5f 6e 75 6d 62 65  SELECT row_numbe
6890: 72 28 29 20 4f 56 45 52 20 28 29 20 46 52 4f 4d  r() OVER () FROM
68a0: 20 74 31 22 29 2c 20 69 74 20 69 73 20 70 6f 73   t1"), it is pos
68b0: 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61  sible.    ** tha
68c0: 74 20 70 53 75 62 6c 69 73 74 20 69 73 20 73 74  t pSublist is st
68d0: 69 6c 6c 20 4e 55 4c 4c 20 68 65 72 65 2e 20 41  ill NULL here. A
68e0: 64 64 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  dd a constant ex
68f0: 70 72 65 73 73 69 6f 6e 20 68 65 72 65 20 74 6f  pression here to
6900: 20 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20 65 76   .    ** keep ev
6910: 65 72 79 74 68 69 6e 67 20 6c 65 67 61 6c 20 69  erything legal i
6920: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 0a 20 20  n this case. .  
6930: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
6940: 62 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  blist==0 ){.    
6950: 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71 6c    pSublist = sql
6960: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6970: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a 20  nd(pParse, 0, . 
6980: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6990: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
69a0: 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74  _INTEGER, &sqlit
69b0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20  e3IntTokens[0], 
69c0: 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
69d0: 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20 73 71  }..    pSub = sq
69e0: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
69f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
6a00: 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63 2c 20  pSublist, pSrc, 
6a10: 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79  pWhere, pGroupBy
6a20: 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f 72 74  , pHaving, pSort
6a30: 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
6a40: 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
6a50: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
6a60: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
6a70: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53  );.    if( p->pS
6a80: 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  rc ){.      p->p
6a90: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
6aa0: 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20 20  t = pSub;.      
6ab0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
6ac0: 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
6ad0: 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  se, p->pSrc);.  
6ae0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6af0: 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50  xpandSubquery(pP
6b00: 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d 3e  arse, &p->pSrc->
6b10: 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  a[0]) ){.       
6b20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6b30: 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
6b40: 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 73  .        pSub->s
6b50: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
6b60: 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 20 20  panded;.        
6b70: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
6b80: 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
6b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
6ba0: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
6bb0: 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSub, 0);.      
6bc0: 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
6bd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6be0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
6bf0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
6c00: 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 29  pSublist->nExpr)
6c10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
6c20: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6c30: 4f 70 65 6e 44 75 70 2c 20 70 4d 57 69 6e 2d 3e  OpenDup, pMWin->
6c40: 69 45 70 68 43 73 72 2b 31 2c 20 70 4d 57 69 6e  iEphCsr+1, pMWin
6c50: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20  ->iEphCsr);.    
6c60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6c70: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
6c80: 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  p, pMWin->iEphCs
6c90: 72 2b 32 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  r+2, pMWin->iEph
6ca0: 43 73 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Csr);.      sqli
6cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6cc0: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 4d 57   OP_OpenDup, pMW
6cd0: 69 6e 2d 3e 69 45 70 68 43 73 72 2b 33 2c 20 70  in->iEphCsr+3, p
6ce0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
6cf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6d00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
6d10: 6c 65 74 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  lete(db, pSub);.
6d20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
6d30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6d40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6d50: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  EM;.  }..  retur
6d60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
6d70: 72 65 65 20 74 68 65 20 57 69 6e 64 6f 77 20 6f  ree the Window o
6d80: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
6d90: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6da0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
6db0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
6dc0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
6dd0: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndow *p){.  if( 
6de0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6df0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
6e00: 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  ->pFilter);.    
6e10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6e20: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
6e30: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 73 71  rtition);.    sq
6e40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6e50: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
6e60: 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rBy);.    sqlite
6e70: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
6e80: 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20 20 73 71  p->pEnd);.    sq
6e90: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6ea0: 64 62 2c 20 70 2d 3e 70 53 74 61 72 74 29 3b 0a  db, p->pStart);.
6eb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6ec0: 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b  e(db, p->zName);
6ed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6ee0: 65 65 28 64 62 2c 20 70 2d 3e 7a 42 61 73 65 29  ee(db, p->zBase)
6ef0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
6f00: 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a  ree(db, p);.  }.
6f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
6f20: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
6f30: 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20   Window objects 
6f40: 73 74 61 72 74 69 6e 67 20 61 74 20 74 68 65 20  starting at the 
6f50: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
6f60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6f70: 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65  WindowListDelete
6f80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
6f90: 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68 69 6c  ndow *p){.  whil
6fa0: 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69 6e 64  e( p ){.    Wind
6fb0: 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ow *pNext = p->p
6fc0: 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73 71 6c  NextWin;.    sql
6fd0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
6fe0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d  (db, p);.    p =
6ff0: 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pNext;.  }.}../
7000: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
7010: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  t expression is 
7020: 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f 72 20  an PRECEDING or 
7030: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73 65 74  FOLLOWING offset
7040: 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  .  The.** value 
7050: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 6e 2d  should be a non-
7060: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
7070: 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75 65 20  .  If the value 
7080: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f 6e 73  is not a.** cons
7090: 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69 74 20  tant, change it 
70a0: 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20 66 61  to NULL.  The fa
70b0: 63 74 20 74 68 61 74 20 69 74 20 69 73 20 74 68  ct that it is th
70c0: 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  en a non-negativ
70d0: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77 69 6c  e.** integer wil
70e0: 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61 74 65  l be caught late
70f0: 72 2e 20 20 42 75 74 20 69 74 20 69 73 20 69 6d  r.  But it is im
7100: 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f 20 6c  portant not to l
7110: 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62 6c 65  eave.** variable
7120: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 65   values in the e
7130: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
7140: 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
7150: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f 66 66  sqlite3WindowOff
7160: 73 65 74 45 78 70 72 28 50 61 72 73 65 20 2a 70  setExpr(Parse *p
7170: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
7180: 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d 73 71  pr){.  if( 0==sq
7190: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
71a0: 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ant(pExpr) ){.  
71b0: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
71c0: 4f 42 4a 45 43 54 20 29 20 73 71 6c 69 74 65 33  OBJECT ) sqlite3
71d0: 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70 28  RenameExprUnmap(
71e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
71f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
7200: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7210: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 70 45  , pExpr);.    pE
7220: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7230: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
7240: 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  b, TK_NULL, 0, 0
7250: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7260: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
7270: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
7280: 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64 6f 77  urn a new Window
7290: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   object describi
72a0: 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65 66 69  ng a Window Defi
72b0: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f  nition..*/.Windo
72c0: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
72d0: 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65 20 2a  Alloc(.  Parse *
72e0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
72f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
7300: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
7310: 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 79       /* Frame ty
7320: 70 65 2e 20 54 4b 5f 52 41 4e 47 45 20 6f 72 20  pe. TK_RANGE or 
7330: 54 4b 5f 52 4f 57 53 20 2a 2f 0a 20 20 69 6e 74  TK_ROWS */.  int
7340: 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20 2f   eStart,       /
7350: 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43 55  * Start type: CU
7360: 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e 47  RRENT, PRECEDING
7370: 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42  , FOLLOWING, UNB
7380: 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70 72  OUNDED */.  Expr
7390: 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
73a0: 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73 69   Start window si
73b0: 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44 49  ze if TK_PRECEDI
73c0: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
73d0: 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 20  */.  int eEnd,  
73e0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 79         /* End ty
73f0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c  pe: CURRENT, FOL
7400: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
7410: 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47 20  NDED, PRECEDING 
7420: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64 20  */.  Expr *pEnd 
7430: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77 69         /* End wi
7440: 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f  ndow size if TK_
7450: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45  FOLLOWING or PRE
7460: 43 45 44 49 4e 47 20 2a 2f 0a 29 7b 0a 20 20 57  CEDING */.){.  W
7470: 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 30 3b  indow *pWin = 0;
7480: 0a 20 20 69 6e 74 20 62 49 6d 70 6c 69 63 69 74  .  int bImplicit
7490: 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Frame = 0;..  /*
74a0: 20 50 61 72 73 65 72 20 61 73 73 75 72 65 73 20   Parser assures 
74b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
74c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
74d0: 65 3d 3d 30 20 7c 7c 20 65 54 79 70 65 3d 3d 54  e==0 || eType==T
74e0: 4b 5f 52 41 4e 47 45 20 7c 7c 20 65 54 79 70 65  K_RANGE || eType
74f0: 3d 3d 54 4b 5f 52 4f 57 53 20 29 3b 0a 20 20 61  ==TK_ROWS );.  a
7500: 73 73 65 72 74 28 20 65 53 74 61 72 74 3d 3d 54  ssert( eStart==T
7510: 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 53 74  K_CURRENT || eSt
7520: 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art==TK_PRECEDIN
7530: 47 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  G.           || 
7540: 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55  eStart==TK_UNBOU
7550: 4e 44 45 44 20 7c 7c 20 65 53 74 61 72 74 3d 3d  NDED || eStart==
7560: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a  TK_FOLLOWING );.
7570: 20 20 61 73 73 65 72 74 28 20 65 45 6e 64 3d 3d    assert( eEnd==
7580: 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 65 45  TK_CURRENT || eE
7590: 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  nd==TK_FOLLOWING
75a0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
75b0: 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45  End==TK_UNBOUNDE
75c0: 44 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  D || eEnd==TK_PR
75d0: 45 43 45 44 49 4e 47 20 29 3b 0a 20 20 61 73 73  ECEDING );.  ass
75e0: 65 72 74 28 20 28 65 53 74 61 72 74 3d 3d 54 4b  ert( (eStart==TK
75f0: 5f 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 53  _PRECEDING || eS
7600: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
7610: 4e 47 29 3d 3d 28 70 53 74 61 72 74 21 3d 30 29  NG)==(pStart!=0)
7620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65   );.  assert( (e
7630: 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  End==TK_FOLLOWIN
7640: 47 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 50 52  G || eEnd==TK_PR
7650: 45 43 45 44 49 4e 47 29 3d 3d 28 70 45 6e 64 21  ECEDING)==(pEnd!
7660: 3d 30 29 20 29 3b 0a 0a 20 20 69 66 28 20 65 54  =0) );..  if( eT
7670: 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 49  ype==0 ){.    bI
7680: 6d 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 31  mplicitFrame = 1
7690: 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 54 4b  ;.    eType = TK
76a0: 5f 52 41 4e 47 45 3b 0a 20 20 7d 0a 0a 20 20 2f  _RANGE;.  }..  /
76b0: 2a 20 49 66 20 61 20 66 72 61 6d 65 20 69 73 20  * If a frame is 
76c0: 64 65 63 6c 61 72 65 64 20 22 52 41 4e 47 45 22  declared "RANGE"
76d0: 20 28 6e 6f 74 20 22 52 4f 57 53 22 29 2c 20 74   (not "ROWS"), t
76e0: 68 65 6e 20 69 74 20 6d 61 79 20 6e 6f 74 20 75  hen it may not u
76f0: 73 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 22  se.  ** either "
7700: 3c 65 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47  <expr> PRECEDING
7710: 22 20 6f 72 20 22 3c 65 78 70 72 3e 20 46 4f 4c  " or "<expr> FOL
7720: 4c 4f 57 49 4e 47 22 2e 0a 20 20 2a 2f 0a 20 20  LOWING"..  */.  
7730: 69 66 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41  if( eType==TK_RA
7740: 4e 47 45 20 26 26 20 28 70 53 74 61 72 74 21 3d  NGE && (pStart!=
7750: 30 20 7c 7c 20 70 45 6e 64 21 3d 30 29 20 29 7b  0 || pEnd!=0) ){
7760: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7770: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 52 41  rMsg(pParse, "RA
7780: 4e 47 45 20 6d 75 73 74 20 75 73 65 20 6f 6e 6c  NGE must use onl
7790: 79 20 55 4e 42 4f 55 4e 44 45 44 20 6f 72 20 43  y UNBOUNDED or C
77a0: 55 52 52 45 4e 54 20 52 4f 57 22 29 3b 0a 20 20  URRENT ROW");.  
77b0: 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c    goto windowAll
77c0: 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ocErr;.  }..  /*
77d0: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
77e0: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  he.  ** starting
77f0: 20 62 6f 75 6e 64 61 72 79 20 74 79 70 65 20 6d   boundary type m
7800: 61 79 20 6e 6f 74 20 6f 63 63 75 72 20 65 61 72  ay not occur ear
7810: 6c 69 65 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c  lier in the foll
7820: 6f 77 69 6e 67 20 6c 69 73 74 20 74 68 61 6e 0a  owing list than.
7830: 20 20 2a 2a 20 74 68 65 20 65 6e 64 69 6e 67 20    ** the ending 
7840: 62 6f 75 6e 64 61 72 79 20 74 79 70 65 3a 0a 20  boundary type:. 
7850: 20 2a 2a 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55   **.  **   UNBOU
7860: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 0a 20  NDED PRECEDING. 
7870: 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 50 52 45   **   <expr> PRE
7880: 43 45 44 49 4e 47 0a 20 20 2a 2a 20 20 20 43 55  CEDING.  **   CU
7890: 52 52 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 20 20  RRENT ROW.  **  
78a0: 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e   <expr> FOLLOWIN
78b0: 47 0a 20 20 2a 2a 20 20 20 55 4e 42 4f 55 4e 44  G.  **   UNBOUND
78c0: 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a  ED FOLLOWING.  *
78d0: 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 72 73 65  *.  ** The parse
78e0: 72 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 22  r ensures that "
78f0: 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
7900: 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75  ING" cannot be u
7910: 73 65 64 20 61 73 20 61 6e 20 65 6e 64 69 6e 67  sed as an ending
7920: 0a 20 20 2a 2a 20 62 6f 75 6e 64 61 72 79 2c 20  .  ** boundary, 
7930: 61 6e 64 20 74 68 61 6e 20 22 55 4e 42 4f 55 4e  and than "UNBOUN
7940: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63  DED FOLLOWING" c
7950: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73  annot be used as
7960: 20 61 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a   a starting.  **
7970: 20 66 72 61 6d 65 20 62 6f 75 6e 64 61 72 79 2e   frame boundary.
7980: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 65 53 74  .  */.  if( (eSt
7990: 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20  art==TK_CURRENT 
79a0: 26 26 20 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  && eEnd==TK_PREC
79b0: 45 44 49 4e 47 29 0a 20 20 20 7c 7c 20 28 65 53  EDING).   || (eS
79c0: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
79d0: 4e 47 20 26 26 20 28 65 45 6e 64 3d 3d 54 4b 5f  NG && (eEnd==TK_
79e0: 50 52 45 43 45 44 49 4e 47 20 7c 7c 20 65 45 6e  PRECEDING || eEn
79f0: 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 29 0a  d==TK_CURRENT)).
7a00: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
7a10: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7a20: 20 22 75 6e 73 75 70 70 6f 72 74 65 64 20 66 72   "unsupported fr
7a30: 61 6d 65 20 64 65 6c 69 6d 69 74 65 72 20 66 6f  ame delimiter fo
7a40: 72 20 52 4f 57 53 22 29 3b 0a 20 20 20 20 67 6f  r ROWS");.    go
7a50: 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72  to windowAllocEr
7a60: 72 3b 0a 20 20 7d 0a 0a 20 20 70 57 69 6e 20 3d  r;.  }..  pWin =
7a70: 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65   (Window*)sqlite
7a80: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
7a90: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
7aa0: 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28  (Window));.  if(
7ab0: 20 70 57 69 6e 3d 3d 30 20 29 20 67 6f 74 6f 20   pWin==0 ) goto 
7ac0: 77 69 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a  windowAllocErr;.
7ad0: 20 20 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20    pWin->eType = 
7ae0: 65 54 79 70 65 3b 0a 20 20 70 57 69 6e 2d 3e 65  eType;.  pWin->e
7af0: 53 74 61 72 74 20 3d 20 65 53 74 61 72 74 3b 0a  Start = eStart;.
7b00: 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 65    pWin->eEnd = e
7b10: 45 6e 64 3b 0a 20 20 70 57 69 6e 2d 3e 62 49 6d  End;.  pWin->bIm
7b20: 70 6c 69 63 69 74 46 72 61 6d 65 20 3d 20 62 49  plicitFrame = bI
7b30: 6d 70 6c 69 63 69 74 46 72 61 6d 65 3b 0a 20 20  mplicitFrame;.  
7b40: 70 57 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c  pWin->pEnd = sql
7b50: 69 74 65 33 57 69 6e 64 6f 77 4f 66 66 73 65 74  ite3WindowOffset
7b60: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 6e  Expr(pParse, pEn
7b70: 64 29 3b 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61  d);.  pWin->pSta
7b80: 72 74 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64  rt = sqlite3Wind
7b90: 6f 77 4f 66 66 73 65 74 45 78 70 72 28 70 50 61  owOffsetExpr(pPa
7ba0: 72 73 65 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  rse, pStart);.  
7bb0: 72 65 74 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69  return pWin;..wi
7bc0: 6e 64 6f 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20  ndowAllocErr:.  
7bd0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7be0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  e(pParse->db, pE
7bf0: 6e 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  nd);.  sqlite3Ex
7c00: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
7c10: 3e 64 62 2c 20 70 53 74 61 72 74 29 3b 0a 20 20  >db, pStart);.  
7c20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7c30: 2a 2a 20 41 74 74 61 63 68 20 50 41 52 54 49 54  ** Attach PARTIT
7c40: 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59  ION and ORDER BY
7c50: 20 63 6c 61 75 73 65 73 20 70 50 61 72 74 69 74   clauses pPartit
7c60: 69 6f 6e 20 61 6e 64 20 70 4f 72 64 65 72 42 79  ion and pOrderBy
7c70: 20 74 6f 20 77 69 6e 64 6f 77 0a 2a 2a 20 70 57   to window.** pW
7c80: 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 70 61 72  in. Also, if par
7c90: 61 6d 65 74 65 72 20 70 42 61 73 65 20 69 73 20  ameter pBase is 
7ca0: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 70 57  not NULL, set pW
7cb0: 69 6e 2d 3e 7a 42 61 73 65 20 74 6f 20 74 68 65  in->zBase to the
7cc0: 0a 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  .** equivalent n
7cd0: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul-terminated st
7ce0: 72 69 6e 67 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20  ring..*/.Window 
7cf0: 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 73  *sqlite3WindowAs
7d00: 73 65 6d 62 6c 65 28 0a 20 20 50 61 72 73 65 20  semble(.  Parse 
7d10: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
7d20: 6f 77 20 2a 70 57 69 6e 2c 20 0a 20 20 45 78 70  ow *pWin, .  Exp
7d30: 72 4c 69 73 74 20 2a 70 50 61 72 74 69 74 69 6f  rList *pPartitio
7d40: 6e 2c 20 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  n, .  ExprList *
7d50: 70 4f 72 64 65 72 42 79 2c 20 0a 20 20 54 6f 6b  pOrderBy, .  Tok
7d60: 65 6e 20 2a 70 42 61 73 65 0a 29 7b 0a 20 20 69  en *pBase.){.  i
7d70: 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 70  f( pWin ){.    p
7d80: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20  Win->pPartition 
7d90: 3d 20 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  = pPartition;.  
7da0: 20 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79    pWin->pOrderBy
7db0: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
7dc0: 20 69 66 28 20 70 42 61 73 65 20 29 7b 0a 20 20   if( pBase ){.  
7dd0: 20 20 20 20 70 57 69 6e 2d 3e 7a 42 61 73 65 20      pWin->zBase 
7de0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
7df0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
7e00: 42 61 73 65 2d 3e 7a 2c 20 70 42 61 73 65 2d 3e  Base->z, pBase->
7e10: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
7e20: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
7e30: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
7e40: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 74  rse->db, pPartit
7e50: 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ion);.    sqlite
7e60: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7e70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
7e80: 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  erBy);.  }.  ret
7e90: 75 72 6e 20 70 57 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn pWin;.}../*.
7ea0: 2a 2a 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 20  ** Window *pWin 
7eb0: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
7ec0: 65 61 74 65 64 20 66 72 6f 6d 20 61 20 57 49 4e  eated from a WIN
7ed0: 44 4f 57 20 63 6c 61 75 73 65 2e 20 54 6f 6b 6e  DOW clause. Tokn
7ee0: 65 20 70 42 61 73 65 0a 2a 2a 20 69 73 20 74 68  e pBase.** is th
7ef0: 65 20 62 61 73 65 20 77 69 6e 64 6f 77 2e 20 45  e base window. E
7f00: 61 72 6c 69 65 72 20 77 69 6e 64 6f 77 73 20 66  arlier windows f
7f10: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 57 49 4e  rom the same WIN
7f20: 44 4f 57 20 63 6c 61 75 73 65 20 61 72 65 0a 2a  DOW clause are.*
7f30: 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
7f40: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
7f50: 74 69 6e 67 20 61 74 20 70 57 69 6e 2d 3e 70 4e  ting at pWin->pN
7f60: 65 78 74 57 69 6e 2e 20 54 68 69 73 20 66 75 6e  extWin. This fun
7f70: 63 74 69 6f 6e 0a 2a 2a 20 65 69 74 68 65 72 20  ction.** either 
7f80: 75 70 64 61 74 65 73 20 2a 70 57 69 6e 20 61 63  updates *pWin ac
7f90: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 62  cording to the b
7fa0: 61 73 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  ase specificatio
7fb0: 6e 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 6c 65  n, or else.** le
7fc0: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 69 6e  aves an error in
7fd0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
7fe0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 68   sqlite3WindowCh
7ff0: 61 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ain(Parse *pPars
8000: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c  e, Window *pWin,
8010: 20 57 69 6e 64 6f 77 20 2a 70 4c 69 73 74 29 7b   Window *pList){
8020: 0a 20 20 69 66 28 20 70 57 69 6e 2d 3e 7a 42 61  .  if( pWin->zBa
8030: 73 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  se ){.    sqlite
8040: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8050: 64 62 3b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a  db;.    Window *
8060: 70 45 78 69 73 74 20 3d 20 77 69 6e 64 6f 77 46  pExist = windowF
8070: 69 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ind(pParse, pLis
8080: 74 2c 20 70 57 69 6e 2d 3e 7a 42 61 73 65 29 3b  t, pWin->zBase);
8090: 0a 20 20 20 20 69 66 28 20 70 45 78 69 73 74 20  .    if( pExist 
80a0: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
80b0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
80c0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f       /* Check fo
80d0: 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  r errors */.    
80e0: 20 20 69 66 28 20 70 57 69 6e 2d 3e 70 50 61 72    if( pWin->pPar
80f0: 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  tition ){.      
8100: 20 20 7a 45 72 72 20 3d 20 22 50 41 52 54 49 54    zErr = "PARTIT
8110: 49 4f 4e 20 63 6c 61 75 73 65 22 3b 0a 20 20 20  ION clause";.   
8120: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
8130: 69 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ist->pOrderBy &&
8140: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20   pWin->pOrderBy 
8150: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
8160: 3d 20 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  = "ORDER BY clau
8170: 73 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  se";.      }else
8180: 20 69 66 28 20 70 45 78 69 73 74 2d 3e 62 49 6d   if( pExist->bIm
8190: 70 6c 69 63 69 74 46 72 61 6d 65 3d 3d 30 20 29  plicitFrame==0 )
81a0: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
81b0: 20 22 66 72 61 6d 65 20 73 70 65 63 69 66 69 63   "frame specific
81c0: 61 74 69 6f 6e 22 3b 0a 20 20 20 20 20 20 7d 0a  ation";.      }.
81d0: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29        if( zErr )
81e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
81f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8200: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
8210: 63 61 6e 6e 6f 74 20 6f 76 65 72 72 69 64 65 20  cannot override 
8220: 25 73 20 6f 66 20 77 69 6e 64 6f 77 3a 20 25 73  %s of window: %s
8230: 22 2c 20 7a 45 72 72 2c 20 70 57 69 6e 2d 3e 7a  ", zErr, pWin->z
8240: 42 61 73 65 0a 20 20 20 20 20 20 20 20 29 3b 0a  Base.        );.
8250: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8260: 20 20 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74       pWin->pPart
8270: 69 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45  ition = sqlite3E
8280: 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
8290: 45 78 69 73 74 2d 3e 70 50 61 72 74 69 74 69 6f  Exist->pPartitio
82a0: 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  n, 0);.        i
82b0: 66 28 20 70 45 78 69 73 74 2d 3e 70 4f 72 64 65  f( pExist->pOrde
82c0: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rBy ){.         
82d0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d 3e 70   assert( pWin->p
82e0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
82f0: 20 20 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f          pWin->pO
8300: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
8310: 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
8320: 70 45 78 69 73 74 2d 3e 70 4f 72 64 65 72 42 79  pExist->pOrderBy
8330: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
8340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
8350: 62 46 72 65 65 28 64 62 2c 20 70 57 69 6e 2d 3e  bFree(db, pWin->
8360: 7a 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  zBase);.        
8370: 70 57 69 6e 2d 3e 7a 42 61 73 65 20 3d 20 30 3b  pWin->zBase = 0;
8380: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8390: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61   }.}../*.** Atta
83a0: 63 68 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74  ch window object
83b0: 20 70 57 69 6e 20 74 6f 20 65 78 70 72 65 73 73   pWin to express
83c0: 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ion p..*/.void s
83d0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61  qlite3WindowAtta
83e0: 63 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ch(Parse *pParse
83f0: 2c 20 45 78 70 72 20 2a 70 2c 20 57 69 6e 64 6f  , Expr *p, Windo
8400: 77 20 2a 70 57 69 6e 29 7b 0a 20 20 69 66 28 20  w *pWin){.  if( 
8410: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
8420: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
8430: 49 4f 4e 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ION );.    /* Th
8440: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
8450: 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ly called for th
8460: 65 20 70 61 72 73 65 72 2e 20 20 49 66 20 70 57  e parser.  If pW
8470: 69 6e 20 77 61 73 20 6e 6f 74 0a 20 20 20 20 2a  in was not.    *
8480: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 64 75 65 20  * allocated due 
8490: 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74 68 65 6e 20  to an OOM, then 
84a0: 74 68 65 20 70 61 72 73 65 72 20 77 6f 75 6c 64  the parser would
84b0: 20 66 61 69 6c 20 62 65 66 6f 72 65 20 65 76 65   fail before eve
84c0: 72 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6b 69 6e  r.    ** invokin
84d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  g this routine *
84e0: 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  /.    if( ALWAYS
84f0: 28 70 57 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  (pWin) ){.      
8500: 70 2d 3e 79 2e 70 57 69 6e 20 3d 20 70 57 69 6e  p->y.pWin = pWin
8510: 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 50  ;.      ExprSetP
8520: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 57 69  roperty(p, EP_Wi
8530: 6e 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 70 57  nFunc);.      pW
8540: 69 6e 2d 3e 70 4f 77 6e 65 72 20 3d 20 70 3b 0a  in->pOwner = p;.
8550: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
8560: 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
8570: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8580: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8590: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  se,.           "
85a0: 44 49 53 54 49 4e 43 54 20 69 73 20 6e 6f 74 20  DISTINCT is not 
85b0: 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 77 69  supported for wi
85c0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 22 29  ndow functions")
85d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
85e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
85f0: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
8600: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 57 69  (pParse->db, pWi
8610: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
8620: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
8630: 20 74 77 6f 20 77 69 6e 64 6f 77 20 6f 62 6a 65   two window obje
8640: 63 74 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  cts are identica
8650: 6c 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  l, or non-zero o
8660: 74 68 65 72 77 69 73 65 2e 0a 2a 2a 20 49 64 65  therwise..** Ide
8670: 6e 74 69 63 61 6c 20 77 69 6e 64 6f 77 20 6f 62  ntical window ob
8680: 6a 65 63 74 73 20 63 61 6e 20 62 65 20 70 72 6f  jects can be pro
8690: 63 65 73 73 65 64 20 69 6e 20 61 20 73 69 6e 67  cessed in a sing
86a0: 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 69 6e 74 20  le scan..*/.int 
86b0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d  sqlite3WindowCom
86c0: 70 61 72 65 28 50 61 72 73 65 20 2a 70 50 61 72  pare(Parse *pPar
86d0: 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 31 2c 20  se, Window *p1, 
86e0: 57 69 6e 64 6f 77 20 2a 70 32 29 7b 0a 20 20 69  Window *p2){.  i
86f0: 66 28 20 70 31 2d 3e 65 54 79 70 65 21 3d 70 32  f( p1->eType!=p2
8700: 2d 3e 65 54 79 70 65 20 29 20 72 65 74 75 72 6e  ->eType ) return
8710: 20 31 3b 0a 20 20 69 66 28 20 70 31 2d 3e 65 53   1;.  if( p1->eS
8720: 74 61 72 74 21 3d 70 32 2d 3e 65 53 74 61 72 74  tart!=p2->eStart
8730: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
8740: 66 28 20 70 31 2d 3e 65 45 6e 64 21 3d 70 32 2d  f( p1->eEnd!=p2-
8750: 3e 65 45 6e 64 20 29 20 72 65 74 75 72 6e 20 31  >eEnd ) return 1
8760: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  ;.  if( sqlite3E
8770: 78 70 72 43 6f 6d 70 61 72 65 28 70 50 61 72 73  xprCompare(pPars
8780: 65 2c 20 70 31 2d 3e 70 53 74 61 72 74 2c 20 70  e, p1->pStart, p
8790: 32 2d 3e 70 53 74 61 72 74 2c 20 2d 31 29 20 29  2->pStart, -1) )
87a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
87b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
87c0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d 3e  are(pParse, p1->
87d0: 70 45 6e 64 2c 20 70 32 2d 3e 70 45 6e 64 2c 20  pEnd, p2->pEnd, 
87e0: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
87f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
8800: 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 31 2d  rListCompare(p1-
8810: 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 70 32 2d  >pPartition, p2-
8820: 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 2d 31 29  >pPartition, -1)
8830: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
8840: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
8850: 73 74 43 6f 6d 70 61 72 65 28 70 31 2d 3e 70 4f  stCompare(p1->pO
8860: 72 64 65 72 42 79 2c 20 70 32 2d 3e 70 4f 72 64  rderBy, p2->pOrd
8870: 65 72 42 79 2c 20 2d 31 29 20 29 20 72 65 74 75  erBy, -1) ) retu
8880: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
8890: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
88a0: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 63 6f   is called by co
88b0: 64 65 20 69 6e 20 73 65 6c 65 63 74 2e 63 20 62  de in select.c b
88c0: 65 66 6f 72 65 20 69 74 20 63 61 6c 6c 73 20 73  efore it calls s
88d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
88e0: 28 29 0a 2a 2a 20 74 6f 20 62 65 67 69 6e 20 69  ().** to begin i
88f0: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
8900: 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 72   the sub-query r
8910: 65 73 75 6c 74 73 2e 20 49 74 20 69 73 20 75 73  esults. It is us
8920: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 2a  ed to allocate.*
8930: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
8940: 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 63   registers and c
8950: 75 72 73 6f 72 73 20 75 73 65 64 20 62 79 20 73  ursors used by s
8960: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
8970: 53 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Step()..*/.void 
8980: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64  sqlite3WindowCod
8990: 65 49 6e 69 74 28 50 61 72 73 65 20 2a 70 50 61  eInit(Parse *pPa
89a0: 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57  rse, Window *pMW
89b0: 69 6e 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  in){.  Window *p
89c0: 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Win;.  Vdbe *v =
89d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
89e0: 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6e  pParse);.  int n
89f0: 50 61 72 74 20 3d 20 28 70 4d 57 69 6e 2d 3e 70  Part = (pMWin->p
8a00: 50 61 72 74 69 74 69 6f 6e 20 3f 20 70 4d 57 69  Partition ? pMWi
8a10: 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e  n->pPartition->n
8a20: 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 6e 50 61  Expr : 0);.  nPa
8a30: 72 74 20 2b 3d 20 28 70 4d 57 69 6e 2d 3e 70 4f  rt += (pMWin->pO
8a40: 72 64 65 72 42 79 20 3f 20 70 4d 57 69 6e 2d 3e  rderBy ? pMWin->
8a50: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
8a60: 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 50 61 72  : 0);.  if( nPar
8a70: 74 20 29 7b 0a 20 20 20 20 70 4d 57 69 6e 2d 3e  t ){.    pMWin->
8a80: 72 65 67 50 61 72 74 20 3d 20 70 50 61 72 73 65  regPart = pParse
8a90: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
8aa0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
8ab0: 61 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  art;.    sqlite3
8ac0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8ad0: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 4d 57 69 6e 2d  _Null, 0, pMWin-
8ae0: 3e 72 65 67 50 61 72 74 2c 20 70 4d 57 69 6e 2d  >regPart, pMWin-
8af0: 3e 72 65 67 50 61 72 74 2b 6e 50 61 72 74 2d 31  >regPart+nPart-1
8b00: 29 3b 0a 20 20 7d 0a 0a 20 20 70 4d 57 69 6e 2d  );.  }..  pMWin-
8b10: 3e 72 65 67 46 69 72 73 74 20 3d 20 2b 2b 70 50  >regFirst = ++pP
8b20: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
8b30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8b40: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
8b50: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73  , pMWin->regFirs
8b60: 74 29 3b 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d  t);..  for(pWin=
8b70: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
8b80: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
8b90: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
8ba0: 70 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b  p = pWin->pFunc;
8bb0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 66 75 6e  .    if( (p->fun
8bc0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
8bd0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20  FUNC_MINMAX) && 
8be0: 70 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  pWin->eStart!=TK
8bf0: 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20  _UNBOUNDED ){.  
8c00: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6c 69 6e      /* The inlin
8c10: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6d 69  e versions of mi
8c20: 6e 28 29 20 61 6e 64 20 6d 61 78 28 29 20 72 65  n() and max() re
8c30: 71 75 69 72 65 20 61 20 73 69 6e 67 6c 65 20 65  quire a single e
8c40: 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 20 20 2a  phemeral.      *
8c50: 2a 20 74 61 62 6c 65 20 61 6e 64 20 33 20 72 65  * table and 3 re
8c60: 67 69 73 74 65 72 73 2e 20 54 68 65 20 72 65 67  gisters. The reg
8c70: 69 73 74 65 72 73 20 61 72 65 20 75 73 65 64 20  isters are used 
8c80: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20  as follows:.    
8c90: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
8ca0: 72 65 67 41 70 70 2b 30 3a 20 73 6c 6f 74 20 74  regApp+0: slot t
8cb0: 6f 20 63 6f 70 79 20 6d 69 6e 28 29 2f 6d 61 78  o copy min()/max
8cc0: 28 29 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 66  () argument to f
8cd0: 6f 72 20 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20  or MakeRecord.  
8ce0: 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b      **   regApp+
8cf0: 31 3a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  1: integer value
8d00: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
8d10: 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 0a  keys are unique.
8d20: 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67 41 70        **   regAp
8d30: 70 2b 32 3a 20 6f 75 74 70 75 74 20 6f 66 20 4d  p+2: output of M
8d40: 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20 20  akeRecord.      
8d50: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
8d60: 74 20 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d  t *pList = pWin-
8d70: 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74  >pOwner->x.pList
8d80: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
8d90: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
8da0: 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
8db0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
8dc0: 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
8dd0: 20 20 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 20     pWin->csrApp 
8de0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
8df0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65  ;.      pWin->re
8e00: 67 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gApp = pParse->n
8e10: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 70 50 61  Mem+1;.      pPa
8e20: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a  rse->nMem += 3;.
8e30: 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
8e40: 66 6f 20 26 26 20 70 57 69 6e 2d 3e 70 46 75 6e  fo && pWin->pFun
8e50: 63 2d 3e 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27  c->zName[1]=='i'
8e60: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
8e70: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
8e80: 6f 72 74 4f 72 64 65 72 5b 30 5d 3d 3d 30 20 29  ortOrder[0]==0 )
8e90: 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e  ;.        pKeyIn
8ea0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
8eb0: 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 1;.      }. 
8ec0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ed0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
8ee0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 57 69 6e  nEphemeral, pWin
8ef0: 2d 3e 63 73 72 41 70 70 2c 20 32 29 3b 0a 20 20  ->csrApp, 2);.  
8f00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8f10: 70 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49  ppendP4(v, pKeyI
8f20: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
8f30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8f40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f50: 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e  Integer, 0, pWin
8f60: 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20  ->regApp+1);.   
8f70: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
8f80: 70 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61  p->zName==nth_va
8f90: 6c 75 65 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e  lueName || p->zN
8fa0: 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  ame==first_value
8fb0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Name ){.      /*
8fc0: 20 41 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72 65   Allocate two re
8fd0: 67 69 73 74 65 72 73 20 61 74 20 70 57 69 6e 2d  gisters at pWin-
8fe0: 3e 72 65 67 41 70 70 2e 20 54 68 65 73 65 20 77  >regApp. These w
8ff0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 0a 20  ill be used to. 
9000: 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68       ** store th
9010: 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
9020: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 75 72  index of the cur
9030: 72 65 6e 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a  rent frame.  */.
9040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
9050: 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a  Win->iEphCsr );.
9060: 20 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41        pWin->regA
9070: 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  pp = pParse->nMe
9080: 6d 2b 31 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  m+1;.      pWin-
9090: 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65  >csrApp = pParse
90a0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
90b0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
90c0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
90d0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
90e0: 5f 4f 70 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e  _OpenDup, pWin->
90f0: 63 73 72 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69  csrApp, pMWin->i
9100: 45 70 68 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20  EphCsr);.    }. 
9110: 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a     else if( p->z
9120: 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c  Name==leadName |
9130: 7c 20 70 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e  | p->zName==lagN
9140: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ame ){.      ass
9150: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ert( pMWin->iEph
9160: 43 73 72 20 29 3b 0a 20 20 20 20 20 20 70 57 69  Csr );.      pWi
9170: 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70 50 61 72  n->csrApp = pPar
9180: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
9190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
91a0: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75  Op2(v, OP_OpenDu
91b0: 70 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c  p, pWin->csrApp,
91c0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
91d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
91e0: 2a 0a 2a 2a 20 41 20 22 50 52 45 43 45 44 49 4e  *.** A "PRECEDIN
91f0: 47 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64  G <expr>" (eCond
9200: 3d 3d 30 29 20 6f 72 20 22 46 4f 4c 4c 4f 57 49  ==0) or "FOLLOWI
9210: 4e 47 20 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e  NG <expr>" (eCon
9220: 64 3d 3d 31 29 20 6f 72 20 74 68 65 0a 2a 2a 20  d==1) or the.** 
9230: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63  value of the sec
9240: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
9250: 6e 74 68 5f 76 61 6c 75 65 28 29 20 28 65 43 6f  nth_value() (eCo
9260: 6e 64 3d 3d 32 29 20 68 61 73 20 6a 75 73 74 20  nd==2) has just 
9270: 62 65 65 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65  been.** evaluate
9280: 64 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  d and the result
9290: 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65   left in registe
92a0: 72 20 72 65 67 2e 20 54 68 69 73 20 66 75 6e 63  r reg. This func
92b0: 74 69 6f 6e 20 67 65 6e 65 72 61 74 65 73 20 56  tion generates V
92c0: 4d 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 63 68 65  M.** code to che
92d0: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
92e0: 65 20 69 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  e is a non-negat
92f0: 69 76 65 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ive integer and 
9300: 74 68 72 6f 77 73 20 61 6e 0a 2a 2a 20 65 78 63  throws an.** exc
9310: 65 70 74 69 6f 6e 20 69 66 20 69 74 20 69 73 20  eption if it is 
9320: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  not..*/.static v
9330: 6f 69 64 20 77 69 6e 64 6f 77 43 68 65 63 6b 49  oid windowCheckI
9340: 6e 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70  ntValue(Parse *p
9350: 50 61 72 73 65 2c 20 69 6e 74 20 72 65 67 2c 20  Parse, int reg, 
9360: 69 6e 74 20 65 43 6f 6e 64 29 7b 0a 20 20 73 74  int eCond){.  st
9370: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9380: 2a 61 7a 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20  *azErr[] = {.   
9390: 20 22 66 72 61 6d 65 20 73 74 61 72 74 69 6e 67   "frame starting
93a0: 20 6f 66 66 73 65 74 20 6d 75 73 74 20 62 65 20   offset must be 
93b0: 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69  a non-negative i
93c0: 6e 74 65 67 65 72 22 2c 0a 20 20 20 20 22 66 72  nteger",.    "fr
93d0: 61 6d 65 20 65 6e 64 69 6e 67 20 6f 66 66 73 65  ame ending offse
93e0: 74 20 6d 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d  t must be a non-
93f0: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
9400: 22 2c 0a 20 20 20 20 22 73 65 63 6f 6e 64 20 61  ",.    "second a
9410: 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76  rgument to nth_v
9420: 61 6c 75 65 20 6d 75 73 74 20 62 65 20 61 20 70  alue must be a p
9430: 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 22  ositive integer"
9440: 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69  .  };.  static i
9450: 6e 74 20 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50 5f  nt aOp[] = { OP_
9460: 47 65 2c 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 74  Ge, OP_Ge, OP_Gt
9470: 20 7d 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   };.  Vdbe *v = 
9480: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9490: 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65  Parse);.  int re
94a0: 67 5a 65 72 6f 20 3d 20 73 71 6c 69 74 65 33 47  gZero = sqlite3G
94b0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
94c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 43 6f  );.  assert( eCo
94d0: 6e 64 3d 3d 30 20 7c 7c 20 65 43 6f 6e 64 3d 3d  nd==0 || eCond==
94e0: 31 20 7c 7c 20 65 43 6f 6e 64 3d 3d 32 20 29 3b  1 || eCond==2 );
94f0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9500: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
9510: 65 72 2c 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b  er, 0, regZero);
9520: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
9530: 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
9540: 65 49 6e 74 2c 20 72 65 67 2c 20 73 71 6c 69 74  eInt, reg, sqlit
9550: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
9560: 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62 65 43  r(v)+2);.  VdbeC
9570: 6f 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f  overageIf(v, eCo
9580: 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f  nd==0);.  VdbeCo
9590: 76 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e  verageIf(v, eCon
95a0: 64 3d 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76  d==1);.  VdbeCov
95b0: 65 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64  erageIf(v, eCond
95c0: 3d 3d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ==2);.  sqlite3V
95d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4f 70  dbeAddOp3(v, aOp
95e0: 5b 65 43 6f 6e 64 5d 2c 20 72 65 67 5a 65 72 6f  [eCond], regZero
95f0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
9600: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c 20 72  rentAddr(v)+2, r
9610: 65 67 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  eg);.  VdbeCover
9620: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76  ageNeverNullIf(v
9630: 2c 20 65 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56  , eCond==0);.  V
9640: 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
9650: 4e 75 6c 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d  NullIf(v, eCond=
9660: 3d 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  =1);.  VdbeCover
9670: 61 67 65 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76  ageNeverNullIf(v
9680: 2c 20 65 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73  , eCond==2);.  s
9690: 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
96a0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
96b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
96c0: 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f 45  P_Halt, SQLITE_E
96d0: 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72 74 29 3b  RROR, OE_Abort);
96e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70  .  sqlite3VdbeAp
96f0: 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a  pendP4(v, (void*
9700: 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c 20 50  )azErr[eCond], P
9710: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  4_STATIC);.  sql
9720: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9730: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 5a 65  eg(pParse, regZe
9740: 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ro);.}../*.** Re
9750: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
9760: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
9770: 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 64 6f  sed to the windo
9780: 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  w-function assoc
9790: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
97a0: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
97b0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
97c0: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
97d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
97e0: 20 69 6e 74 20 77 69 6e 64 6f 77 41 72 67 43 6f   int windowArgCo
97f0: 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70 57 69 6e  unt(Window *pWin
9800: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
9810: 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  List = pWin->pOw
9820: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  ner->x.pList;.  
9830: 72 65 74 75 72 6e 20 28 70 4c 69 73 74 20 3f 20  return (pList ? 
9840: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
9850: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
9860: 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20  rate VM code to 
9870: 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78 53  invoke either xS
9880: 74 65 70 28 29 20 28 69 66 20 62 49 6e 76 65 72  tep() (if bInver
9890: 73 65 20 69 73 20 30 29 20 6f 72 20 0a 2a 2a 20  se is 0) or .** 
98a0: 78 49 6e 76 65 72 73 65 20 28 69 66 20 62 49 6e  xInverse (if bIn
98b0: 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  verse is non-zer
98c0: 6f 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  o) for each wind
98d0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  ow function in t
98e0: 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
98f0: 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  st starting at p
9900: 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75  MWin. Or, for bu
9910: 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75  ilt-in window fu
9920: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  nctions.** that 
9930: 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 73  do not use the s
9940: 74 61 6e 64 61 72 64 20 66 75 6e 63 74 69 6f 6e  tandard function
9950: 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65 20 74   API, generate t
9960: 68 65 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 69  he required.** i
9970: 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65 2e 0a 2a  nline VM code..*
9980: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
9990: 20 63 73 72 20 69 73 20 67 72 65 61 74 65 72 20   csr is greater 
99a0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
99b0: 20 30 2c 20 74 68 65 6e 20 61 72 67 75 6d 65 6e   0, then argumen
99c0: 74 20 72 65 67 20 69 73 0a 2a 2a 20 74 68 65 20  t reg is.** the 
99d0: 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69  first register i
99e0: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65  n an array of re
99f0: 67 69 73 74 65 72 73 20 67 75 61 72 61 6e 74 65  gisters guarante
9a00: 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a  ed to be large.*
9a10: 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  * enough to hold
9a20: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 72   the array of ar
9a30: 67 75 6d 65 6e 74 73 20 66 6f 72 20 65 61 63 68  guments for each
9a40: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20 74 68   function. In th
9a50: 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 61  is case.** the a
9a60: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65 78 74  rguments are ext
9a70: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
9a80: 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 63  current row of c
9a90: 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 61  sr into the.** a
9aa0: 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72  rray of register
9ab0: 73 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e  s before invokin
9ac0: 67 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  g OP_AggStep or 
9ad0: 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 0a 2a 2a  OP_AggInverse.**
9ae0: 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73 72 20 69  .** Or, if csr i
9af0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
9b00: 2c 20 74 68 65 6e 20 74 68 65 20 61 72 72 61 79  , then the array
9b10: 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 61 74   of registers at
9b20: 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c 72 65 61   reg is.** alrea
9b30: 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  dy populated wit
9b40: 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 66 72  h all columns fr
9b50: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  om the current r
9b60: 6f 77 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ow of the sub-qu
9b70: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ery..**.** If ar
9b80: 67 75 6d 65 6e 74 20 72 65 67 50 61 72 74 53 69  gument regPartSi
9b90: 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ze is non-zero, 
9ba0: 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 67  then it is a reg
9bb0: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
9bc0: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
9bd0: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 63 75  f rows in the cu
9be0: 72 72 65 6e 74 20 70 61 72 74 69 74 69 6f 6e 2e  rrent partition.
9bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9c00: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 0a 20  windowAggStep(. 
9c10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9c20: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
9c30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9c40: 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73     /* Linked lis
9c50: 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63  t of window func
9c60: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 63  tions */.  int c
9c70: 73 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sr,             
9c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
9c90: 61 64 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f  ad arguments fro
9ca0: 6d 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  m this cursor */
9cb0: 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 73 65 2c  .  int bInverse,
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
9ce0: 76 6f 6b 65 20 78 49 6e 76 65 72 73 65 20 69 6e  voke xInverse in
9cf0: 73 74 65 61 64 20 6f 66 20 78 53 74 65 70 20 2a  stead of xStep *
9d00: 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20 20 20 20  /.  int reg,    
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d20: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
9d30: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
9d40: 6e 74 20 72 65 67 50 61 72 74 53 69 7a 65 20 20  nt regPartSize  
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d60: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  * Register conta
9d70: 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61  ining size of pa
9d80: 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rtition */.){.  
9d90: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9da0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
9db0: 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e  ;.  Window *pWin
9dc0: 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ;.  for(pWin=pMW
9dd0: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
9de0: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
9df0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
9e00: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
9e10: 63 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  cFlags;.    int 
9e20: 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  regArg;.    int 
9e30: 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41 72 67  nArg = windowArg
9e40: 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 0a 20 20  Count(pWin);..  
9e50: 20 20 69 66 28 20 63 73 72 3e 3d 30 20 29 7b 0a    if( csr>=0 ){.
9e60: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9e70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
9e80: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
9e90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ea0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
9eb0: 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72  , csr, pWin->iAr
9ec0: 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29 3b 0a  gCol+i, reg+i);.
9ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
9ee0: 67 41 72 67 20 3d 20 72 65 67 3b 0a 20 20 20 20  gArg = reg;.    
9ef0: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
9f00: 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57  LITE_FUNC_WINDOW
9f10: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
9f20: 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a   if( nArg==0 ){.
9f30: 20 20 20 20 20 20 20 20 20 20 72 65 67 41 72 67            regArg
9f40: 20 3d 20 72 65 67 50 61 72 74 53 69 7a 65 3b 0a   = regPartSize;.
9f50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9f60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9f70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9f80: 5f 53 43 6f 70 79 2c 20 72 65 67 50 61 72 74 53  _SCopy, regPartS
9f90: 69 7a 65 2c 20 72 65 67 2b 6e 41 72 67 29 3b 0a  ize, reg+nArg);.
9fa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9fb0: 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 20 20 20 20    nArg++;.      
9fc0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
9fd0: 20 20 20 61 73 73 65 72 74 28 20 21 28 66 6c 61     assert( !(fla
9fe0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
9ff0: 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 20 29 3b  _WINDOW_SIZE) );
a000: 0a 20 20 20 20 20 20 72 65 67 41 72 67 20 3d 20  .      regArg = 
a010: 72 65 67 20 2b 20 70 57 69 6e 2d 3e 69 41 72 67  reg + pWin->iArg
a020: 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Col;.    }..    
a030: 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63  if( (pWin->pFunc
a040: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
a050: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
a060: 29 20 0a 20 20 20 20 20 20 26 26 20 70 57 69 6e  ) .      && pWin
a070: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
a080: 4f 55 4e 44 45 44 20 0a 20 20 20 20 29 7b 0a 20  OUNDED .    ){. 
a090: 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 73 4e       int addrIsN
a0a0: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ull = sqlite3Vdb
a0b0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73  eAddOp1(v, OP_Is
a0c0: 4e 75 6c 6c 2c 20 72 65 67 41 72 67 29 3b 0a 20  Null, regArg);. 
a0d0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
a0e0: 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e(v);.      if( 
a0f0: 62 49 6e 76 65 72 73 65 3d 3d 30 20 29 7b 0a 20  bInverse==0 ){. 
a100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a110: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
a120: 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  ddImm, pWin->reg
a130: 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20 20 20 20  App+1, 1);.     
a140: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a150: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
a160: 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e  , regArg, pWin->
a170: 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20 20  regApp);.       
a180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a190: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
a1a0: 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70  ord, pWin->regAp
a1b0: 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72 65 67 41  p, 2, pWin->regA
a1c0: 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 73  pp+2);.        s
a1d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a1e0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
a1f0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
a200: 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32 29 3b  pWin->regApp+2);
a210: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a230: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a240: 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e 2d 3e 63  _SeekGE, pWin->c
a250: 73 72 41 70 70 2c 20 30 2c 20 72 65 67 41 72 67  srApp, 0, regArg
a260: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 1);.        Vd
a270: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
a280: 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20 20 20  aken(v);.       
a290: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2a0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
a2b0: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a   pWin->csrApp);.
a2c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a2d0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 73  dbeJumpHere(v, s
a2e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
a2f0: 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20 20 20  tAddr(v)-2);.   
a300: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a310: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
a320: 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b 0a 20  , addrIsNull);. 
a330: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 57 69     }else if( pWi
a340: 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20 20 20  n->regApp ){.   
a350: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d     assert( pWin-
a360: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e  >pFunc->zName==n
a370: 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20  th_valueName.   
a380: 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69 6e 2d          || pWin-
a390: 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66  >pFunc->zName==f
a3a0: 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  irst_valueName. 
a3b0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a3c0: 73 65 72 74 28 20 62 49 6e 76 65 72 73 65 3d 3d  sert( bInverse==
a3d0: 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d 3d 31  0 || bInverse==1
a3e0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
a3f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a400: 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e  P_AddImm, pWin->
a410: 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65 72 73  regApp+1-bInvers
a420: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 1);.    }else
a430: 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75 6e 63   if( pWin->pFunc
a440: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d  ->zName==leadNam
a450: 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  e.           || 
a460: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61  pWin->pFunc->zNa
a470: 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a 20 20 20 20  me==lagName.    
a480: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  ){.      /* no-o
a490: 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  p */.    }else{.
a4a0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49 66        int addrIf
a4b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
a4c0: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
a4d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
a4e0: 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tmp;.        ass
a4f0: 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c 7c 20  ert( nArg==0 || 
a500: 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f 77 6e  nArg==pWin->pOwn
a510: 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  er->x.pList->nEx
a520: 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  pr );.        as
a530: 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20 70 57  sert( nArg || pW
a540: 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c  in->pOwner->x.pL
a550: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
a560: 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a 20    if( csr>0 ){. 
a570: 20 20 20 20 20 20 20 20 20 72 65 67 54 6d 70 20           regTmp 
a580: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a590: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
a5a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a5b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a5c0: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
a5d0: 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72 67 2c 72  ->iArgCol+nArg,r
a5e0: 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  egTmp);.        
a5f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a600: 20 72 65 67 54 6d 70 20 3d 20 72 65 67 41 72 67   regTmp = regArg
a610: 20 2b 20 6e 41 72 67 3b 0a 20 20 20 20 20 20 20   + nArg;.       
a620: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 72 49   }.        addrI
a630: 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  f = sqlite3VdbeA
a640: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp3(v, OP_IfNo
a650: 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20 31 29  t, regTmp, 0, 1)
a660: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
a670: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
a680: 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b 0a     if( csr>0 ){.
a690: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a6a0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
a6b0: 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70 29 3b  pParse, regTmp);
a6c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a6d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 69   }.      if( pWi
a6e0: 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c  n->pFunc->funcFl
a6f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
a700: 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20  C_NEEDCOLL ){.  
a710: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
a720: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73  Coll;.        as
a730: 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29 3b 0a  sert( nArg>0 );.
a740: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
a750: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
a760: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 57 69  lSeq(pParse, pWi
a770: 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69  n->pOwner->x.pLi
a780: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
a790: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a7a0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a7b0: 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c 30 2c  _CollSeq, 0,0,0,
a7c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 43   (const char*)pC
a7d0: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
a7e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a7f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a800: 33 28 76 2c 20 62 49 6e 76 65 72 73 65 3f 20 4f  3(v, bInverse? O
a810: 50 5f 41 67 67 49 6e 76 65 72 73 65 20 3a 20 4f  P_AggInverse : O
a820: 50 5f 41 67 67 53 74 65 70 2c 20 0a 20 20 20 20  P_AggStep, .    
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 20 20 20 20 62 49 6e 76 65 72 73 65 2c 20 72 65      bInverse, re
a850: 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 41  gArg, pWin->regA
a860: 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  ccum);.      sql
a870: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
a880: 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c  (v, pWin->pFunc,
a890: 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
a8a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
a8b0: 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e  hangeP5(v, (u8)n
a8c0: 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Arg);.      if( 
a8d0: 61 64 64 72 49 66 20 29 20 73 71 6c 69 74 65 33  addrIf ) sqlite3
a8e0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
a8f0: 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d 0a 20  addrIf);.    }. 
a900: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
a910: 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74 6f 20  rate VM code to 
a920: 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20 78 56  invoke either xV
a930: 61 6c 75 65 28 29 20 28 62 46 69 6e 61 6c 3d 3d  alue() (bFinal==
a940: 30 29 20 6f 72 20 78 46 69 6e 61 6c 69 7a 65 28  0) or xFinalize(
a950: 29 0a 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d 31 29  ).** (bFinal==1)
a960: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
a970: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74 68 65   function in the
a980: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
a990: 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70 4d 57 69  rting at.** pMWi
a9a0: 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69 6c 74  n. Or, for built
a9b0: 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74  -in window-funct
a9c0: 69 6f 6e 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ions that do not
a9d0: 20 75 73 65 20 74 68 65 20 73 74 61 6e 64 61 72   use the standar
a9e0: 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e 65 72 61  d.** API, genera
a9f0: 74 65 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e  te the equivalen
aa00: 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  t VM code..*/.st
aa10: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77  atic void window
aa20: 41 67 67 46 69 6e 61 6c 28 50 61 72 73 65 20 2a  AggFinal(Parse *
aa30: 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77 20 2a  pParse, Window *
aa40: 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46 69 6e 61  pMWin, int bFina
aa50: 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
aa60: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
aa70: 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64 6f 77  Parse);.  Window
aa80: 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72 28 70   *pWin;..  for(p
aa90: 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e 3b  Win=pMWin; pWin;
aaa0: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
aab0: 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28 20 28  tWin){.    if( (
aac0: 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  pWin->pFunc->fun
aad0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
aae0: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a 20 20  FUNC_MINMAX) .  
aaf0: 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53 74 61     && pWin->eSta
ab00: 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt!=TK_UNBOUNDED
ab10: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73   .    ){.      s
ab20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ab30: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
ab40: 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29  pWin->regResult)
ab50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ab60: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ab70: 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41  Last, pWin->csrA
ab80: 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  pp);.      VdbeC
ab90: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
aba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
abb0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
abc0: 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20  , pWin->csrApp, 
abd0: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  0, pWin->regResu
abe0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
abf0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
ac00: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
ac10: 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a  rentAddr(v)-2);.
ac20: 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61 6c        if( bFinal
ac30: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ac40: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
ac50: 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
ac60: 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29 3b 0a   pWin->csrApp);.
ac70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
ac80: 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65 67 41  e if( pWin->regA
ac90: 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c 73 65 7b  pp ){.    }else{
aca0: 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e 61  .      if( bFina
acb0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
acc0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
acd0: 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
ace0: 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 77  Win->regAccum, w
acf0: 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70 57  indowArgCount(pW
ad00: 69 6e 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  in));.        sq
ad10: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
ad20: 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63  4(v, pWin->pFunc
ad30: 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
ad40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ad50: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
ad60: 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  opy, pWin->regAc
ad70: 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  cum, pWin->regRe
ad80: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 73  sult);.        s
ad90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ada0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
adb0: 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
adc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
add0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ade0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
adf0: 67 56 61 6c 75 65 2c 20 70 57 69 6e 2d 3e 72 65  gValue, pWin->re
ae00: 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77 41 72  gAccum, windowAr
ae10: 67 43 6f 75 6e 74 28 70 57 69 6e 29 2c 0a 20 20  gCount(pWin),.  
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 20 20 20 20 20 20 20 70 57 69 6e 2d             pWin-
ae40: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
ae50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ae60: 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e  AppendP4(v, pWin
ae70: 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
ae80: 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DEF);.      }.  
ae90: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
aea0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 67   This function g
aeb0: 65 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65  enerates VM code
aec0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 73   to invoke the s
aed0: 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 61 64  ub-routine at ad
aee0: 64 72 65 73 73 0a 2a 2a 20 6c 62 6c 46 6c 75 73  dress.** lblFlus
aef0: 68 50 61 72 74 20 6f 6e 63 65 20 66 6f 72 20 65  hPart once for e
af00: 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20 77 69  ach partition wi
af10: 74 68 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  th the entire pa
af20: 72 74 69 74 69 6f 6e 20 63 61 63 68 65 64 20 69  rtition cached i
af30: 6e 0a 2a 2a 20 74 68 65 20 57 69 6e 64 6f 77 2e  n.** the Window.
af40: 69 45 70 68 43 73 72 20 74 65 6d 70 20 74 61 62  iEphCsr temp tab
af50: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
af60: 69 64 20 77 69 6e 64 6f 77 50 61 72 74 69 74 69  id windowPartiti
af70: 6f 6e 43 61 63 68 65 28 0a 20 20 50 61 72 73 65  onCache(.  Parse
af80: 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 65 6c 65   *pParse,.  Sele
af90: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
afb0: 68 65 20 72 65 77 72 69 74 74 65 6e 20 53 45 4c  he rewritten SEL
afc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
afd0: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
afe0: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
aff0: 20 20 20 2f 2a 20 57 68 65 72 65 49 6e 66 6f 20     /* WhereInfo 
b000: 74 6f 20 63 61 6c 6c 20 57 68 65 72 65 45 6e 64  to call WhereEnd
b010: 28 29 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  () on */.  int r
b020: 65 67 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20  egFlushPart,    
b030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b040: 67 69 73 74 65 72 20 74 6f 20 75 73 65 20 77 69  gister to use wi
b050: 74 68 20 47 6f 73 75 62 20 6c 62 6c 46 6c 75 73  th Gosub lblFlus
b060: 68 50 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  hPart */.  int l
b070: 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 20 20 20  blFlushPart,    
b080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
b090: 62 72 6f 75 74 69 6e 65 20 74 6f 20 47 6f 73 75  broutine to Gosu
b0a0: 62 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  b to */.  int *p
b0b0: 52 65 67 53 69 7a 65 20 20 20 20 20 20 20 20 20  RegSize         
b0c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
b0d0: 3a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  : Register conta
b0e0: 69 6e 69 6e 67 20 70 61 72 74 69 74 69 6f 6e 20  ining partition 
b0f0: 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e  size */.){.  Win
b100: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
b110: 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  pWin;.  Vdbe *v 
b120: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
b130: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
b140: 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70 53 72  iSubCsr = p->pSr
b150: 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  c->a[0].iCursor;
b160: 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d  .  int nSub = p-
b170: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
b180: 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6b 3b  ->nCol;.  int k;
b190: 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d 20 70 50  ..  int reg = pP
b1a0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
b1b0: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
b1c0: 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20  reg+nSub;.  int 
b1d0: 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67 52 65  regRowid = regRe
b1e0: 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70 52 65 67  cord+1;..  *pReg
b1f0: 53 69 7a 65 20 3d 20 72 65 67 52 6f 77 69 64 3b  Size = regRowid;
b200: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
b210: 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a 20 20  += nSub + 2;..  
b220: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f 6c 75  /* Load the colu
b230: 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  mn values for th
b240: 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64 20 62  e row returned b
b250: 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  y the sub-select
b260: 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 61 72  .  ** into an ar
b270: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
b280: 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65 67   starting at reg
b290: 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  . */.  for(k=0; 
b2a0: 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20  k<nSub; k++){.  
b2b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b2c0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
b2d0: 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65  , iSubCsr, k, re
b2e0: 67 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  g+k);.  }.  sqli
b2f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b300: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
b310: 72 65 67 2c 20 6e 53 75 62 2c 20 72 65 67 52 65  reg, nSub, regRe
b320: 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  cord);..  /* Che
b330: 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ck if this is th
b340: 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77  e start of a new
b350: 20 70 61 72 74 69 74 69 6f 6e 2e 20 49 66 20 73   partition. If s
b360: 6f 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  o, call the.  **
b370: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
b380: 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20 20 2a   sub-routine.  *
b390: 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  /.  if( pMWin->p
b3a0: 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20  Partition ){.   
b3b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45   int addr;.    E
b3c0: 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d  xprList *pPart =
b3d0: 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69   pMWin->pPartiti
b3e0: 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72  on;.    int nPar
b3f0: 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72  t = pPart->nExpr
b400: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77  ;.    int regNew
b410: 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57  Part = reg + pMW
b420: 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a  in->nBufferCol;.
b430: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
b440: 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
b450: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
b460: 73 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  st(pParse, pPart
b470: 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61 64  , 0, 0);..    ad
b480: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
b490: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
b4a0: 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74  pare, regNewPart
b4b0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
b4c0: 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  ,nPart);.    sql
b4d0: 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
b4e0: 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
b4f0: 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
b500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b510: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
b520: 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61 64 64 72  mp, addr+2, addr
b530: 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20  +4, addr+2);.   
b540: 20 56 64 62 65 43 6f 76 65 72 61 67 65 45 71 4e   VdbeCoverageEqN
b550: 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
b560: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b570: 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 61  P_Copy, regNewPa
b580: 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  rt, pMWin->regPa
b590: 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b 0a 20 20  rt, nPart-1);.  
b5a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b5b0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
b5c0: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c   regFlushPart, l
b5d0: 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20  blFlushPart);.  
b5e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
b5f0: 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f 70 61  , "call flush_pa
b600: 72 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20 7d 0a  rtition"));.  }.
b610: 0a 20 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65  .  /* Buffer the
b620: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20   current row in 
b630: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61  the ephemeral ta
b640: 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ble. */.  sqlite
b650: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b660: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69  P_NewRowid, pMWi
b670: 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52  n->iEphCsr, regR
b680: 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  owid);.  sqlite3
b690: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b6a0: 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e  _Insert, pMWin->
b6b0: 69 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f  iEphCsr, regReco
b6c0: 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a  rd, regRowid);..
b6d0: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
b6e0: 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
b6f0: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
b700: 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a 20 49  pWInfo);..  /* I
b710: 6e 76 6f 6b 65 20 22 66 6c 75 73 68 5f 70 61 72  nvoke "flush_par
b720: 74 69 74 69 6f 6e 22 20 74 6f 20 64 65 61 6c 20  tition" to deal 
b730: 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 28  with the final (
b740: 6f 72 20 6f 6e 6c 79 29 20 70 61 72 74 69 74 69  or only) partiti
b750: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  on */.  sqlite3V
b760: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b770: 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50  Gosub, regFlushP
b780: 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72  art, lblFlushPar
b790: 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  t);.  VdbeCommen
b7a0: 74 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73  t((v, "call flus
b7b0: 68 5f 70 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a  h_partition"));.
b7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
b7d0: 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e 65 20  the sub-routine 
b7e0: 61 74 20 72 65 67 47 6f 73 75 62 20 28 67 65 6e  at regGosub (gen
b7f0: 65 72 61 74 65 64 20 62 79 20 63 6f 64 65 20 69  erated by code i
b800: 6e 20 73 65 6c 65 63 74 2e 63 29 20 74 6f 0a 2a  n select.c) to.*
b810: 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  * return the cur
b820: 72 65 6e 74 20 72 6f 77 20 6f 66 20 57 69 6e 64  rent row of Wind
b830: 6f 77 2e 69 45 70 68 43 73 72 2e 20 49 66 20 61  ow.iEphCsr. If a
b840: 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ll window functi
b850: 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67 72 65  ons are.** aggre
b860: 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75 6e 63  gate window func
b870: 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 74  tions that use t
b880: 68 65 20 73 74 61 6e 64 61 72 64 20 41 50 49 2c  he standard API,
b890: 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f 50 5f   a single.** OP_
b8a0: 47 6f 73 75 62 20 69 6e 73 74 72 75 63 74 69 6f  Gosub instructio
b8b0: 6e 20 69 73 20 61 6c 6c 20 74 68 61 74 20 74 68  n is all that th
b8c0: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
b8d0: 61 74 65 73 2e 20 45 78 74 72 61 20 56 4d 20 63  ates. Extra VM c
b8e0: 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72 2d 72  ode.** for per-r
b8f0: 6f 77 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73  ow processing is
b900: 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20   only generated 
b910: 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  for the followin
b920: 67 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  g built-in windo
b930: 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  w.** functions:.
b940: 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61 6c 75  **.**   nth_valu
b950: 65 28 29 0a 2a 2a 20 20 20 66 69 72 73 74 5f 76  e().**   first_v
b960: 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61 67 28  alue().**   lag(
b970: 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a 2a 2f  ).**   lead().*/
b980: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
b990: 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28  dowReturnOneRow(
b9a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b9b0: 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69  ,.  Window *pMWi
b9c0: 6e 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  n,.  int regGosu
b9d0: 62 2c 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  b,.  int addrGos
b9e0: 75 62 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ub.){.  Vdbe *v 
b9f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
ba00: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
ba10: 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f 72 28  ow *pWin;.  for(
ba20: 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69 6e  pWin=pMWin; pWin
ba30: 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65  ; pWin=pWin->pNe
ba40: 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75 6e 63  xtWin){.    Func
ba50: 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70 57 69  Def *pFunc = pWi
ba60: 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 69 66  n->pFunc;.    if
ba70: 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFunc->zName==
ba80: 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20  nth_valueName.  
ba90: 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61     || pFunc->zNa
baa0: 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e  me==first_valueN
bab0: 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ame.    ){.     
bac0: 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69 6e 2d   int csr = pWin-
bad0: 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20 20 69  >csrApp;.      i
bae0: 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 33  nt lbl = sqlite3
baf0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
bb00: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74  arse);.      int
bb10: 20 74 6d 70 52 65 67 20 3d 20 73 71 6c 69 74 65   tmpReg = sqlite
bb20: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
bb30: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
bb40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bb50: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e  OP_Null, 0, pWin
bb60: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 0a 20  ->regResult);.. 
bb70: 20 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e       if( pFunc->
bb80: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
bb90: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
bba0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bbb0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
bbc0: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20  pMWin->iEphCsr, 
bbd0: 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c  pWin->iArgCol+1,
bbe0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 20  tmpReg);.       
bbf0: 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56   windowCheckIntV
bc00: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 74 6d 70  alue(pParse, tmp
bc10: 52 65 67 2c 20 32 29 3b 0a 20 20 20 20 20 20 7d  Reg, 2);.      }
bc20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
bc30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bc40: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
bc50: 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20  , tmpReg);.     
bc60: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
bc70: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
bc80: 5f 41 64 64 2c 20 74 6d 70 52 65 67 2c 20 70 57  _Add, tmpReg, pW
bc90: 69 6e 2d 3e 72 65 67 41 70 70 2c 20 74 6d 70 52  in->regApp, tmpR
bca0: 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
bcb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bcc0: 4f 50 5f 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67  OP_Gt, pWin->reg
bcd0: 41 70 70 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52  App+1, lbl, tmpR
bce0: 65 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  eg);.      VdbeC
bcf0: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
bd00: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
bd10: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bd20: 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63 73  OP_SeekRowid, cs
bd30: 72 2c 20 30 2c 20 74 6d 70 52 65 67 29 3b 0a 20  r, 0, tmpReg);. 
bd40: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
bd50: 65 4e 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a  eNeverTaken(v);.
bd60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bd70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
bd80: 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d  lumn, csr, pWin-
bd90: 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e  >iArgCol, pWin->
bda0: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
bdb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
bdc0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
bdd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bde0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
bdf0: 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a  Parse, tmpReg);.
be00: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
be10: 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  f( pFunc->zName=
be20: 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70 46 75  =leadName || pFu
be30: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61  nc->zName==lagNa
be40: 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  me ){.      int 
be50: 6e 41 72 67 20 3d 20 70 57 69 6e 2d 3e 70 4f 77  nArg = pWin->pOw
be60: 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  ner->x.pList->nE
be70: 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  xpr;.      int c
be80: 73 72 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70  sr = pWin->csrAp
be90: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c  p;.      int lbl
bea0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
beb0: 6b 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b  keLabel(pParse);
bec0: 0a 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52 65  .      int tmpRe
bed0: 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
bee0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
bef0: 20 20 20 20 20 69 6e 74 20 69 45 70 68 20 3d 20       int iEph = 
bf00: 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a  pMWin->iEphCsr;.
bf10: 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c  .      if( nArg<
bf20: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  3 ){.        sql
bf30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bf40: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
bf50: 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a  in->regResult);.
bf60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bf80: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
bf90: 75 6d 6e 2c 20 69 45 70 68 2c 20 70 57 69 6e 2d  umn, iEph, pWin-
bfa0: 3e 69 41 72 67 43 6f 6c 2b 32 2c 20 70 57 69 6e  >iArgCol+2, pWin
bfb0: 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
bfc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
bfd0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bfe0: 20 4f 50 5f 52 6f 77 69 64 2c 20 69 45 70 68 2c   OP_Rowid, iEph,
bff0: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
c000: 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
c010: 20 20 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20        int val = 
c020: 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c  (pFunc->zName==l
c030: 65 61 64 4e 61 6d 65 20 3f 20 31 20 3a 20 2d 31  eadName ? 1 : -1
c040: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c050: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
c060: 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 6d 70 52 65  OP_AddImm, tmpRe
c070: 67 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 7d  g, val);.      }
c080: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
c090: 74 20 6f 70 20 3d 20 28 70 46 75 6e 63 2d 3e 7a  t op = (pFunc->z
c0a0: 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 3f  Name==leadName ?
c0b0: 20 4f 50 5f 41 64 64 20 3a 20 4f 50 5f 53 75 62   OP_Add : OP_Sub
c0c0: 74 72 61 63 74 29 3b 0a 20 20 20 20 20 20 20 20  tract);.        
c0d0: 69 6e 74 20 74 6d 70 52 65 67 32 20 3d 20 73 71  int tmpReg2 = sq
c0e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
c0f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
c100: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c110: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
c120: 20 69 45 70 68 2c 20 70 57 69 6e 2d 3e 69 41 72   iEph, pWin->iAr
c130: 67 43 6f 6c 2b 31 2c 20 74 6d 70 52 65 67 32 29  gCol+1, tmpReg2)
c140: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c150: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f  3VdbeAddOp3(v, o
c160: 70 2c 20 74 6d 70 52 65 67 32 2c 20 74 6d 70 52  p, tmpReg2, tmpR
c170: 65 67 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  eg, tmpReg);.   
c180: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
c190: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
c1a0: 65 2c 20 74 6d 70 52 65 67 32 29 3b 0a 20 20 20  e, tmpReg2);.   
c1b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69     }..      sqli
c1c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c1d0: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 63   OP_SeekRowid, c
c1e0: 73 72 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29  sr, lbl, tmpReg)
c1f0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
c200: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
c210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c220: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63  (v, OP_Column, c
c230: 73 72 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f  sr, pWin->iArgCo
c240: 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75  l, pWin->regResu
c250: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
c260: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
c270: 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20 20 20  el(v, lbl);.    
c280: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
c290: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
c2a0: 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 7d 0a 20  tmpReg);.    }. 
c2b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
c2c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
c2d0: 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  ub, regGosub, ad
c2e0: 64 72 47 6f 73 75 62 29 3b 0a 7d 0a 0a 2f 2a 0a  drGosub);.}../*.
c2f0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 6f  ** Invoke the co
c300: 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
c310: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
c320: 6f 77 28 29 20 61 6e 64 2c 20 6f 70 74 69 6f 6e  ow() and, option
c330: 61 6c 6c 79 2c 20 74 68 65 0a 2a 2a 20 78 49 6e  ally, the.** xIn
c340: 76 65 72 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  verse() function
c350: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
c360: 20 66 75 6e 63 74 69 6f 6e 2c 20 66 6f 72 20 6f   function, for o
c370: 6e 65 20 6f 72 20 6d 6f 72 65 20 72 6f 77 73 0a  ne or more rows.
c380: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64  ** from the Wind
c390: 6f 77 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20  ow.iEphCsr temp 
c3a0: 74 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74  table. This rout
c3b0: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 4d  ine generates VM
c3c0: 20 63 6f 64 65 0a 2a 2a 20 73 69 6d 69 6c 61 72   code.** similar
c3d0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 77 68 69   to:.**.**   whi
c3e0: 6c 65 28 20 72 65 67 43 74 72 3e 30 20 29 7b 0a  le( regCtr>0 ){.
c3f0: 2a 2a 20 20 20 20 20 72 65 67 43 74 72 2d 2d 3b  **     regCtr--;
c400: 0a 2a 2a 20 20 20 20 20 77 69 6e 64 6f 77 52 65  .**     windowRe
c410: 74 75 72 6e 4f 6e 65 52 6f 77 28 29 0a 2a 2a 20  turnOneRow().** 
c420: 20 20 20 20 69 66 28 20 62 49 6e 76 65 72 73 65      if( bInverse
c430: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
c440: 49 6e 76 65 72 73 65 0a 2a 2a 20 20 20 20 20 7d  Inverse.**     }
c450: 0a 2a 2a 20 20 20 20 20 4e 65 78 74 20 28 57 69  .**     Next (Wi
c460: 6e 64 6f 77 2e 69 45 70 68 43 73 72 29 0a 2a 2a  ndow.iEphCsr).**
c470: 20 20 20 7d 0a 2a 2f 0a 73 74 61 74 69 63 20 76     }.*/.static v
c480: 6f 69 64 20 77 69 6e 64 6f 77 52 65 74 75 72 6e  oid windowReturn
c490: 52 6f 77 73 28 0a 20 20 50 61 72 73 65 20 2a 70  Rows(.  Parse *p
c4a0: 50 61 72 73 65 2c 0a 20 20 57 69 6e 64 6f 77 20  Parse,.  Window 
c4b0: 2a 70 4d 57 69 6e 2c 20 20 20 20 20 20 20 20 20  *pMWin,         
c4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
c4d0: 20 6f 66 20 77 69 6e 64 6f 77 20 66 75 6e 63 74   of window funct
c4e0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ions */.  int re
c4f0: 67 43 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  gCtr,           
c500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
c510: 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  ister containing
c520: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
c530: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75  */.  int regGosu
c540: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
c550: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
c560: 20 66 6f 72 20 47 6f 73 75 62 20 61 64 64 72 47   for Gosub addrG
c570: 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64  osub */.  int ad
c580: 64 72 47 6f 73 75 62 2c 20 20 20 20 20 20 20 20  drGosub,        
c590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
c5a0: 72 65 73 73 20 6f 66 20 73 75 62 2d 72 6f 75 74  ress of sub-rout
c5b0: 69 6e 65 20 66 6f 72 20 52 65 74 75 72 6e 4f 6e  ine for ReturnOn
c5c0: 65 52 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 72 65  eRow */.  int re
c5d0: 67 49 6e 76 41 72 67 2c 20 20 20 20 20 20 20 20  gInvArg,        
c5e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
c5f0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
c600: 66 6f 72 20 78 49 6e 76 65 72 73 65 20 61 72 67  for xInverse arg
c610: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 6e  s */.  int regIn
c620: 76 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  vSize           
c630: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
c640: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 69  er containing si
c650: 7a 65 20 6f 66 20 70 61 72 74 69 74 69 6f 6e 20  ze of partition 
c660: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  */.){.  int addr
c670: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  ;.  Vdbe *v = sq
c680: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
c690: 72 73 65 29 3b 0a 20 20 77 69 6e 64 6f 77 41 67  rse);.  windowAg
c6a0: 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
c6b0: 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 61 64 64 72  MWin, 0);.  addr
c6c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c6d0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
c6e0: 2c 20 72 65 67 43 74 72 2c 20 73 71 6c 69 74 65  , regCtr, sqlite
c6f0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
c700: 28 76 29 2b 32 20 2c 31 29 3b 0a 20 20 56 64 62  (v)+2 ,1);.  Vdb
c710: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
c720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c730: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
c740: 20 30 29 3b 0a 20 20 77 69 6e 64 6f 77 52 65 74   0);.  windowRet
c750: 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65  urnOneRow(pParse
c760: 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75  , pMWin, regGosu
c770: 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
c780: 20 69 66 28 20 72 65 67 49 6e 76 41 72 67 20 29   if( regInvArg )
c790: 7b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53  {.    windowAggS
c7a0: 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
c7b0: 6e 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  n, pMWin->iEphCs
c7c0: 72 2c 20 31 2c 20 72 65 67 49 6e 76 41 72 67 2c  r, 1, regInvArg,
c7d0: 20 72 65 67 49 6e 76 53 69 7a 65 29 3b 0a 20 20   regInvSize);.  
c7e0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
c7f0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
c800: 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
c810: 2c 20 61 64 64 72 29 3b 0a 20 20 56 64 62 65 43  , addr);.  VdbeC
c820: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
c830: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
c840: 65 28 76 2c 20 61 64 64 72 2b 31 29 3b 20 20 20  e(v, addr+1);   
c850: 2f 2a 20 54 68 65 20 4f 50 5f 47 6f 74 6f 20 2a  /* The OP_Goto *
c860: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  /.}../*.** Gener
c870: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 65 74 20  ate code to set 
c880: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
c890: 72 65 67 69 73 74 65 72 20 66 6f 72 20 65 61 63  register for eac
c8a0: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
c8b0: 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 6c 69 6e 6b  n.** in the link
c8c0: 65 64 20 6c 69 73 74 20 70 61 73 73 65 64 20 61  ed list passed a
c8d0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
c8e0: 75 6d 65 6e 74 20 74 6f 20 4e 55 4c 4c 2e 20 41  ument to NULL. A
c8f0: 6e 64 20 70 65 72 66 6f 72 6d 0a 2a 2a 20 61 6e  nd perform.** an
c900: 79 20 65 71 75 69 76 61 6c 65 6e 74 20 69 6e 69  y equivalent ini
c910: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 72 65 71 75  tialization requ
c920: 69 72 65 64 20 62 79 20 61 6e 79 20 62 75 69 6c  ired by any buil
c930: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
c940: 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  tions.** in the 
c950: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
c960: 69 6e 74 20 77 69 6e 64 6f 77 49 6e 69 74 41 63  int windowInitAc
c970: 63 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73  cum(Parse *pPars
c980: 65 2c 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  e, Window *pMWin
c990: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
c9a0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c9b0: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67  arse);.  int reg
c9c0: 41 72 67 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  Arg;.  int nArg 
c9d0: 3d 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  = 0;.  Window *p
c9e0: 57 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d  Win;.  for(pWin=
c9f0: 70 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69  pMWin; pWin; pWi
ca00: 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
ca10: 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a  ){.    FuncDef *
ca20: 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46  pFunc = pWin->pF
ca30: 75 6e 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  unc;.    sqlite3
ca40: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
ca50: 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e  _Null, 0, pWin->
ca60: 72 65 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 6e  regAccum);.    n
ca70: 41 72 67 20 3d 20 4d 41 58 28 6e 41 72 67 2c 20  Arg = MAX(nArg, 
ca80: 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28 70  windowArgCount(p
ca90: 57 69 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 70  Win));.    if( p
caa0: 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68  Func->zName==nth
cab0: 5f 76 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 20  _valueName.     
cac0: 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  || pFunc->zName=
cad0: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
cae0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
caf0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
cb00: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
cb10: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 29 3b  , pWin->regApp);
cb20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
cb30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
cb40: 6e 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d  nteger, 0, pWin-
cb50: 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20  >regApp+1);.    
cb60: 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 46 75 6e  }..    if( (pFun
cb70: 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  c->funcFlags & S
cb80: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
cb90: 58 29 20 26 26 20 70 57 69 6e 2d 3e 63 73 72 41  X) && pWin->csrA
cba0: 70 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pp ){.      asse
cbb0: 72 74 28 20 70 57 69 6e 2d 3e 65 53 74 61 72 74  rt( pWin->eStart
cbc0: 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  !=TK_UNBOUNDED )
cbd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cbe0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
cbf0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57 69  ResetSorter, pWi
cc00: 6e 2d 3e 63 73 72 41 70 70 29 3b 0a 20 20 20 20  n->csrApp);.    
cc10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cc20: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
cc30: 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  r, 0, pWin->regA
cc40: 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pp+1);.    }.  }
cc50: 0a 20 20 72 65 67 41 72 67 20 3d 20 70 50 61 72  .  regArg = pPar
cc60: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 70 50  se->nMem+1;.  pP
cc70: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 41  arse->nMem += nA
cc80: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67  rg;.  return reg
cc90: 41 72 67 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  Arg;.}.../*.** T
cca0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
ccb0: 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 71  s the work of sq
ccc0: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53  lite3WindowCodeS
ccd0: 74 65 70 28 29 20 66 6f 72 20 61 6c 6c 20 22 52  tep() for all "R
cce0: 4f 57 53 22 0a 2a 2a 20 77 69 6e 64 6f 77 20 66  OWS".** window f
ccf0: 72 61 6d 65 20 74 79 70 65 73 20 65 78 63 65 70  rame types excep
cd00: 74 20 66 6f 72 20 22 42 45 54 57 45 45 4e 20 55  t for "BETWEEN U
cd10: 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
cd20: 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 0a 2a  NG AND CURRENT.*
cd30: 2a 20 52 4f 57 22 2e 20 50 73 65 75 64 6f 2d 63  * ROW". Pseudo-c
cd40: 6f 64 65 20 66 6f 72 20 65 61 63 68 20 66 6f 6c  ode for each fol
cd50: 6c 6f 77 73 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53  lows..**.** ROWS
cd60: 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72 31 3e   BETWEEN <expr1>
cd70: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 3c   PRECEDING AND <
cd80: 65 78 70 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr2> FOLLOWING
cd90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 0a 2a  .**.**     ....*
cda0: 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20  *       if( new 
cdb0: 70 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20  partition ){.** 
cdc0: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 66 6c          Gosub fl
cdd0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a  ush_partition.**
cde0: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
cdf0: 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64    Insert (record
ce00: 20 69 6e 20 65 70 68 2d 74 61 62 6c 65 29 0a 2a   in eph-table).*
ce10: 2a 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  *     sqlite3Whe
ce20: 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 47  reEnd().**     G
ce30: 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74 69  osub flush_parti
ce40: 74 69 6f 6e 0a 2a 2a 20 20 0a 2a 2a 20 20 20 66  tion.**  .**   f
ce50: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a  lush_partition:.
ce60: 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a  **     Once {.**
ce70: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
ce80: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 53 74  iEphCsr -> csrSt
ce90: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 4f 70  art).**       Op
cea0: 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20 2d  enDup (iEphCsr -
ceb0: 3e 20 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20  > csrEnd).**    
cec0: 20 7d 0a 2a 2a 20 20 20 20 20 72 65 67 53 74 61   }.**     regSta
ced0: 72 74 20 3d 20 3c 65 78 70 72 31 3e 20 20 20 20  rt = <expr1>    
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 50              // P
cef0: 52 45 43 45 44 49 4e 47 20 65 78 70 72 65 73 73  RECEDING express
cf00: 69 6f 6e 0a 2a 2a 20 20 20 20 20 72 65 67 45 6e  ion.**     regEn
cf10: 64 20 3d 20 3c 65 78 70 72 32 3e 20 20 20 20 20  d = <expr2>     
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
cf30: 46 4f 4c 4c 4f 57 49 4e 47 20 65 78 70 72 65 73  FOLLOWING expres
cf40: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 69 66 28 20  sion.**     if( 
cf50: 72 65 67 53 74 61 72 74 3c 30 20 7c 7c 20 72 65  regStart<0 || re
cf60: 67 45 6e 64 3c 30 20 29 7b 20 65 72 72 6f 72 21  gEnd<0 ){ error!
cf70: 20 7d 0a 2a 2a 20 20 20 20 20 52 65 77 69 6e 64   }.**     Rewind
cf80: 20 28 63 73 72 2c 63 73 72 53 74 61 72 74 2c 63   (csr,csrStart,c
cf90: 73 72 45 6e 64 29 20 20 20 20 20 20 2f 2f 20 69  srEnd)      // i
cfa0: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
cfb0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
cfc0: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 28 63 73  **       Next(cs
cfd0: 72 45 6e 64 29 20 20 20 20 20 20 20 20 20 20 20  rEnd)           
cfe0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
cff0: 4f 46 20 73 6b 69 70 20 41 67 67 73 74 65 70 0a  OF skip Aggstep.
d000: 2a 2a 20 20 20 20 20 20 20 41 67 67 73 74 65 70  **       Aggstep
d010: 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20   (csrEnd).**    
d020: 20 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d     if( (regEnd--
d030: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
d040: 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61     AggFinal (xVa
d050: 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  lue).**         
d060: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
d070: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
d080: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
d090: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
d0a0: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
d0b0: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  on_done.**      
d0c0: 20 20 20 69 66 28 20 28 72 65 67 53 74 61 72 74     if( (regStart
d0d0: 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20  --)<=0 ){.**    
d0e0: 20 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73         AggInvers
d0f0: 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  e (csrStart).** 
d100: 20 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63            Next(c
d110: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
d120: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 7d      }.**       }
d130: 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74  .**   flush_part
d140: 69 74 69 6f 6e 5f 64 6f 6e 65 3a 0a 2a 2a 20 20  ition_done:.**  
d150: 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 28     ResetSorter (
d160: 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75  csr).**     Retu
d170: 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  rn.**.** ROWS BE
d180: 54 57 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45  TWEEN <expr> PRE
d190: 43 45 44 49 4e 47 20 20 20 20 41 4e 44 20 43 55  CEDING    AND CU
d1a0: 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 20 52 4f 57  RRENT ROW.** ROW
d1b0: 53 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  S BETWEEN CURREN
d1c0: 54 20 52 4f 57 20 20 20 20 20 20 20 20 20 41 4e  T ROW         AN
d1d0: 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49  D <expr> FOLLOWI
d1e0: 4e 47 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  NG.** ROWS BETWE
d1f0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
d200: 43 45 44 49 4e 47 20 41 4e 44 20 3c 65 78 70 72  CEDING AND <expr
d210: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  > FOLLOWING.**.*
d220: 2a 20 20 20 54 68 65 73 65 20 61 72 65 20 73 69  *   These are si
d230: 6d 69 6c 61 72 20 74 6f 20 74 68 65 20 61 62 6f  milar to the abo
d240: 76 65 2e 20 46 6f 72 20 22 43 55 52 52 45 4e 54  ve. For "CURRENT
d250: 20 52 4f 57 22 2c 20 69 6e 74 69 61 6c 69 7a 65   ROW", intialize
d260: 20 74 68 65 0a 2a 2a 20 20 20 72 65 67 69 73 74   the.**   regist
d270: 65 72 20 74 6f 20 30 2e 20 46 6f 72 20 22 55 4e  er to 0. For "UN
d280: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
d290: 47 22 20 74 6f 20 69 6e 66 69 6e 69 74 79 2e 0a  G" to infinity..
d2a0: 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
d2b0: 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45 44  EN <expr> PRECED
d2c0: 49 4e 47 20 20 20 20 41 4e 44 20 55 4e 42 4f 55  ING    AND UNBOU
d2d0: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
d2e0: 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 43  * ROWS BETWEEN C
d2f0: 55 52 52 45 4e 54 20 52 4f 57 20 20 20 20 20 20  URRENT ROW      
d300: 20 20 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44     AND UNBOUNDED
d310: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a   FOLLOWING.**.**
d320: 20 20 20 20 20 52 65 77 69 6e 64 20 28 63 73 72       Rewind (csr
d330: 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64  ,csrStart,csrEnd
d340: 29 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67  )    // if EOF g
d350: 6f 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74  oto flush_partit
d360: 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20  ion_done.**     
d370: 77 68 69 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20  while( 1 ){.**  
d380: 20 20 20 20 20 4e 65 78 74 28 63 73 72 45 6e 64       Next(csrEnd
d390: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
d3a0: 20 20 20 2f 2f 20 45 78 69 74 20 77 68 69 6c 65     // Exit while
d3b0: 28 31 29 20 61 74 20 45 4f 46 0a 2a 2a 20 20 20  (1) at EOF.**   
d3c0: 20 20 20 20 41 67 67 73 74 65 70 20 28 63 73 72      Aggstep (csr
d3d0: 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a  End).**     }.**
d3e0: 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b       while( 1 ){
d3f0: 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e  .**       AggFin
d400: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
d410: 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47       Gosub addrG
d420: 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65  osub.**       Ne
d430: 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20 20  xt(csr)         
d440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
d450: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
d460: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
d470: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65  **       if( (re
d480: 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a  gStart--)<=0 ){.
d490: 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 49 6e  **         AggIn
d4a0: 76 65 72 73 65 20 28 63 73 72 53 74 61 72 74 29  verse (csrStart)
d4b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74  .**         Next
d4c0: 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
d4d0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d 0a 2a      }.**     }.*
d4e0: 2a 0a 2a 2a 20 20 20 46 6f 72 20 74 68 65 20 22  *.**   For the "
d4f0: 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20  CURRENT ROW AND 
d500: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
d510: 49 4e 47 22 20 63 61 73 65 2c 20 74 68 65 20 66  ING" case, the f
d520: 69 6e 61 6c 20 69 66 28 29 20 0a 2a 2a 20 20 20  inal if() .**   
d530: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 61 6c 77  condition is alw
d540: 61 79 73 20 74 72 75 65 20 28 61 73 20 69 66 20  ays true (as if 
d550: 72 65 67 53 74 61 72 74 20 77 65 72 65 20 69 6e  regStart were in
d560: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 30 29 2e  itialized to 0).
d570: 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54  .**.** RANGE BET
d580: 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
d590: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
d5a0: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 0a 2a 2a 20  OLLOWING.** .** 
d5b0: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e    This is the on
d5c0: 6c 79 20 52 41 4e 47 45 20 63 61 73 65 20 68 61  ly RANGE case ha
d5d0: 6e 64 6c 65 64 20 62 79 20 74 68 69 73 20 72 6f  ndled by this ro
d5e0: 75 74 69 6e 65 2e 20 49 74 20 6d 6f 64 69 66 69  utine. It modifi
d5f0: 65 73 20 74 68 65 0a 2a 2a 20 20 20 73 65 63 6f  es the.**   seco
d600: 6e 64 20 77 68 69 6c 65 28 20 31 20 29 20 6c 6f  nd while( 1 ) lo
d610: 6f 70 20 69 6e 20 22 52 4f 57 53 20 42 45 54 57  op in "ROWS BETW
d620: 45 45 4e 20 43 55 52 52 45 4e 54 20 2e 2e 2e 20  EEN CURRENT ... 
d630: 55 4e 42 4f 55 4e 44 45 44 2e 2e 2e 22 20 74 6f  UNBOUNDED..." to
d640: 0a 2a 2a 20 20 20 62 65 3a 0a 2a 2a 0a 2a 2a 20  .**   be:.**.** 
d650: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
d660: 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61  **       AggFina
d670: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
d680: 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
d690: 2a 2a 20 20 20 20 20 20 20 20 20 72 65 67 50 65  **         regPe
d6a0: 65 72 2b 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  er++.**         
d6b0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
d6c0: 2a 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28  **         Next(
d6d0: 63 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20  csr)            
d6e0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
d6f0: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
d700: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
d710: 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 20          if( new 
d720: 70 65 65 72 20 29 20 62 72 65 61 6b 3b 0a 2a 2a  peer ) break;.**
d730: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20         }.**     
d740: 20 20 77 68 69 6c 65 28 20 28 72 65 67 50 65 65    while( (regPee
d750: 72 2d 2d 29 3e 30 20 29 7b 0a 2a 2a 20 20 20 20  r--)>0 ){.**    
d760: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20       AggInverse 
d770: 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20  (csrStart).**   
d780: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 53 74        Next(csrSt
d790: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  art).**       }.
d7a0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52  **     }.**.** R
d7b0: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
d7c0: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 20 20 20  r> FOLLOWING    
d7d0: 41 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  AND <expr> FOLLO
d7e0: 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 72 65 67  WING.**.**   reg
d7f0: 45 6e 64 20 3d 20 72 65 67 45 6e 64 20 2d 20 72  End = regEnd - r
d800: 65 67 53 74 61 72 74 0a 2a 2a 20 20 20 52 65 77  egStart.**   Rew
d810: 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72  ind (csr,csrStar
d820: 74 2c 63 73 72 45 6e 64 29 20 20 20 2f 2f 20 69  t,csrEnd)   // i
d830: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
d840: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
d850: 2a 2a 20 20 20 20 20 41 67 67 73 74 65 70 20 28  **     Aggstep (
d860: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 4e  csrEnd).**     N
d870: 65 78 74 28 63 73 72 45 6e 64 29 20 20 20 20 20  ext(csrEnd)     
d880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
d890: 66 20 45 4f 46 20 66 61 6c 6c 2d 74 68 72 6f 75  f EOF fall-throu
d8a0: 67 68 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72  gh.**     if( (r
d8b0: 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  egEnd--)<=0 ){.*
d8c0: 2a 20 20 20 20 20 20 20 69 66 28 20 28 72 65 67  *       if( (reg
d8d0: 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a  Start--)<=0 ){.*
d8e0: 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e  *         AggFin
d8f0: 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20  al (xValue).**  
d900: 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
d910: 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
d920: 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20 20    Next(csr)     
d930: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 45           // if E
d940: 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70 61  OF goto flush_pa
d950: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20  rtition_done.** 
d960: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
d970: 20 41 67 67 49 6e 76 65 72 73 65 20 28 63 73 72   AggInverse (csr
d980: 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20  Start).**       
d990: 4e 65 78 74 20 28 63 73 72 53 74 61 72 74 29 0a  Next (csrStart).
d9a0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 52  **     }.**.** R
d9b0: 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70  OWS BETWEEN <exp
d9c0: 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20  r> PRECEDING    
d9d0: 41 4e 44 20 3c 65 78 70 72 3e 20 50 52 45 43 45  AND <expr> PRECE
d9e0: 44 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 52 65 70  DING.**.**   Rep
d9f0: 6c 61 63 65 20 74 68 65 20 62 69 74 20 61 66 74  lace the bit aft
da00: 65 72 20 22 52 65 77 69 6e 64 22 20 69 6e 20 74  er "Rewind" in t
da10: 68 65 20 61 62 6f 76 65 20 77 69 74 68 3a 0a 2a  he above with:.*
da20: 2a 0a 2a 2a 20 20 20 20 20 69 66 28 20 28 72 65  *.**     if( (re
da30: 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a  gEnd--)<=0 ){.**
da40: 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20 28         AggStep (
da50: 63 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 20  csrEnd).**      
da60: 20 4e 65 78 74 20 28 63 73 72 45 6e 64 29 0a 2a   Next (csrEnd).*
da70: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 41  *     }.**     A
da80: 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65 29  ggFinal (xValue)
da90: 0a 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 61 64  .**     Gosub ad
daa0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 4e  drGosub.**     N
dab0: 65 78 74 28 63 73 72 29 20 20 20 20 20 20 20 20  ext(csr)        
dac0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20            // if 
dad0: 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68 5f 70  EOF goto flush_p
dae0: 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a 2a 2a  artition_done.**
daf0: 20 20 20 20 20 69 66 28 20 28 72 65 67 53 74 61       if( (regSta
db00: 72 74 2d 2d 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20  rt--)<=0 ){.**  
db10: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 20       AggInverse 
db20: 28 63 73 72 32 29 0a 2a 2a 20 20 20 20 20 20 20  (csr2).**       
db30: 4e 65 78 74 20 28 63 73 72 32 29 0a 2a 2a 20 20  Next (csr2).**  
db40: 20 20 20 7d 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69     }.**.*/.stati
db50: 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43 6f 64  c void windowCod
db60: 65 52 6f 77 45 78 70 72 53 74 65 70 28 0a 20 20  eRowExprStep(.  
db70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
db80: 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20 20 57    Select *p,.  W
db90: 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
dba0: 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73 75 62  ,.  int regGosub
dbb0: 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47 6f 73  , .  int addrGos
dbc0: 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a  ub.){.  Window *
dbd0: 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
dbe0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
dbf0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
dc00: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 46 6c  se);.  int regFl
dc10: 75 73 68 50 61 72 74 3b 20 20 20 20 20 20 20 20  ushPart;        
dc20: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
dc30: 65 72 20 66 6f 72 20 22 47 6f 73 75 62 20 66 6c  er for "Gosub fl
dc40: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 2a  ush_partition" *
dc50: 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68  /.  int lblFlush
dc60: 50 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  Part;           
dc70: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
dc80: 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61   "Gosub flush_pa
dc90: 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e  rtition" */.  in
dca0: 74 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 3b 20  t lblFlushDone; 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcc0: 20 4c 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75   Label for "Gosu
dcd0: 62 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f  b flush_partitio
dce0: 6e 5f 64 6f 6e 65 22 20 2a 2f 0a 0a 20 20 69 6e  n_done" */..  in
dcf0: 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e 74 20  t regArg;.  int 
dd00: 61 64 64 72 3b 0a 20 20 69 6e 74 20 63 73 72 53  addr;.  int csrS
dd10: 74 61 72 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tart = pParse->n
dd20: 54 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 63 73 72  Tab++;.  int csr
dd30: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  End = pParse->nT
dd40: 61 62 2b 2b 3b 0a 20 20 69 6e 74 20 72 65 67 53  ab++;.  int regS
dd50: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
dd70: 65 20 6f 66 20 3c 65 78 70 72 3e 20 50 52 45 43  e of <expr> PREC
dd80: 45 44 49 4e 47 20 2a 2f 0a 20 20 69 6e 74 20 72  EDING */.  int r
dd90: 65 67 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  egEnd;          
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
ddb0: 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e 20 46  alue of <expr> F
ddc0: 4f 4c 4c 4f 57 49 4e 47 20 2a 2f 0a 20 20 69 6e  OLLOWING */.  in
ddd0: 74 20 61 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e  t addrGoto;.  in
dde0: 74 20 61 64 64 72 54 6f 70 3b 0a 20 20 69 6e 74  t addrTop;.  int
ddf0: 20 61 64 64 72 49 66 50 6f 73 31 20 3d 20 30 3b   addrIfPos1 = 0;
de00: 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50 6f 73  .  int addrIfPos
de10: 32 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67  2 = 0;.  int reg
de20: 53 69 7a 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Size = 0;..  ass
de30: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61  ert( pMWin->eSta
de40: 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  rt==TK_PRECEDING
de50: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
de60: 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  n->eStart==TK_CU
de70: 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c 7c  RRENT .       ||
de80: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
de90: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20 20  TK_FOLLOWING .  
dea0: 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65       || pMWin->e
deb0: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
dec0: 44 45 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65  DED .  );.  asse
ded0: 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  rt( pMWin->eEnd=
dee0: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 0a 20  =TK_FOLLOWING . 
def0: 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
df00: 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  eEnd==TK_CURRENT
df10: 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d 57 69   .       || pMWi
df20: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f  n->eEnd==TK_UNBO
df30: 55 4e 44 45 44 20 0a 20 20 20 20 20 20 20 7c 7c  UNDED .       ||
df40: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
df50: 5f 50 52 45 43 45 44 49 4e 47 20 0a 20 20 29 3b  _PRECEDING .  );
df60: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
df70: 72 65 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62  register and lab
df80: 65 6c 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73  el for the "flus
df90: 68 5f 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62  h_partition" sub
dfa0: 2d 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72  -routine. */.  r
dfb0: 65 67 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b  egFlushPart = ++
dfc0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
dfd0: 6c 62 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73  lblFlushPart = s
dfe0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
dff0: 62 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 6c  bel(pParse);.  l
e000: 62 6c 46 6c 75 73 68 44 6f 6e 65 20 3d 20 73 71  blFlushDone = sq
e010: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
e020: 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72  el(pParse);..  r
e030: 65 67 53 74 61 72 74 20 3d 20 2b 2b 70 50 61 72  egStart = ++pPar
e040: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45  se->nMem;.  regE
e050: 6e 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nd = ++pParse->n
e060: 4d 65 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61  Mem;..  windowPa
e070: 72 74 69 74 69 6f 6e 43 61 63 68 65 28 70 50 61  rtitionCache(pPa
e080: 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20  rse, p, pWInfo, 
e090: 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62  regFlushPart, lb
e0a0: 6c 46 6c 75 73 68 50 61 72 74 2c 20 26 72 65 67  lFlushPart, &reg
e0b0: 53 69 7a 65 29 3b 0a 0a 20 20 61 64 64 72 47 6f  Size);..  addrGo
e0c0: 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
e0d0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
e0e0: 6f 29 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20  o);..  /* Start 
e0f0: 6f 66 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74  of "flush_partit
e100: 69 6f 6e 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ion" */.  sqlite
e110: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
e120: 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72  l(v, lblFlushPar
e130: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  t);.  sqlite3Vdb
e140: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e  eAddOp2(v, OP_On
e150: 63 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64  ce, 0, sqlite3Vd
e160: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
e170: 2b 33 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  +3);.  VdbeCover
e180: 61 67 65 28 76 29 3b 0a 20 20 56 64 62 65 43 6f  age(v);.  VdbeCo
e190: 6d 6d 65 6e 74 28 28 76 2c 20 22 46 6c 75 73 68  mment((v, "Flush
e1a0: 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62 72 6f  _partition subro
e1b0: 75 74 69 6e 65 22 29 29 3b 0a 20 20 73 71 6c 69  utine"));.  sqli
e1c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e1d0: 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72   OP_OpenDup, csr
e1e0: 53 74 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45  Start, pMWin->iE
e1f0: 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65  phCsr);.  sqlite
e200: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e210: 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e  P_OpenDup, csrEn
e220: 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  d, pMWin->iEphCs
e230: 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74  r);..  /* If eit
e240: 68 65 72 20 72 65 67 53 74 61 72 74 20 6f 72 20  her regStart or 
e250: 72 65 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e  regEnd are not n
e260: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
e270: 67 65 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a  gers, throw .  *
e280: 2a 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20  * an exception. 
e290: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
e2a0: 3e 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73  >pStart ){.    s
e2b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
e2c0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53  Parse, pMWin->pS
e2d0: 74 61 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b  tart, regStart);
e2e0: 0a 20 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b  .    windowCheck
e2f0: 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  IntValue(pParse,
e300: 20 72 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20   regStart, 0);. 
e310: 20 7d 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e   }.  if( pMWin->
e320: 70 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  pEnd ){.    sqli
e330: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e340: 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c  se, pMWin->pEnd,
e350: 20 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69   regEnd);.    wi
e360: 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75  ndowCheckIntValu
e370: 65 28 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64  e(pParse, regEnd
e380: 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 1);.  }..  /* 
e390: 49 66 20 74 68 69 73 20 69 73 20 22 52 4f 57 53  If this is "ROWS
e3a0: 20 3c 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49   <expr1> FOLLOWI
e3b0: 4e 47 20 41 4e 44 20 52 4f 57 53 20 3c 65 78 70  NG AND ROWS <exp
e3c0: 72 32 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2c 20  r2> FOLLOWING", 
e3d0: 64 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  do:.  **.  **   
e3e0: 69 66 28 20 72 65 67 45 6e 64 3c 72 65 67 53 74  if( regEnd<regSt
e3f0: 61 72 74 20 29 7b 0a 20 20 2a 2a 20 20 20 20 20  art ){.  **     
e400: 2f 2f 20 54 68 65 20 66 72 61 6d 65 20 61 6c 77  // The frame alw
e410: 61 79 73 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ays consists of 
e420: 30 20 72 6f 77 73 0a 20 20 2a 2a 20 20 20 20 20  0 rows.  **     
e430: 72 65 67 53 74 61 72 74 20 3d 20 72 65 67 53 69  regStart = regSi
e440: 7a 65 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20 20 2a  ze;.  **   }.  *
e450: 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67  *   regEnd = reg
e460: 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74 3b 0a  End - regStart;.
e470: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e    */.  if( pMWin
e480: 2d 3e 70 45 6e 64 20 26 26 20 70 4d 57 69 6e 2d  ->pEnd && pMWin-
e490: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
e4a0: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73  OWING ){.    ass
e4b0: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61  ert( pMWin->pSta
e4c0: 72 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rt!=0 );.    ass
e4d0: 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  ert( pMWin->eEnd
e4e0: 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29  ==TK_FOLLOWING )
e4f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e500: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65  eAddOp3(v, OP_Ge
e510: 2c 20 72 65 67 53 74 61 72 74 2c 20 73 71 6c 69  , regStart, sqli
e520: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e530: 64 72 28 76 29 2b 32 2c 20 72 65 67 45 6e 64 29  dr(v)+2, regEnd)
e540: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
e550: 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a  geNeverNull(v);.
e560: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e570: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
e580: 2c 20 72 65 67 53 69 7a 65 2c 20 72 65 67 53 74  , regSize, regSt
e590: 61 72 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  art);.    sqlite
e5a0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
e5b0: 50 5f 53 75 62 74 72 61 63 74 2c 20 72 65 67 53  P_Subtract, regS
e5c0: 74 61 72 74 2c 20 72 65 67 45 6e 64 2c 20 72 65  tart, regEnd, re
e5d0: 67 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  gEnd);.  }..  if
e5e0: 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 20  ( pMWin->pStart 
e5f0: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
e600: 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a  TK_PRECEDING ){.
e610: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69      assert( pMWi
e620: 6e 2d 3e 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20  n->pEnd!=0 );.  
e630: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
e640: 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43  >eStart==TK_PREC
e650: 45 44 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c  EDING );.    sql
e660: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e670: 2c 20 4f 50 5f 4c 65 2c 20 72 65 67 53 74 61 72  , OP_Le, regStar
e680: 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
e690: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 2c 20  rrentAddr(v)+3, 
e6a0: 72 65 67 45 6e 64 29 3b 0a 20 20 20 20 56 64 62  regEnd);.    Vdb
e6b0: 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75  eCoverageNeverNu
e6c0: 6c 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ll(v);.    sqlit
e6d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e6e0: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65  OP_Copy, regSize
e6f0: 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20  , regStart);.   
e700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e710: 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
e720: 65 67 53 69 7a 65 2c 20 72 65 67 45 6e 64 29 3b  egSize, regEnd);
e730: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
e740: 61 6c 69 7a 65 20 74 68 65 20 61 63 63 75 6d 75  alize the accumu
e750: 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 20 66  lator register f
e760: 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  or each window f
e770: 75 6e 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20  unction to NULL 
e780: 2a 2f 0a 20 20 72 65 67 41 72 67 20 3d 20 77 69  */.  regArg = wi
e790: 6e 64 6f 77 49 6e 69 74 41 63 63 75 6d 28 70 50  ndowInitAccum(pP
e7a0: 61 72 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20  arse, pMWin);.. 
e7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e7c0: 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
e7d0: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
e7e0: 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a   lblFlushDone);.
e7f0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
e800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
e810: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
e820: 69 6e 64 2c 20 63 73 72 53 74 61 72 74 2c 20 6c  ind, csrStart, l
e830: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
e840: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
e850: 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c  rTaken(v);.  sql
e860: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
e870: 28 76 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  (v, 1);.  sqlite
e880: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e890: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 45 6e 64  P_Rewind, csrEnd
e8a0: 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b  , lblFlushDone);
e8b0: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
e8c0: 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20  everTaken(v);.  
e8d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e8e0: 65 50 35 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a  eP5(v, 1);..  /*
e8f0: 20 49 6e 76 6f 6b 65 20 41 67 67 53 74 65 70 20   Invoke AggStep 
e900: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
e910: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
e920: 6e 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77 20  n using the row 
e930: 74 68 61 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64  that.  ** csrEnd
e940: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
e950: 73 20 74 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72  s to. Or, if csr
e960: 45 6e 64 20 69 73 20 61 6c 72 65 61 64 79 20 61  End is already a
e970: 74 20 45 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e  t EOF,.  ** do n
e980: 6f 74 68 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64  othing.  */.  ad
e990: 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
e9a0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
e9b0: 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  );.  if( pMWin->
e9c0: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
e9d0: 4e 47 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66  NG ){.    addrIf
e9e0: 50 6f 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64  Pos1 = sqlite3Vd
e9f0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
ea00: 66 50 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20  fPos, regEnd, 0 
ea10: 2c 20 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  , 1);.    VdbeCo
ea20: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20  verage(v);.  }. 
ea30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ea40: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
ea50: 73 72 45 6e 64 2c 20 73 71 6c 69 74 65 33 56 64  srEnd, sqlite3Vd
ea60: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ea70: 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  +2);.  VdbeCover
ea80: 61 67 65 28 76 29 3b 0a 20 20 61 64 64 72 20 3d  age(v);.  addr =
ea90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eaa0: 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a  p0(v, OP_Goto);.
eab0: 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
eac0: 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
ead0: 73 72 45 6e 64 2c 20 30 2c 20 72 65 67 41 72 67  srEnd, 0, regArg
eae0: 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 69 66  , regSize);.  if
eaf0: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
eb00: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
eb10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eb20: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
eb30: 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
eb40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
eb50: 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
eb60: 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
eb70: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
eb80: 41 64 64 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65  Addr(v);.  }else
eb90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
eba0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
ebb0: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69  r);.    if( pMWi
ebc0: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43  n->eEnd==TK_PREC
ebd0: 45 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73  EDING ){.      s
ebe0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
ebf0: 72 65 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31  re(v, addrIfPos1
ec00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
ec10: 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
ec20: 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b  =TK_FOLLOWING ){
ec30: 0a 20 20 20 20 61 64 64 72 49 66 50 6f 73 31 20  .    addrIfPos1 
ec40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ec50: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
ec60: 20 72 65 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b   regEnd, 0 , 1);
ec70: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
ec80: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
ec90: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
eca0: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
ecb0: 20 20 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20     addrIfPos2 = 
ecc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ecd0: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
ece0: 65 67 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b  egStart, 0 , 1);
ecf0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
ed00: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 64  e(v);.  }.  wind
ed10: 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73  owAggFinal(pPars
ed20: 65 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20  e, pMWin, 0);.  
ed30: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
ed40: 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ow(pParse, pMWin
ed50: 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
ed60: 47 6f 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65  Gosub);.  sqlite
ed70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ed80: 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69  P_Next, pMWin->i
ed90: 45 70 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56  EphCsr, sqlite3V
eda0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
edb0: 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+2);.  VdbeCove
edc0: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
edd0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
ede0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 46  OP_Goto, 0, lblF
edf0: 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 69 66 28  lushDone);.  if(
ee00: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
ee10: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
ee20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
ee30: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
ee40: 66 50 6f 73 32 29 3b 0a 20 20 7d 0a 0a 20 20 69  fPos2);.  }..  i
ee50: 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  f( pMWin->eStart
ee60: 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20  ==TK_CURRENT .  
ee70: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
ee80: 74 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  t==TK_PRECEDING 
ee90: 0a 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53  .   || pMWin->eS
eea0: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
eeb0: 4e 47 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  NG .  ){.    int
eec0: 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 20   lblSkipInverse 
eed0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
eee0: 65 4c 61 62 65 6c 28 70 50 61 72 73 65 29 3b 3b  eLabel(pParse);;
eef0: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
ef00: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
ef10: 44 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71  DING ){.      sq
ef20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ef30: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
ef40: 53 74 61 72 74 2c 20 6c 62 6c 53 6b 69 70 49 6e  Start, lblSkipIn
ef50: 76 65 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  verse, 1);.     
ef60: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
ef70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ef80: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
ef90: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
efa0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
efb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
efc0: 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c  t, csrStart, sql
efd0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
efe0: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20  ddr(v)+2);.     
eff0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
f000: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
f010: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f020: 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 53 6b 69 70  Goto, 0, lblSkip
f030: 49 6e 76 65 72 73 65 29 3b 0a 20 20 20 20 7d 65  Inverse);.    }e
f040: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
f050: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f060: 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74 61 72  OP_Next, csrStar
f070: 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
f080: 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 29 3b  rrentAddr(v)+1);
f090: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
f0a0: 61 67 65 41 6c 77 61 79 73 54 61 6b 65 6e 28 76  ageAlwaysTaken(v
f0b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e  );.    }.    win
f0c0: 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
f0d0: 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 53 74 61  e, pMWin, csrSta
f0e0: 72 74 2c 20 31 2c 20 72 65 67 41 72 67 2c 20 72  rt, 1, regArg, r
f0f0: 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 73 71 6c  egSize);.    sql
f100: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
f110: 61 62 65 6c 28 76 2c 20 6c 62 6c 53 6b 69 70 49  abel(v, lblSkipI
f120: 6e 76 65 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69  nverse);.  }.  i
f130: 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  f( pMWin->eEnd==
f140: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a  TK_FOLLOWING ){.
f150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
f160: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
f170: 66 50 6f 73 31 29 3b 0a 20 20 7d 0a 20 20 73 71  fPos1);.  }.  sq
f180: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
f190: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
f1a0: 64 64 72 54 6f 70 29 3b 0a 0a 20 20 2f 2a 20 66  ddrTop);..  /* f
f1b0: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64  lush_partition_d
f1c0: 6f 6e 65 3a 20 2a 2f 0a 20 20 73 71 6c 69 74 65  one: */.  sqlite
f1d0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f1e0: 6c 28 76 2c 20 6c 62 6c 46 6c 75 73 68 44 6f 6e  l(v, lblFlushDon
f1f0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
f200: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
f210: 73 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e  setSorter, pMWin
f220: 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 73 71  ->iEphCsr);.  sq
f230: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
f240: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
f250: 67 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 56  gFlushPart);.  V
f260: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
f270: 65 6e 64 20 66 6c 75 73 68 5f 70 61 72 74 69 74  end flush_partit
f280: 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 22 29  ion subroutine")
f290: 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
f2a0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 6f 76   here to skip ov
f2b0: 65 72 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  er flush_partiti
f2c0: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  on */.  sqlite3V
f2d0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
f2e0: 64 64 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 73 74 61  ddrGoto);.}..sta
f2f0: 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
f300: 6f 64 65 53 74 65 70 28 0a 20 20 50 61 72 73 65  odeStep(.  Parse
f310: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c   *pParse, .  Sel
f320: 65 63 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49  ect *p,.  WhereI
f330: 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69  nfo *pWInfo,.  i
f340: 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20  nt regGosub, .  
f350: 69 6e 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b  int addrGosub.){
f360: 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e  .  Window *pMWin
f370: 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64   = p->pWin;.  Vd
f380: 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
f390: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
f3a0: 20 20 69 6e 74 20 72 65 67 46 6c 75 73 68 50 61    int regFlushPa
f3b0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rt;             
f3c0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
f3d0: 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f 70  r "Gosub flush_p
f3e0: 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 0a 20 20  artition" */..  
f3f0: 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69 6e  int regArg;.  in
f400: 74 20 63 73 72 43 75 72 72 65 6e 74 20 3d 20 70  t csrCurrent = p
f410: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a 20  MWin->iEphCsr;. 
f420: 20 69 6e 74 20 63 73 72 57 72 69 74 65 20 3d 20   int csrWrite = 
f430: 63 73 72 43 75 72 72 65 6e 74 2b 31 3b 0a 20 20  csrCurrent+1;.  
f440: 69 6e 74 20 63 73 72 53 74 61 72 74 20 3d 20 63  int csrStart = c
f450: 73 72 43 75 72 72 65 6e 74 2b 32 3b 0a 20 20 69  srCurrent+2;.  i
f460: 6e 74 20 63 73 72 45 6e 64 20 3d 20 63 73 72 43  nt csrEnd = csrC
f470: 75 72 72 65 6e 74 2b 33 3b 0a 0a 20 20 69 6e 74  urrent+3;..  int
f480: 20 72 65 67 53 74 61 72 74 3b 20 20 20 20 20 20   regStart;      
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4a0: 20 56 61 6c 75 65 20 6f 66 20 3c 65 78 70 72 3e   Value of <expr>
f4b0: 20 50 52 45 43 45 44 49 4e 47 20 2a 2f 0a 20 20   PRECEDING */.  
f4c0: 69 6e 74 20 72 65 67 45 6e 64 3b 20 20 20 20 20  int regEnd;     
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
f4f0: 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 20 2a 2f  pr> FOLLOWING */
f500: 0a 0a 20 20 69 6e 74 20 69 53 75 62 43 73 72 20  ..  int iSubCsr 
f510: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
f520: 69 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e  iCursor;.  int n
f530: 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
f540: 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  [0].pTab->nCol;.
f550: 20 20 69 6e 74 20 6b 3b 0a 0a 20 20 69 6e 74 20    int k;..  int 
f560: 61 64 64 72 47 6f 74 6f 3b 0a 20 20 69 6e 74 20  addrGoto;.  int 
f570: 61 64 64 72 49 66 3b 0a 20 20 69 6e 74 20 61 64  addrIf;.  int ad
f580: 64 72 49 66 45 6e 64 3b 0a 20 20 69 6e 74 20 61  drIfEnd;.  int a
f590: 64 64 72 49 66 53 74 61 72 74 3b 0a 20 20 69 6e  ddrIfStart;.  in
f5a0: 74 20 61 64 64 72 47 6f 73 75 62 46 6c 75 73 68  t addrGosubFlush
f5b0: 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 74 65  ;.  int addrInte
f5c0: 67 65 72 3b 0a 0a 20 20 69 6e 74 20 61 64 64 72  ger;..  int addr
f5d0: 53 68 6f 72 74 63 75 74 20 3d 20 30 3b 0a 0a 20  Shortcut = 0;.. 
f5e0: 20 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73   int reg = pPars
f5f0: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74  e->nMem+1;.  int
f600: 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67   regRecord = reg
f610: 2b 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67  +nSub;.  int reg
f620: 52 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72  Rowid = regRecor
f630: 64 2b 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e  d+1;..  pParse->
f640: 6e 4d 65 6d 20 2b 3d 20 31 20 2b 20 6e 53 75 62  nMem += 1 + nSub
f650: 20 2b 20 31 3b 0a 0a 20 20 72 65 67 46 6c 75 73   + 1;..  regFlus
f660: 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  hPart = ++pParse
f670: 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 53 74 61  ->nMem;.  regSta
f680: 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rt = ++pParse->n
f690: 4d 65 6d 3b 0a 20 20 72 65 67 45 6e 64 20 3d 20  Mem;.  regEnd = 
f6a0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
f6b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e  .  assert( pMWin
f6c0: 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45  ->eStart==TK_PRE
f6d0: 43 45 44 49 4e 47 20 0a 20 20 20 20 20 20 20 7c  CEDING .       |
f6e0: 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
f6f0: 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
f700: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53      || pMWin->eS
f710: 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49  tart==TK_FOLLOWI
f720: 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4d  NG .       || pM
f730: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
f740: 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 29 3b 0a  UNBOUNDED .  );.
f750: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
f760: 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  >eEnd==TK_FOLLOW
f770: 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ING .       || p
f780: 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43  MWin->eEnd==TK_C
f790: 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20 20 7c  URRENT .       |
f7a0: 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  | pMWin->eEnd==T
f7b0: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20  K_UNBOUNDED .   
f7c0: 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45      || pMWin->eE
f7d0: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
f7e0: 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61   .  );..  /* Loa
f7f0: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  d the column val
f800: 75 65 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20  ues for the row 
f810: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
f820: 73 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20  sub-select.  ** 
f830: 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  into an array of
f840: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
f850: 69 6e 67 20 61 74 20 72 65 67 2e 20 41 73 73 65  ing at reg. Asse
f860: 6d 62 6c 65 20 74 68 65 6d 20 69 6e 74 6f 0a 20  mble them into. 
f870: 20 2a 2a 20 61 20 72 65 63 6f 72 64 20 69 6e 20   ** a record in 
f880: 72 65 67 69 73 74 65 72 20 72 65 67 52 65 63 6f  register regReco
f890: 72 64 2e 20 54 4f 44 4f 3a 20 41 6e 20 6f 70 74  rd. TODO: An opt
f8a0: 69 6d 69 7a 61 74 69 6f 6e 20 68 65 72 65 3f 20  imization here? 
f8b0: 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  */.  for(k=0; k<
f8c0: 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  nSub; k++){.    
f8d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f8e0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
f8f0: 69 53 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b  iSubCsr, k, reg+
f900: 6b 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  k);.  }.  sqlite
f910: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f920: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
f930: 67 2c 20 6e 53 75 62 2c 20 72 65 67 52 65 63 6f  g, nSub, regReco
f940: 72 64 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  rd);..  /* Check
f950: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
f960: 69 74 65 72 61 74 69 6f 6e 20 69 73 20 74 68 65  iteration is the
f970: 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20 61 20   first row of a 
f980: 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20 2a 2f  new partition */
f990: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 50  .  if( pMWin->pP
f9a0: 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20 20 20  artition ){.    
f9b0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 45 78  int addr;.    Ex
f9c0: 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20  prList *pPart = 
f9d0: 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
f9e0: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50 61 72 74  n;.    int nPart
f9f0: 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78 70 72 3b   = pPart->nExpr;
fa00: 0a 20 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50  .    int regNewP
fa10: 61 72 74 20 3d 20 72 65 67 20 2b 20 70 4d 57 69  art = reg + pMWi
fa20: 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20  n->nBufferCol;. 
fa30: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
fa40: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
fa50: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
fa60: 74 28 70 50 61 72 73 65 2c 20 70 50 61 72 74 2c  t(pParse, pPart,
fa70: 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 61 64 64   0, 0);..    add
fa80: 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rIf = sqlite3Vdb
fa90: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
faa0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72 73  , pMWin->regFirs
fab0: 74 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  t);.    addr = s
fac0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fad0: 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
fae0: 72 65 67 4e 65 77 50 61 72 74 2c 20 70 4d 57 69  regNewPart, pMWi
faf0: 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61 72  n->regPart, nPar
fb00: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
fb10: 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28  dbeAppendP4(v, (
fb20: 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  void*)pKeyInfo, 
fb30: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
fb40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fb50: 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
fb60: 64 64 72 2b 32 2c 20 61 64 64 72 2b 33 2c 20 61  ddr+2, addr+3, a
fb70: 64 64 72 2b 32 29 3b 0a 20 20 20 20 56 64 62 65  ddr+2);.    Vdbe
fb80: 43 6f 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b  CoverageEqNe(v);
fb90: 0a 20 20 20 20 61 64 64 72 47 6f 73 75 62 46 6c  .    addrGosubFl
fba0: 75 73 68 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ush = sqlite3Vdb
fbb0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47 6f  eAddOp1(v, OP_Go
fbc0: 73 75 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72  sub, regFlushPar
fbd0: 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  t);.    VdbeComm
fbe0: 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c  ent((v, "call fl
fbf0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29 29  ush_partition"))
fc00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
fc10: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
fc20: 72 49 66 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rIf);.  }..  /* 
fc30: 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 72  Insert the new r
fc40: 6f 77 20 69 6e 74 6f 20 74 68 65 20 65 70 68 65  ow into the ephe
fc50: 6d 65 72 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  meral table */. 
fc60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc70: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
fc80: 64 2c 20 63 73 72 57 72 69 74 65 2c 20 72 65 67  d, csrWrite, reg
fc90: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
fca0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fcb0: 50 5f 49 6e 73 65 72 74 2c 20 63 73 72 57 72 69  P_Insert, csrWri
fcc0: 74 65 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 72  te, regRecord, r
fcd0: 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20  egRowid);..  /* 
fce0: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 75  This block is ru
fcf0: 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  n for the first 
fd00: 72 6f 77 20 6f 66 20 65 61 63 68 20 70 61 72 74  row of each part
fd10: 69 74 69 6f 6e 20 2a 2f 0a 20 20 61 64 64 72 49  ition */.  addrI
fd20: 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  f = sqlite3VdbeA
fd30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
fd40: 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 46 69 72  t, pMWin->regFir
fd50: 73 74 29 3b 0a 20 20 69 66 28 20 70 4d 57 69 6e  st);.  if( pMWin
fd60: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a  ->pPartition ){.
fd70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fd80: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
fd90: 2c 20 0a 20 20 20 20 20 20 20 20 72 65 67 2b 70  , .        reg+p
fda0: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
fdb0: 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74  , pMWin->regPart
fdc0: 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  , pMWin->pPartit
fdd0: 69 6f 6e 2d 3e 6e 45 78 70 72 2d 31 0a 20 20 20  ion->nExpr-1.   
fde0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 67 41 72   );.  }..  regAr
fdf0: 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63  g = windowInitAc
fe00: 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69  cum(pParse, pMWi
fe10: 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 45 78  n);..  sqlite3Ex
fe20: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
fe30: 4d 57 69 6e 2d 3e 70 53 74 61 72 74 2c 20 72 65  MWin->pStart, re
fe40: 67 53 74 61 72 74 29 3b 0a 20 20 77 69 6e 64 6f  gStart);.  windo
fe50: 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28 70  wCheckIntValue(p
fe60: 50 61 72 73 65 2c 20 72 65 67 53 74 61 72 74 2c  Parse, regStart,
fe70: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78   0);.  sqlite3Ex
fe80: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
fe90: 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20 72 65 67 45  MWin->pEnd, regE
fea0: 6e 64 29 3b 0a 20 20 77 69 6e 64 6f 77 43 68 65  nd);.  windowChe
feb0: 63 6b 49 6e 74 56 61 6c 75 65 28 70 50 61 72 73  ckIntValue(pPars
fec0: 65 2c 20 72 65 67 45 6e 64 2c 20 31 29 3b 0a 0a  e, regEnd, 1);..
fed0: 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74    if( pMWin->eSt
fee0: 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e  art==TK_FOLLOWIN
fef0: 47 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  G || pMWin->eEnd
ff00: 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29  ==TK_PRECEDING )
ff10: 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28  {.    int op = (
ff20: 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
ff30: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 20 3f 20  TK_FOLLOWING) ? 
ff40: 4f 50 5f 47 65 20 3a 20 4f 50 5f 4c 65 29 3b 0a  OP_Ge : OP_Le);.
ff50: 20 20 20 20 69 6e 74 20 61 64 64 72 47 65 20 3d      int addrGe =
ff60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ff70: 70 33 28 76 2c 20 6f 70 2c 20 72 65 67 53 74 61  p3(v, op, regSta
ff80: 72 74 2c 20 30 2c 20 72 65 67 45 6e 64 29 3b 0a  rt, 0, regEnd);.
ff90: 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e      windowAggFin
ffa0: 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  al(pParse, pMWin
ffb0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
ffc0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ffd0: 50 5f 52 65 77 69 6e 64 2c 20 63 73 72 43 75 72  P_Rewind, csrCur
ffe0: 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 77 69  rent, 1);.    wi
fff0: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
10000 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
10010 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
10020 73 75 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sub);.    sqlite
10030 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
10040 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 63  P_ResetSorter, c
10050 73 72 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20  srCurrent);.    
10060 61 64 64 72 53 68 6f 72 74 63 75 74 20 3d 20 73  addrShortcut = s
10070 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
10080 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
10090 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
100a0 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 65 29  pHere(v, addrGe)
100b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  ;.  }.  if( pMWi
100c0 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f  n->eStart==TK_FO
100d0 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73  LLOWING ){.    s
100e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
100f0 28 76 2c 20 4f 50 5f 53 75 62 74 72 61 63 74 2c  (v, OP_Subtract,
10100 20 72 65 67 53 74 61 72 74 2c 20 72 65 67 45 6e   regStart, regEn
10110 64 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20 20  d, regStart);.  
10120 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  }..  sqlite3Vdbe
10130 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
10140 69 6e 64 2c 20 63 73 72 53 74 61 72 74 2c 20 31  ind, csrStart, 1
10150 29 3b 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  );   sqlite3Vdbe
10160 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
10170 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10180 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
10190 2c 20 63 73 72 43 75 72 72 65 6e 74 2c 20 31 29  , csrCurrent, 1)
101a0 3b 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ; sqlite3VdbeCha
101b0 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 73  ngeP5(v, 1);.  s
101c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
101d0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63  (v, OP_Rewind, c
101e0 73 72 45 6e 64 2c 20 31 29 3b 20 73 71 6c 69 74  srEnd, 1); sqlit
101f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
10200 2c 20 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  , 1);..  sqlite3
10210 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10220 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4d 57  _Integer, 0, pMW
10230 69 6e 2d 3e 72 65 67 46 69 72 73 74 29 3b 0a 20  in->regFirst);. 
10240 20 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69   addrGoto = sqli
10250 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
10260 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a   OP_Goto);..  /*
10270 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
10280 75 6e 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  un for the secon
10290 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
102a0 20 72 6f 77 73 20 6f 66 20 65 61 63 68 20 70 61   rows of each pa
102b0 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  rtition */.  sql
102c0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
102d0 28 76 2c 20 61 64 64 72 49 66 29 3b 0a 0a 20 20  (v, addrIf);..  
102e0 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72  if( pMWin->eStar
102f0 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20  t==TK_FOLLOWING 
10300 29 7b 0a 20 20 20 20 61 64 64 72 49 66 45 6e 64  ){.    addrIfEnd
10310 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
10320 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp3(v, OP_IfPos
10330 2c 20 72 65 67 45 6e 64 2c 20 30 2c 20 31 29 3b  , regEnd, 0, 1);
10340 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69  .    windowAggFi
10350 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
10360 6e 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  n, 0);.    sqlit
10370 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10380 4f 50 5f 4e 65 78 74 2c 20 63 73 72 43 75 72 72  OP_Next, csrCurr
10390 65 6e 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  ent, sqlite3Vdbe
103a0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
103b0 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 52 65 74  );.    windowRet
103c0 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73 65  urnOneRow(pParse
103d0 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73 75  , pMWin, regGosu
103e0 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
103f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
10400 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
10410 45 6e 64 29 3b 0a 0a 20 20 20 20 61 64 64 72 49  End);..    addrI
10420 66 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  fStart = sqlite3
10430 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10440 5f 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74  _IfPos, regStart
10450 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  , 0, 1);.    sql
10460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10470 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74  , OP_Next, csrSt
10480 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  art, sqlite3Vdbe
10490 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
104a0 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67  );.    windowAgg
104b0 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
104c0 69 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c  in, csrStart, 1,
104d0 20 72 65 67 41 72 67 2c 20 30 29 3b 0a 20 20 20   regArg, 0);.   
104e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
104f0 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 53 74  Here(v, addrIfSt
10500 61 72 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20  art);.  }else.  
10510 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d  if( pMWin->eEnd=
10520 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b  =TK_PRECEDING ){
10530 0a 20 20 20 20 61 64 64 72 49 66 45 6e 64 20 3d  .    addrIfEnd =
10540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10550 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
10560 72 65 67 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20  regEnd, 0, 1);. 
10570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10580 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
10590 20 63 73 72 45 6e 64 2c 20 73 71 6c 69 74 65 33   csrEnd, sqlite3
105a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
105b0 76 29 2b 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f  v)+1);.    windo
105c0 77 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c  wAggStep(pParse,
105d0 20 70 4d 57 69 6e 2c 20 63 73 72 45 6e 64 2c 20   pMWin, csrEnd, 
105e0 30 2c 20 72 65 67 41 72 67 2c 20 30 29 3b 0a 20  0, regArg, 0);. 
105f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
10600 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
10610 45 6e 64 29 3b 0a 0a 20 20 20 20 77 69 6e 64 6f  End);..    windo
10620 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
10630 2c 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 20  , pMWin, 0);.   
10640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10650 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63  p2(v, OP_Next, c
10660 73 72 43 75 72 72 65 6e 74 2c 20 73 71 6c 69 74  srCurrent, sqlit
10670 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
10680 72 28 76 29 2b 31 29 3b 0a 20 20 20 20 77 69 6e  r(v)+1);.    win
10690 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77 28  dowReturnOneRow(
106a0 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 72  pParse, pMWin, r
106b0 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73  egGosub, addrGos
106c0 75 62 29 3b 0a 0a 20 20 20 20 61 64 64 72 49 66  ub);..    addrIf
106d0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
106e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
106f0 49 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c  IfPos, regStart,
10700 20 30 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   0, 1);.    sqli
10710 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10720 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74 61   OP_Next, csrSta
10730 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt, sqlite3VdbeC
10740 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 29  urrentAddr(v)+1)
10750 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53  ;.    windowAggS
10760 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
10770 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c 20  n, csrStart, 1, 
10780 72 65 67 41 72 67 2c 20 30 29 3b 0a 20 20 20 20  regArg, 0);.    
10790 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
107a0 65 72 65 28 76 2c 20 61 64 64 72 49 66 53 74 61  ere(v, addrIfSta
107b0 72 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rt);.  }else{.  
107c0 20 20 61 64 64 72 49 66 45 6e 64 20 3d 20 73 71    addrIfEnd = sq
107d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
107e0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
107f0 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  End, 0, 1);.    
10800 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
10810 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29  Parse, pMWin, 0)
10820 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10830 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10840 78 74 2c 20 63 73 72 43 75 72 72 65 6e 74 2c 20  xt, csrCurrent, 
10850 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
10860 6e 74 41 64 64 72 28 76 29 2b 31 29 3b 0a 20 20  ntAddr(v)+1);.  
10870 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e    windowReturnOn
10880 65 52 6f 77 28 70 50 61 72 73 65 2c 20 70 4d 57  eRow(pParse, pMW
10890 69 6e 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64  in, regGosub, ad
108a0 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 61 64  drGosub);.    ad
108b0 64 72 49 66 53 74 61 72 74 20 3d 20 73 71 6c 69  drIfStart = sqli
108c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
108d0 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 53 74   OP_IfPos, regSt
108e0 61 72 74 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  art, 0, 1);.    
108f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10900 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
10910 72 53 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56  rStart, sqlite3V
10920 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
10930 29 2b 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77  )+1);.    window
10940 41 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20  AggStep(pParse, 
10950 70 4d 57 69 6e 2c 20 63 73 72 53 74 61 72 74 2c  pMWin, csrStart,
10960 20 31 2c 20 72 65 67 41 72 67 2c 20 30 29 3b 0a   1, regArg, 0);.
10970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
10980 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49  umpHere(v, addrI
10990 66 53 74 61 72 74 29 3b 0a 20 20 20 20 73 71 6c  fStart);.    sql
109a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
109b0 28 76 2c 20 61 64 64 72 49 66 45 6e 64 29 3b 0a  (v, addrIfEnd);.
109c0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 64    }..  sqlite3Vd
109d0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
109e0 64 72 47 6f 74 6f 29 3b 0a 20 20 69 66 28 20 70  drGoto);.  if( p
109f0 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 50  MWin->eEnd!=TK_P
10a00 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20 20  RECEDING ){.    
10a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a20 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73  2(v, OP_Next, cs
10a30 72 45 6e 64 2c 20 73 71 6c 69 74 65 33 56 64 62  rEnd, sqlite3Vdb
10a40 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
10a50 31 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41 67  1);.    windowAg
10a60 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
10a70 57 69 6e 2c 20 63 73 72 45 6e 64 2c 20 30 2c 20  Win, csrEnd, 0, 
10a80 72 65 67 41 72 67 2c 20 30 29 3b 0a 20 20 7d 0a  regArg, 0);.  }.
10a90 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  .  /* End of the
10aa0 20 6d 61 69 6e 20 69 6e 70 75 74 20 6c 6f 6f 70   main input loop
10ab0 20 2a 2f 0a 20 20 69 66 28 20 61 64 64 72 53 68   */.  if( addrSh
10ac0 6f 72 74 63 75 74 3e 30 20 29 20 73 71 6c 69 74  ortcut>0 ) sqlit
10ad0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10ae0 2c 20 61 64 64 72 53 68 6f 72 74 63 75 74 29 3b  , addrShortcut);
10af0 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  .  sqlite3WhereE
10b00 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f  nd(pWInfo);..  /
10b10 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a  * Fall through *
10b20 2f 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  /..  if( pMWin->
10b30 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20 20  pPartition ){.  
10b40 20 20 61 64 64 72 49 6e 74 65 67 65 72 20 3d 20    addrInteger = 
10b50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10b60 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
10b70 20 30 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74   0, regFlushPart
10b80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
10b90 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10ba0 64 72 47 6f 73 75 62 46 6c 75 73 68 29 3b 0a 20  drGosubFlush);. 
10bb0 20 7d 0a 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   }..  if( pMWin-
10bc0 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c  >eStart==TK_FOLL
10bd0 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 69 6e 74  OWING ){.    int
10be0 20 61 64 64 72 42 72 65 61 6b 3b 0a 20 20 20 20   addrBreak;.    
10bf0 61 64 64 72 49 66 45 6e 64 20 3d 20 73 71 6c 69  addrIfEnd = sqli
10c00 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10c10 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 45 6e   OP_IfPos, regEn
10c20 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 73 71  d, 0, 1);.    sq
10c30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10c40 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 43  v, OP_Next, csrC
10c50 75 72 72 65 6e 74 2c 20 73 71 6c 69 74 65 33 56  urrent, sqlite3V
10c60 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
10c70 29 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 42 72  )+2);.    addrBr
10c80 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
10c90 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
10ca0 74 6f 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41  to);.    windowA
10cb0 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20  ggFinal(pParse, 
10cc0 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 20 20 77  pMWin, 0);.    w
10cd0 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
10ce0 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  w(pParse, pMWin,
10cf0 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
10d00 6f 73 75 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  osub);.    sqlit
10d10 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
10d20 2c 20 61 64 64 72 49 66 45 6e 64 29 3b 0a 0a 20  , addrIfEnd);.. 
10d30 20 20 20 61 64 64 72 49 66 53 74 61 72 74 20 3d     addrIfStart =
10d40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10d50 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p3(v, OP_IfPos, 
10d60 72 65 67 53 74 61 72 74 2c 20 30 2c 20 31 29 3b  regStart, 0, 1);
10d70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10d80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
10d90 74 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c  t, csrStart, sql
10da0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10db0 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 73  ddr(v)+2);.    s
10dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
10dd0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
10de0 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28    windowAggStep(
10df0 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63  pParse, pMWin, c
10e00 73 72 53 74 61 72 74 2c 20 31 2c 20 72 65 67 41  srStart, 1, regA
10e10 72 67 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  rg, 0);.    sqli
10e20 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
10e30 76 2c 20 61 64 64 72 49 66 53 74 61 72 74 29 3b  v, addrIfStart);
10e40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10e50 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10e60 49 66 53 74 61 72 74 2b 32 29 3b 0a 0a 20 20 20  IfStart+2);..   
10e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10e80 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
10e90 2c 20 61 64 64 72 49 66 45 6e 64 29 3b 0a 20 20  , addrIfEnd);.  
10ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10eb0 70 48 65 72 65 28 76 2c 20 61 64 64 72 42 72 65  pHere(v, addrBre
10ec0 61 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ak);.  }else{.  
10ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10ee0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
10ef0 63 73 72 43 75 72 72 65 6e 74 2c 20 73 71 6c 69  csrCurrent, sqli
10f00 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10f10 64 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 61 64  dr(v)+2);.    ad
10f20 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
10f30 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
10f40 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 69 66 28 20  _Goto);.    if( 
10f50 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
10f60 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20 20  PRECEDING ){.   
10f70 20 20 20 61 64 64 72 49 66 45 6e 64 20 3d 20 73     addrIfEnd = s
10f80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10f90 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65  (v, OP_IfPos, re
10fa0 67 45 6e 64 2c 20 30 2c 20 31 29 3b 0a 20 20 20  gEnd, 0, 1);.   
10fb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10fc0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
10fd0 20 63 73 72 45 6e 64 2c 20 73 71 6c 69 74 65 33   csrEnd, sqlite3
10fe0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10ff0 76 29 2b 31 29 3b 0a 20 20 20 20 20 20 77 69 6e  v)+1);.      win
11000 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
11010 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 45 6e 64  e, pMWin, csrEnd
11020 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 30 29 3b  , 0, regArg, 0);
11030 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11040 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
11050 64 72 49 66 45 6e 64 29 3b 0a 20 20 20 20 20 20  drIfEnd);.      
11060 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
11070 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29  Parse, pMWin, 0)
11080 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65  ;.      windowRe
11090 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72 73  turnOneRow(pPars
110a0 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f 73  e, pMWin, regGos
110b0 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
110c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
110d0 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
110e0 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30  pParse, pMWin, 0
110f0 29 3b 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 52  );.      windowR
11100 65 74 75 72 6e 4f 6e 65 52 6f 77 28 70 50 61 72  eturnOneRow(pPar
11110 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 47 6f  se, pMWin, regGo
11120 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
11130 0a 20 20 20 20 20 20 61 64 64 72 49 66 53 74 61  .      addrIfSta
11140 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
11150 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
11160 6f 73 2c 20 72 65 67 53 74 61 72 74 2c 20 30 2c  os, regStart, 0,
11170 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
11180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11190 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53 74 61 72  OP_Next, csrStar
111a0 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  t, sqlite3VdbeCu
111b0 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 29 3b  rrentAddr(v)+1);
111c0 0a 20 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67  .      windowAgg
111d0 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57  Step(pParse, pMW
111e0 69 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c  in, csrStart, 1,
111f0 20 72 65 67 41 72 67 2c 20 30 29 3b 0a 20 20 20   regArg, 0);.   
11200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
11210 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66  mpHere(v, addrIf
11220 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71  Start);.      sq
11230 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11240 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
11250 64 64 72 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  ddrGoto-1);.    
11260 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
11270 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11280 72 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 0a 20 20  rGoto);.  }...  
11290 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
112a0 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
112b0 74 65 72 2c 20 63 73 72 43 75 72 72 65 6e 74 29  ter, csrCurrent)
112c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
112d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
112e0 67 65 72 2c 20 31 2c 20 70 4d 57 69 6e 2d 3e 72  ger, 1, pMWin->r
112f0 65 67 46 69 72 73 74 29 3b 0a 20 20 69 66 28 20  egFirst);.  if( 
11300 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
11310 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
11320 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
11330 61 64 64 72 49 6e 74 65 67 65 72 2c 20 73 71 6c  addrInteger, sql
11340 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
11350 64 64 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c  ddr(v));.    sql
11360 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
11370 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
11380 46 6c 75 73 68 50 61 72 74 29 3b 0a 20 20 7d 0a  FlushPart);.  }.
11390 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
113a0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
113b0 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74 65 33 57  work of sqlite3W
113c0 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20  indowCodeStep() 
113d0 66 6f 72 20 63 61 73 65 73 20 74 68 61 74 0a 2a  for cases that.*
113e0 2a 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79  * would normally
113f0 20 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 77   be handled by w
11400 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74  indowCodeDefault
11410 53 74 65 70 28 29 20 77 68 65 6e 20 74 68 65 72  Step() when ther
11420 65 20 61 72 65 0a 2a 2a 20 6f 6e 65 20 6f 72 20  e are.** one or 
11430 6d 6f 72 65 20 62 75 69 6c 74 2d 69 6e 20 77 69  more built-in wi
11440 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 73 20 74  ndow-functions t
11450 68 61 74 20 72 65 71 75 69 72 65 20 74 68 65 20  hat require the 
11460 65 6e 74 69 72 65 20 70 61 72 74 69 74 69 6f 6e  entire partition
11470 0a 2a 2a 20 74 6f 20 62 65 20 63 61 63 68 65 64  .** to be cached
11480 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65   in a temp table
11490 20 62 65 66 6f 72 65 20 61 6e 79 20 72 6f 77 73   before any rows
114a0 20 63 61 6e 20 62 65 20 72 65 74 75 72 6e 65 64   can be returned
114b0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2e 0a  . Additionally..
114c0 2a 2a 20 22 52 41 4e 47 45 20 42 45 54 57 45 45  ** "RANGE BETWEE
114d0 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
114e0 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
114f0 4f 57 49 4e 47 22 20 69 73 20 61 6c 77 61 79 73  OWING" is always
11500 20 68 61 6e 64 6c 65 64 20 62 79 0a 2a 2a 20 74   handled by.** t
11510 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
11520 0a 2a 2a 20 50 73 65 75 64 6f 2d 63 6f 64 65 20  .** Pseudo-code 
11530 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
11540 20 74 68 65 20 56 4d 20 63 6f 64 65 20 67 65 6e   the VM code gen
11550 65 72 61 74 65 64 20 62 79 20 74 68 69 73 20 66  erated by this f
11560 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 65  unction.** for e
11570 61 63 68 20 74 79 70 65 20 6f 66 20 77 69 6e 64  ach type of wind
11580 6f 77 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a 0a 2a  ow follows..**.*
11590 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
115a0 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
115b0 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
115c0 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73  ROW.**.**   flus
115d0 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20  h_partition:.** 
115e0 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20      Once {.**   
115f0 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70      OpenDup (iEp
11600 68 43 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29  hCsr -> csrLead)
11610 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
11620 20 49 6e 74 65 67 65 72 20 63 74 72 20 30 0a 2a   Integer ctr 0.*
11630 2a 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f  *     foreach ro
11640 77 20 28 63 73 72 4c 65 61 64 29 7b 0a 2a 2a 20  w (csrLead){.** 
11650 20 20 20 20 20 20 69 66 28 20 6e 65 77 20 70 65        if( new pe
11660 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  er ){.**        
11670 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75   AggFinal (xValu
11680 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  e).**         fo
11690 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b  r(i=0; i<ctr; i+
116a0 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  +){.**          
116b0 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62   Gosub addrGosub
116c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4e 65  .**           Ne
116d0 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20  xt iEphCsr.**   
116e0 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20        }.**      
116f0 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20 30     Integer ctr 0
11700 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  .**       }.**  
11710 20 20 20 20 20 41 67 67 53 74 65 70 20 28 63 73       AggStep (cs
11720 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20 20 20  rLead).**       
11730 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20 20 20  Incr ctr.**     
11740 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46  }.**.**     AggF
11750 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29  inal (xFinalize)
11760 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  .**     for(i=0;
11770 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a   i<ctr; i++){.**
11780 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64         Gosub add
11790 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20  rGosub.**       
117a0 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20  Next iEphCsr.** 
117b0 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
117c0 52 65 73 65 74 53 6f 72 74 65 72 20 28 63 73 72  ResetSorter (csr
117d0 29 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e 0a  ).**     Return.
117e0 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45  **.** ROWS BETWE
117f0 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
11800 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
11810 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 41  NT ROW.**.**   A
11820 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
11830 74 68 61 74 20 74 68 65 20 22 69 66 28 20 6e 65  that the "if( ne
11840 77 20 70 65 65 72 20 29 22 20 62 72 61 6e 63 68  w peer )" branch
11850 20 69 73 20 61 6c 77 61 79 73 20 74 61 6b 65 6e   is always taken
11860 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45  ..**.** RANGE BE
11870 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
11880 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  W AND CURRENT RO
11890 57 20 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62  W .**.**   As ab
118a0 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ove, except that
118b0 20 65 61 63 68 20 6f 66 20 74 68 65 20 66 6f 72   each of the for
118c0 28 29 20 6c 6f 6f 70 73 20 62 65 63 6f 6d 65 73  () loops becomes
118d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
118e0 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b 20  for(i=0; i<ctr; 
118f0 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20  i++){.**        
11900 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
11910 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ub.**           
11920 41 67 67 49 6e 76 65 72 73 65 20 28 69 45 70 68  AggInverse (iEph
11930 43 73 72 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  Csr).**         
11940 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a    Next iEphCsr.*
11950 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  *         }.**.*
11960 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
11970 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
11980 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ING AND UNBOUNDE
11990 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a  D FOLLOWING.**.*
119a0 2a 20 20 20 66 6c 75 73 68 5f 70 61 72 74 69 74  *   flush_partit
119b0 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f 6e 63 65  ion:.**     Once
119c0 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f 70 65 6e   {.**       Open
119d0 44 75 70 20 28 69 45 70 68 43 73 72 20 2d 3e 20  Dup (iEphCsr -> 
119e0 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20 20  csrLead).**     
119f0 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  }.**     foreach
11a00 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 20 7b   row (csrLead) {
11a10 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53 74 65  .**       AggSte
11a20 70 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  p (csrLead).**  
11a30 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65     }.**     fore
11a40 61 63 68 20 72 6f 77 20 28 69 45 70 68 43 73 72  ach row (iEphCsr
11a50 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  ) {.**       Gos
11a60 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
11a70 20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a 20 52 41 4e      }.** .** RAN
11a80 47 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45  GE BETWEEN CURRE
11a90 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55  NT ROW AND UNBOU
11aa0 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
11ab0 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72  *.**   flush_par
11ac0 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f  tition:.**     O
11ad0 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f  nce {.**       O
11ae0 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20  penDup (iEphCsr 
11af0 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  -> csrLead).**  
11b00 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65     }.**     fore
11b10 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64  ach row (csrLead
11b20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 53  ){.**       AggS
11b30 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a 2a 2a  tep (csrLead).**
11b40 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 52 65       }.**     Re
11b50 77 69 6e 64 20 28 63 73 72 4c 65 61 64 29 0a 2a  wind (csrLead).*
11b60 2a 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74  *     Integer ct
11b70 72 20 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61  r 0.**     forea
11b80 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29  ch row (csrLead)
11b90 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e  {.**       if( n
11ba0 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20  ew peer ){.**   
11bb0 20 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28        AggFinal (
11bc0 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20  xValue).**      
11bd0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74     for(i=0; i<ct
11be0 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20  r; i++){.**     
11bf0 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
11c00 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20  Gosub.**        
11c10 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28 69     AggInverse (i
11c20 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20 20  EphCsr).**      
11c30 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73       Next iEphCs
11c40 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  r.**         }.*
11c50 2a 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65  *         Intege
11c60 72 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 20  r ctr 0.**      
11c70 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49 6e 63 72   }.**       Incr
11c80 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a   ctr.**     }.**
11c90 0a 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c  .**     AggFinal
11ca0 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20   (xFinalize).** 
11cb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63      for(i=0; i<c
11cc0 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20  tr; i++){.**    
11cd0 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
11ce0 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78 74  ub.**       Next
11cf0 20 69 45 70 68 43 73 72 0a 2a 2a 20 20 20 20 20   iEphCsr.**     
11d00 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 73 65  }.**.**     Rese
11d10 74 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a  tSorter (csr).**
11d20 20 20 20 20 20 52 65 74 75 72 6e 0a 2a 2f 0a 73       Return.*/.s
11d30 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f  tatic void windo
11d40 77 43 6f 64 65 43 61 63 68 65 53 74 65 70 28 0a  wCodeCacheStep(.
11d50 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11d60 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20   .  Select *p,. 
11d70 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
11d80 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73  fo,.  int regGos
11d90 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47  ub, .  int addrG
11da0 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  osub.){.  Window
11db0 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
11dc0 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  n;.  Vdbe *v = s
11dd0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11de0 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a  arse);.  int k;.
11df0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 45 78    int addr;.  Ex
11e00 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d 20  prList *pPart = 
11e10 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  pMWin->pPartitio
11e20 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  n;.  ExprList *p
11e30 4f 72 64 65 72 42 79 20 3d 20 70 4d 57 69 6e 2d  OrderBy = pMWin-
11e40 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
11e50 20 6e 50 65 65 72 20 3d 20 70 4f 72 64 65 72 42   nPeer = pOrderB
11e60 79 20 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y ? pOrderBy->nE
11e70 78 70 72 20 3a 20 30 3b 0a 20 20 69 6e 74 20 72  xpr : 0;.  int r
11e80 65 67 4e 65 77 50 65 65 72 3b 0a 0a 20 20 69 6e  egNewPeer;..  in
11e90 74 20 61 64 64 72 47 6f 74 6f 3b 20 20 20 20 20  t addrGoto;     
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11eb0 20 41 64 64 72 65 73 73 20 6f 66 20 47 6f 74 6f   Address of Goto
11ec0 20 75 73 65 64 20 74 6f 20 6a 75 6d 70 20 66 6c   used to jump fl
11ed0 75 73 68 5f 70 61 72 2e 2e 20 2a 2f 0a 20 20 69  ush_par.. */.  i
11ee0 6e 74 20 61 64 64 72 4e 65 78 74 3b 20 20 20 20  nt addrNext;    
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f00 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
11f10 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
11f20 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
11f30 72 65 67 46 6c 75 73 68 50 61 72 74 3b 0a 20 20  regFlushPart;.  
11f40 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50 61 72 74  int lblFlushPart
11f50 3b 0a 20 20 69 6e 74 20 63 73 72 4c 65 61 64 3b  ;.  int csrLead;
11f60 0a 20 20 69 6e 74 20 72 65 67 43 74 72 3b 0a 20  .  int regCtr;. 
11f70 20 69 6e 74 20 72 65 67 41 72 67 3b 20 20 20 20   int regArg;    
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 72 72   /* Register arr
11fa0 61 79 20 74 6f 20 6d 61 72 74 69 61 6c 20 66 75  ay to martial fu
11fb0 6e 63 74 69 6f 6e 20 61 72 67 73 20 2a 2f 0a 20  nction args */. 
11fc0 20 69 6e 74 20 72 65 67 53 69 7a 65 3b 0a 20 20   int regSize;.  
11fd0 69 6e 74 20 6c 62 6c 45 6d 70 74 79 3b 0a 20 20  int lblEmpty;.  
11fe0 69 6e 74 20 62 52 65 76 65 72 73 65 20 3d 20 70  int bReverse = p
11ff0 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 20 26  MWin->pOrderBy &
12000 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  & pMWin->eStart=
12010 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20  =TK_CURRENT .   
12020 20 20 20 20 20 20 20 26 26 20 70 4d 57 69 6e 2d         && pMWin-
12030 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
12040 44 45 44 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  DED;..  assert( 
12050 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d  (pMWin->eStart==
12060 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20  TK_UNBOUNDED && 
12070 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
12080 43 55 52 52 45 4e 54 29 20 0a 20 20 20 20 20 20  CURRENT) .      
12090 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61   || (pMWin->eSta
120a0 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
120b0 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
120c0 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 29 20 0a  =TK_UNBOUNDED) .
120d0 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e         || (pMWin
120e0 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52  ->eStart==TK_CUR
120f0 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65  RENT && pMWin->e
12100 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29  End==TK_CURRENT)
12110 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57   .       || (pMW
12120 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43  in->eStart==TK_C
12130 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d  URRENT && pMWin-
12140 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  >eEnd==TK_UNBOUN
12150 44 45 44 29 20 0a 20 20 29 3b 0a 0a 20 20 6c 62  DED) .  );..  lb
12160 6c 45 6d 70 74 79 20 3d 20 73 71 6c 69 74 65 33  lEmpty = sqlite3
12170 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 70 50  VdbeMakeLabel(pP
12180 61 72 73 65 29 3b 0a 20 20 72 65 67 4e 65 77 50  arse);.  regNewP
12190 65 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  eer = pParse->nM
121a0 65 6d 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e  em+1;.  pParse->
121b0 6e 4d 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a  nMem += nPeer;..
121c0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65    /* Allocate re
121d0 67 69 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c  gister and label
121e0 20 66 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f   for the "flush_
121f0 70 61 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72  partition" sub-r
12200 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67  outine. */.  reg
12210 46 6c 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50  FlushPart = ++pP
12220 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62  arse->nMem;.  lb
12230 6c 46 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c  lFlushPart = sql
12240 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
12250 6c 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 63 73  l(pParse);..  cs
12260 72 4c 65 61 64 20 3d 20 70 50 61 72 73 65 2d 3e  rLead = pParse->
12270 6e 54 61 62 2b 2b 3b 0a 20 20 72 65 67 43 74 72  nTab++;.  regCtr
12280 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
12290 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72 74  m;..  windowPart
122a0 69 74 69 6f 6e 43 61 63 68 65 28 70 50 61 72 73  itionCache(pPars
122b0 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65  e, p, pWInfo, re
122c0 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46  gFlushPart, lblF
122d0 6c 75 73 68 50 61 72 74 2c 20 26 72 65 67 53 69  lushPart, &regSi
122e0 7a 65 29 3b 0a 20 20 61 64 64 72 47 6f 74 6f 20  ze);.  addrGoto 
122f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12300 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b  Op0(v, OP_Goto);
12310 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  ..  /* Start of 
12320 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e  "flush_partition
12330 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  " */.  sqlite3Vd
12340 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
12350 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b  , lblFlushPart);
12360 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12370 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c  dOp2(v, OP_Once,
12380 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43   0, sqlite3VdbeC
12390 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 29  urrentAddr(v)+2)
123a0 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
123b0 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
123c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
123d0 70 65 6e 44 75 70 2c 20 63 73 72 4c 65 61 64 2c  penDup, csrLead,
123e0 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
123f0 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
12400 7a 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ze the accumulat
12410 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  or register for 
12420 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63  each window func
12430 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a  tion to NULL */.
12440 20 20 72 65 67 41 72 67 20 3d 20 77 69 6e 64 6f    regArg = windo
12450 77 49 6e 69 74 41 63 63 75 6d 28 70 50 61 72 73  wInitAccum(pPars
12460 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20 73 71  e, pMWin);..  sq
12470 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12480 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
12490 2c 20 72 65 67 43 74 72 29 3b 0a 20 20 73 71 6c  , regCtr);.  sql
124a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
124b0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 63 73 72  , OP_Rewind, csr
124c0 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74 79 29 3b  Lead, lblEmpty);
124d0 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
124e0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
124f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
12500 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  wind, pMWin->iEp
12510 68 43 73 72 2c 20 6c 62 6c 45 6d 70 74 79 29 3b  hCsr, lblEmpty);
12520 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e  .  VdbeCoverageN
12530 65 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 0a 20  everTaken(v);.. 
12540 20 69 66 28 20 62 52 65 76 65 72 73 65 20 29 7b   if( bReverse ){
12550 0a 20 20 20 20 69 6e 74 20 61 64 64 72 32 20 3d  .    int addr2 =
12560 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
12570 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
12580 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
12590 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
125a0 4c 65 61 64 2c 20 30 2c 20 72 65 67 41 72 67 2c  Lead, 0, regArg,
125b0 20 72 65 67 53 69 7a 65 29 3b 0a 20 20 20 20 73   regSize);.    s
125c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
125d0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72  (v, OP_Next, csr
125e0 4c 65 61 64 2c 20 61 64 64 72 32 29 3b 0a 20 20  Lead, addr2);.  
125f0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
12600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
12610 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12620 65 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20  ewind, csrLead, 
12630 6c 62 6c 45 6d 70 74 79 29 3b 0a 20 20 20 20 56  lblEmpty);.    V
12640 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72  dbeCoverageNever
12650 54 61 6b 65 6e 28 76 29 3b 0a 20 20 7d 0a 20 20  Taken(v);.  }.  
12660 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74  addrNext = sqlit
12670 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
12680 72 28 76 29 3b 0a 0a 20 20 69 66 28 20 70 4f 72  r(v);..  if( pOr
12690 64 65 72 42 79 20 26 26 20 28 70 4d 57 69 6e 2d  derBy && (pMWin-
126a0 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e  >eEnd==TK_CURREN
126b0 54 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61  T || pMWin->eSta
126c0 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 29 20  rt==TK_CURRENT) 
126d0 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 75 72 72  ){.    int bCurr
126e0 65 6e 74 20 3d 20 28 70 4d 57 69 6e 2d 3e 65 53  ent = (pMWin->eS
126f0 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54  tart==TK_CURRENT
12700 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a  );.    int addrJ
12710 75 6d 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ump = 0;        
12720 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
12730 6f 66 20 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77  of OP_Jump below
12740 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4d 57 69   */.    if( pMWi
12750 6e 2d 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e  n->eType==TK_RAN
12760 47 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  GE ){.      int 
12770 69 4f 66 66 20 3d 20 70 4d 57 69 6e 2d 3e 6e 42  iOff = pMWin->nB
12780 75 66 66 65 72 43 6f 6c 20 2b 20 28 70 50 61 72  ufferCol + (pPar
12790 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70 72  t ? pPart->nExpr
127a0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 6e 74   : 0);.      int
127b0 20 72 65 67 50 65 65 72 20 3d 20 70 4d 57 69 6e   regPeer = pMWin
127c0 2d 3e 72 65 67 50 61 72 74 20 2b 20 28 70 50 61  ->regPart + (pPa
127d0 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45 78 70  rt ? pPart->nExp
127e0 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 4b 65  r : 0);.      Ke
127f0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
12800 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
12810 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
12820 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  rse, pOrderBy, 0
12830 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
12840 6b 3d 30 3b 20 6b 3c 6e 50 65 65 72 3b 20 6b 2b  k=0; k<nPeer; k+
12850 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
12860 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12870 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 4c   OP_Column, csrL
12880 65 61 64 2c 20 69 4f 66 66 2b 6b 2c 20 72 65 67  ead, iOff+k, reg
12890 4e 65 77 50 65 65 72 2b 6b 29 3b 0a 20 20 20 20  NewPeer+k);.    
128a0 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d    }.      addr =
128b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
128c0 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
128d0 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65  , regNewPeer, re
128e0 67 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20  gPeer, nPeer);. 
128f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12900 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69  AppendP4(v, (voi
12910 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  d*)pKeyInfo, P4_
12920 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
12930 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74  addrJump = sqlit
12940 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
12950 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c  OP_Jump, addr+2,
12960 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20   0, addr+2);.   
12970 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
12980 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
12990 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
129a0 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77 50 65  P_Copy, regNewPe
129b0 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e 50 65  er, regPeer, nPe
129c0 65 72 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  er-1);.    }..  
129d0 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e 52 6f    windowReturnRo
129e0 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  ws(pParse, pMWin
129f0 2c 20 72 65 67 43 74 72 2c 20 72 65 67 47 6f 73  , regCtr, regGos
12a00 75 62 2c 20 61 64 64 72 47 6f 73 75 62 2c 20 0a  ub, addrGosub, .
12a10 20 20 20 20 20 20 20 20 28 62 43 75 72 72 65 6e          (bCurren
12a20 74 20 3f 20 72 65 67 41 72 67 20 3a 20 30 29 2c  t ? regArg : 0),
12a30 20 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65 67   (bCurrent ? reg
12a40 53 69 7a 65 20 3a 20 30 29 0a 20 20 20 20 29 3b  Size : 0).    );
12a50 0a 20 20 20 20 69 66 28 20 61 64 64 72 4a 75 6d  .    if( addrJum
12a60 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  p ) sqlite3VdbeJ
12a70 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4a  umpHere(v, addrJ
12a80 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ump);.  }..  if(
12a90 20 62 52 65 76 65 72 73 65 3d 3d 30 20 29 7b 0a   bReverse==0 ){.
12aa0 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53 74 65      windowAggSte
12ab0 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  p(pParse, pMWin,
12ac0 20 63 73 72 4c 65 61 64 2c 20 30 2c 20 72 65 67   csrLead, 0, reg
12ad0 41 72 67 2c 20 72 65 67 53 69 7a 65 29 3b 0a 20  Arg, regSize);. 
12ae0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
12af0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
12b00 49 6d 6d 2c 20 72 65 67 43 74 72 2c 20 31 29 3b  Imm, regCtr, 1);
12b10 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12b20 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
12b30 20 63 73 72 4c 65 61 64 2c 20 61 64 64 72 4e 65   csrLead, addrNe
12b40 78 74 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  xt);.  VdbeCover
12b50 61 67 65 28 76 29 3b 0a 0a 20 20 77 69 6e 64 6f  age(v);..  windo
12b60 77 52 65 74 75 72 6e 52 6f 77 73 28 70 50 61 72  wReturnRows(pPar
12b70 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43 74  se, pMWin, regCt
12b80 72 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  r, regGosub, add
12b90 72 47 6f 73 75 62 2c 20 30 2c 20 30 29 3b 0a 0a  rGosub, 0, 0);..
12ba0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
12bb0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c  olveLabel(v, lbl
12bc0 45 6d 70 74 79 29 3b 0a 20 20 73 71 6c 69 74 65  Empty);.  sqlite
12bd0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
12be0 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
12bf0 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  MWin->iEphCsr);.
12c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12c10 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
12c20 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 29 3b  , regFlushPart);
12c30 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68  ..  /* Jump to h
12c40 65 72 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72  ere to skip over
12c50 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
12c60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
12c70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
12c80 72 47 6f 74 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  rGoto);.}.../*.*
12c90 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20  * RANGE BETWEEN 
12ca0 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44  UNBOUNDED PRECED
12cb0 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20  ING AND CURRENT 
12cc0 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 0a  ROW.**.**   ....
12cd0 2a 2a 20 20 20 20 20 69 66 28 20 6e 65 77 20 70  **     if( new p
12ce0 61 72 74 69 74 69 6f 6e 20 29 7b 0a 2a 2a 20 20  artition ){.**  
12cf0 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78       AggFinal (x
12d00 46 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 20  Finalize).**    
12d10 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f 73     Gosub addrGos
12d20 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65 73 65  ub.**       Rese
12d30 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61 62 6c  tSorter eph-tabl
12d40 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  e.**     }.**   
12d50 20 20 65 6c 73 65 20 69 66 28 20 6e 65 77 20 70    else if( new p
12d60 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  eer ){.**       
12d70 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75 65  AggFinal (xValue
12d80 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62  ).**       Gosub
12d90 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20   addrGosub.**   
12da0 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20      ResetSorter 
12db0 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20 20 20  eph-table.**    
12dc0 20 7d 0a 2a 2a 20 20 20 20 20 41 67 67 53 74 65   }.**     AggSte
12dd0 70 0a 2a 2a 20 20 20 20 20 49 6e 73 65 72 74 20  p.**     Insert 
12de0 28 72 65 63 6f 72 64 20 69 6e 74 6f 20 65 70 68  (record into eph
12df0 2d 74 61 62 6c 65 29 0a 2a 2a 20 20 20 73 71 6c  -table).**   sql
12e00 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a  ite3WhereEnd().*
12e10 2a 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 46  *   AggFinal (xF
12e20 69 6e 61 6c 69 7a 65 29 0a 2a 2a 20 20 20 47 6f  inalize).**   Go
12e30 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a  sub addrGosub.**
12e40 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45 45  .** RANGE BETWEE
12e50 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
12e60 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55 4e  EDING AND UNBOUN
12e70 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a  DED FOLLOWING.**
12e80 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c 20  .**   As above, 
12e90 65 78 63 65 70 74 20 74 61 6b 65 20 6e 6f 20 61  except take no a
12ea0 63 74 69 6f 6e 20 66 6f 72 20 61 20 22 6e 65 77  ction for a "new
12eb0 20 70 65 65 72 22 2e 20 49 6e 76 6f 6b 65 0a 2a   peer". Invoke.*
12ec0 2a 20 20 20 74 68 65 20 73 75 62 2d 72 6f 75 74  *   the sub-rout
12ed0 69 6e 65 20 6f 6e 63 65 20 6f 6e 6c 79 20 66 6f  ine once only fo
12ee0 72 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e  r each partition
12ef0 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45  ..**.** RANGE BE
12f00 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f  TWEEN CURRENT RO
12f10 57 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  W AND CURRENT RO
12f20 57 0a 2a 2a 0a 2a 2a 20 20 20 41 73 20 61 62 6f  W.**.**   As abo
12f30 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ve, except that 
12f40 74 68 65 20 22 6e 65 77 20 70 65 65 72 22 20 63  the "new peer" c
12f50 6f 6e 64 69 74 69 6f 6e 20 69 73 20 68 61 6e 64  ondition is hand
12f60 6c 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  led in the.**   
12f70 73 61 6d 65 20 77 61 79 20 61 73 20 22 6e 65 77  same way as "new
12f80 20 70 61 72 74 69 74 69 6f 6e 22 20 28 73 6f 20   partition" (so 
12f90 74 68 65 72 65 20 69 73 20 6e 6f 20 22 65 6c 73  there is no "els
12fa0 65 20 69 66 22 20 62 6c 6f 63 6b 29 2e 0a 2a 2a  e if" block)..**
12fb0 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e  .** ROWS BETWEEN
12fc0 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
12fd0 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
12fe0 20 52 4f 57 0a 2a 2a 20 0a 2a 2a 20 20 20 41 73   ROW.** .**   As
12ff0 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 61   above, except a
13000 73 73 75 6d 65 20 65 76 65 72 79 20 72 6f 77 20  ssume every row 
13010 69 73 20 61 20 22 6e 65 77 20 70 65 65 72 22 2e  is a "new peer".
13020 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13030 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c  windowCodeDefaul
13040 74 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tStep(.  Parse *
13050 70 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63  pParse, .  Selec
13060 74 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66  t *p,.  WhereInf
13070 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74  o *pWInfo,.  int
13080 20 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e   regGosub, .  in
13090 74 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20  t addrGosub.){. 
130a0 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d   Window *pMWin =
130b0 20 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65   p->pWin;.  Vdbe
130c0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
130d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
130e0 69 6e 74 20 6b 3b 0a 20 20 69 6e 74 20 69 53 75  int k;.  int iSu
130f0 62 43 73 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  bCsr = p->pSrc->
13100 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
13110 69 6e 74 20 6e 53 75 62 20 3d 20 70 2d 3e 70 53  int nSub = p->pS
13120 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 2d 3e 6e  rc->a[0].pTab->n
13130 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 65 67 20 3d  Col;.  int reg =
13140 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
13150 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
13160 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69   = reg+nSub;.  i
13170 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65  nt regRowid = re
13180 67 52 65 63 6f 72 64 2b 31 3b 0a 20 20 69 6e 74  gRecord+1;.  int
13190 20 61 64 64 72 3b 0a 20 20 45 78 70 72 4c 69 73   addr;.  ExprLis
131a0 74 20 2a 70 50 61 72 74 20 3d 20 70 4d 57 69 6e  t *pPart = pMWin
131b0 2d 3e 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20  ->pPartition;.  
131c0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
131d0 42 79 20 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  By = pMWin->pOrd
131e0 65 72 42 79 3b 0a 0a 20 20 61 73 73 65 72 74 28  erBy;..  assert(
131f0 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   pMWin->eType==T
13200 4b 5f 52 41 4e 47 45 20 0a 20 20 20 20 20 20 7c  K_RANGE .      |
13210 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74  | (pMWin->eStart
13220 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26  ==TK_UNBOUNDED &
13230 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
13240 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 29 3b 0a  K_CURRENT).  );.
13250 0a 20 20 61 73 73 65 72 74 28 20 28 70 4d 57 69  .  assert( (pMWi
13260 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
13270 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
13280 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
13290 4e 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  NT).       || (p
132a0 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
132b0 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 70 4d  _UNBOUNDED && pM
132c0 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e  Win->eEnd==TK_UN
132d0 42 4f 55 4e 44 45 44 29 0a 20 20 20 20 20 20 20  BOUNDED).       
132e0 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  || (pMWin->eStar
132f0 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26 26  t==TK_CURRENT &&
13300 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
13310 5f 43 55 52 52 45 4e 54 29 0a 20 20 20 20 20 20  _CURRENT).      
13320 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61   || (pMWin->eSta
13330 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
13340 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
13350 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 26 26 20 21  K_UNBOUNDED && !
13360 70 4f 72 64 65 72 42 79 29 0a 20 20 29 3b 0a 0a  pOrderBy).  );..
13370 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45 6e    if( pMWin->eEn
13380 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  d==TK_UNBOUNDED 
13390 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  ){.    pOrderBy 
133a0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 72  = 0;.  }..  pPar
133b0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62  se->nMem += nSub
133c0 20 2b 20 32 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64   + 2;..  /* Load
133d0 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
133e0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 6f 66  column values of
133f0 20 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65   the row returne
13400 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 73 75  d by.  ** the su
13410 62 2d 73 65 6c 65 63 74 20 69 6e 74 6f 20 61 6e  b-select into an
13420 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
13430 65 72 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  ers. */.  for(k=
13440 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b  0; k<nSub; k++){
13450 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13460 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
13470 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c  umn, iSubCsr, k,
13480 20 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 0a 20 20   reg+k);.  }..  
13490 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
134a0 20 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66   is the start of
134b0 20 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e   a new partition
134c0 20 6f 72 20 70 65 65 72 20 67 72 6f 75 70 2e 20   or peer group. 
134d0 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 74 20 7c  */.  if( pPart |
134e0 7c 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  | pOrderBy ){.  
134f0 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20 28 70    int nPart = (p
13500 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e 6e 45  Part ? pPart->nE
13510 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e  xpr : 0);.    in
13520 74 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a  t addrGoto = 0;.
13530 20 20 20 20 69 6e 74 20 61 64 64 72 4a 75 6d 70      int addrJump
13540 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50   = 0;.    int nP
13550 65 65 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20  eer = (pOrderBy 
13560 3f 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ? pOrderBy->nExp
13570 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20 69 66 28  r : 0);..    if(
13580 20 70 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20   pPart ){.      
13590 69 6e 74 20 72 65 67 4e 65 77 50 61 72 74 20 3d  int regNewPart =
135a0 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e 42   reg + pMWin->nB
135b0 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20 20 20  ufferCol;.      
135c0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
135d0 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
135e0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
135f0 50 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c  Parse, pPart, 0,
13600 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20   0);.      addr 
13610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13620 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
13630 65 2c 20 72 65 67 4e 65 77 50 61 72 74 2c 20 70  e, regNewPart, p
13640 4d 57 69 6e 2d 3e 72 65 67 50 61 72 74 2c 6e 50  MWin->regPart,nP
13650 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
13660 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
13670 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e  v, (void*)pKeyIn
13680 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
13690 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70 20  .      addrJump 
136a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
136b0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
136c0 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b  addr+2, 0, addr+
136d0 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
136e0 76 65 72 61 67 65 45 71 4e 65 28 76 29 3b 0a 20  verageEqNe(v);. 
136f0 20 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69       windowAggFi
13700 6e 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69  nal(pParse, pMWi
13710 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  n, 1);.      if(
13720 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
13730 20 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20       addrGoto = 
13740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13750 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
13760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
13770 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
13780 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4e  {.      int regN
13790 65 77 50 65 65 72 20 3d 20 72 65 67 20 2b 20 70  ewPeer = reg + p
137a0 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
137b0 20 2b 20 6e 50 61 72 74 3b 0a 20 20 20 20 20 20   + nPart;.      
137c0 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20 70 4d  int regPeer = pM
137d0 57 69 6e 2d 3e 72 65 67 50 61 72 74 20 2b 20 6e  Win->regPart + n
137e0 50 61 72 74 3b 0a 0a 20 20 20 20 20 20 69 66 28  Part;..      if(
137f0 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c 69   addrJump ) sqli
13800 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13810 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20 20  v, addrJump);.  
13820 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
13830 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29  Type==TK_RANGE )
13840 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
13850 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71  o *pKeyInfo = sq
13860 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d  lite3KeyInfoFrom
13870 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
13880 20 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 30 29   pOrderBy, 0, 0)
13890 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  ;.        addr =
138a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
138b0 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p3(v, OP_Compare
138c0 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65  , regNewPeer, re
138d0 67 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a 20  gPeer, nPeer);. 
138e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
138f0 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76  beAppendP4(v, (v
13900 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  oid*)pKeyInfo, P
13910 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
13920 20 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73      addrJump = s
13930 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13940 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
13950 72 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b  r+2, 0, addr+2);
13960 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76  .        VdbeCov
13970 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
13980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
13990 64 64 72 4a 75 6d 70 20 3d 20 30 3b 0a 20 20 20  ddrJump = 0;.   
139a0 20 20 20 7d 0a 20 20 20 20 20 20 77 69 6e 64 6f     }.      windo
139b0 77 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65  wAggFinal(pParse
139c0 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e 2d 3e  , pMWin, pMWin->
139d0 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45  eStart==TK_CURRE
139e0 4e 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  NT);.      if( a
139f0 64 64 72 47 6f 74 6f 20 29 20 73 71 6c 69 74 65  ddrGoto ) sqlite
13a00 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
13a10 20 61 64 64 72 47 6f 74 6f 29 3b 0a 20 20 20 20   addrGoto);.    
13a20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  }..    sqlite3Vd
13a30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
13a40 65 77 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45  ewind, pMWin->iE
13a50 70 68 43 73 72 2c 73 71 6c 69 74 65 33 56 64 62  phCsr,sqlite3Vdb
13a60 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
13a70 33 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  3);.    VdbeCove
13a80 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
13a90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13aa0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47  , OP_Gosub, regG
13ab0 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
13ac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13ad0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
13ae0 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  xt, pMWin->iEphC
13af0 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  sr, sqlite3VdbeC
13b00 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29  urrentAddr(v)-1)
13b10 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
13b20 67 65 28 76 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ge(v);..    sqli
13b30 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13b40 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c   OP_ResetSorter,
13b50 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
13b60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13b70 65 41 64 64 4f 70 33 28 0a 20 20 20 20 20 20 20  eAddOp3(.       
13b80 20 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67   v, OP_Copy, reg
13b90 2b 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43  +pMWin->nBufferC
13ba0 6f 6c 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  ol, pMWin->regPa
13bb0 72 74 2c 20 6e 50 61 72 74 2b 6e 50 65 65 72 2d  rt, nPart+nPeer-
13bc0 31 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66  1.    );..    if
13bd0 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c  ( addrJump ) sql
13be0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
13bf0 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20  (v, addrJump);. 
13c00 20 7d 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20   }..  /* Invoke 
13c10 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 66 6f  step function fo
13c20 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  r window functio
13c30 6e 73 20 2a 2f 0a 20 20 77 69 6e 64 6f 77 41 67  ns */.  windowAg
13c40 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d  gStep(pParse, pM
13c50 57 69 6e 2c 20 2d 31 2c 20 30 2c 20 72 65 67 2c  Win, -1, 0, reg,
13c60 20 30 29 3b 0a 0a 20 20 2f 2a 20 42 75 66 66 65   0);..  /* Buffe
13c70 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
13c80 77 20 69 6e 20 74 68 65 20 65 70 68 65 6d 65 72  w in the ephemer
13c90 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 69  al table. */.  i
13ca0 66 28 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65  f( pMWin->nBuffe
13cb0 72 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 73 71  rCol>0 ){.    sq
13cc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13cd0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
13ce0 2c 20 72 65 67 2c 20 70 4d 57 69 6e 2d 3e 6e 42  , reg, pMWin->nB
13cf0 75 66 66 65 72 43 6f 6c 2c 20 72 65 67 52 65 63  ufferCol, regRec
13d00 6f 72 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ord);.  }else{. 
13d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13d20 64 4f 70 32 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp2(v, OP_Blob,
13d30 20 30 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a   0, regRecord);.
13d40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13d50 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
13d60 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  *)"", 0);.  }.  
13d70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13d80 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
13d90 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  , pMWin->iEphCsr
13da0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 73  , regRowid);.  s
13db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
13dc0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
13dd0 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72  MWin->iEphCsr, r
13de0 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  egRecord, regRow
13df0 69 64 29 3b 0a 0a 20 20 2f 2a 20 45 6e 64 20 74  id);..  /* End t
13e00 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
13e10 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 73 71 6c 69   loop. */.  sqli
13e20 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
13e30 66 6f 29 3b 0a 0a 20 20 77 69 6e 64 6f 77 41 67  fo);..  windowAg
13e40 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c 20 70  gFinal(pParse, p
13e50 4d 57 69 6e 2c 20 31 29 3b 0a 20 20 73 71 6c 69  MWin, 1);.  sqli
13e60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13e70 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4d 57 69   OP_Rewind, pMWi
13e80 6e 2d 3e 69 45 70 68 43 73 72 2c 73 71 6c 69 74  n->iEphCsr,sqlit
13e90 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
13ea0 72 28 76 29 2b 33 29 3b 0a 20 20 56 64 62 65 43  r(v)+3);.  VdbeC
13eb0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
13ec0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13ed0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
13ee0 47 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62  Gosub, addrGosub
13ef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
13f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
13f10 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73  t, pMWin->iEphCs
13f20 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  r, sqlite3VdbeCu
13f30 72 72 65 6e 74 41 64 64 72 28 76 29 2d 31 29 3b  rrentAddr(v)-1);
13f40 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
13f50 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  v);.}../*.** All
13f60 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
13f70 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
13f80 74 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63  the Window objec
13f90 74 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  t indicated by t
13fa0 68 65 0a 2a 2a 20 74 68 69 72 64 20 61 72 67 75  he.** third argu
13fb0 6d 65 6e 74 2e 20 53 65 74 20 74 68 65 20 57 69  ment. Set the Wi
13fc0 6e 64 6f 77 2e 70 4f 77 6e 65 72 20 66 69 65 6c  ndow.pOwner fiel
13fd0 64 20 6f 66 20 74 68 65 20 6e 65 77 20 6f 62 6a  d of the new obj
13fe0 65 63 74 20 74 6f 0a 2a 2a 20 70 4f 77 6e 65 72  ect to.** pOwner
13ff0 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73 71 6c  ..*/.Window *sql
14000 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28 73 71  ite3WindowDup(sq
14010 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20  lite3 *db, Expr 
14020 2a 70 4f 77 6e 65 72 2c 20 57 69 6e 64 6f 77 20  *pOwner, Window 
14030 2a 70 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70  *p){.  Window *p
14040 4e 65 77 20 3d 20 30 3b 0a 20 20 69 66 28 20 41  New = 0;.  if( A
14050 4c 57 41 59 53 28 70 29 20 29 7b 0a 20 20 20 20  LWAYS(p) ){.    
14060 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
14070 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
14080 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b 0a  izeof(Window));.
14090 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
140a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d        pNew->zNam
140b0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
140c0 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d 65  Dup(db, p->zName
140d0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
140e0 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
140f0 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
14100 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Filter, 0);.    
14110 20 20 70 4e 65 77 2d 3e 70 46 75 6e 63 20 3d 20    pNew->pFunc = 
14120 70 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p->pFunc;.      
14130 70 4e 65 77 2d 3e 70 50 61 72 74 69 74 69 6f 6e  pNew->pPartition
14140 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
14150 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 50 61  stDup(db, p->pPa
14160 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
14170 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42     pNew->pOrderB
14180 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
14190 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 4f  istDup(db, p->pO
141a0 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
141b0 20 20 70 4e 65 77 2d 3e 65 54 79 70 65 20 3d 20    pNew->eType = 
141c0 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20  p->eType;.      
141d0 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20 70 2d 3e  pNew->eEnd = p->
141e0 65 45 6e 64 3b 0a 20 20 20 20 20 20 70 4e 65 77  eEnd;.      pNew
141f0 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d 3e 65 53  ->eStart = p->eS
14200 74 61 72 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  tart;.      pNew
14210 2d 3e 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74  ->pStart = sqlit
14220 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d  e3ExprDup(db, p-
14230 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 20  >pStart, 0);.   
14240 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64 20 3d 20     pNew->pEnd = 
14250 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
14260 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30 29 3b 0a  b, p->pEnd, 0);.
14270 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 77 6e        pNew->pOwn
14280 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a 20 20 20  er = pOwner;.   
14290 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
142a0 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pNew;.}../*.** R
142b0 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
142c0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
142d0 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
142e0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  s passed as the.
142f0 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
14300 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77 20 2a 73  nt..*/.Window *s
14310 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 73 74  qlite3WindowList
14320 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
14330 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 57   Window *p){.  W
14340 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 57  indow *pWin;.  W
14350 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d 20 30 3b  indow *pRet = 0;
14360 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70 20 3d  .  Window **pp =
14370 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f 72 28 70   &pRet;..  for(p
14380 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20 70 57 69  Win=p; pWin; pWi
14390 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e  n=pWin->pNextWin
143a0 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 73 71 6c  ){.    *pp = sql
143b0 69 74 65 33 57 69 6e 64 6f 77 44 75 70 28 64 62  ite3WindowDup(db
143c0 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20  , 0, pWin);.    
143d0 69 66 28 20 2a 70 70 3d 3d 30 20 29 20 62 72 65  if( *pp==0 ) bre
143e0 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20 26 28 28  ak;.    pp = &((
143f0 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e 29 3b  *pp)->pNextWin);
14400 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
14410 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  Ret;.}../*.** sq
14420 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
14430 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  ) has already be
14440 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  en called for th
14450 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
14460 6e 74 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  nt .** passed as
14470 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14480 6d 65 6e 74 20 77 68 65 6e 20 74 68 69 73 20 66  ment when this f
14490 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
144a0 65 64 2e 20 49 74 20 67 65 6e 65 72 61 74 65 73  ed. It generates
144b0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 70 6f 70 75  .** code to popu
144c0 6c 61 74 65 20 74 68 65 20 57 69 6e 64 6f 77 2e  late the Window.
144d0 72 65 67 52 65 73 75 6c 74 20 72 65 67 69 73 74  regResult regist
144e0 65 72 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  er for each wind
144f0 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  ow function and.
14500 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 73 75  ** invoke the su
14510 62 2d 72 6f 75 74 69 6e 65 20 61 74 20 69 6e 73  b-routine at ins
14520 74 72 75 63 74 69 6f 6e 20 61 64 64 72 47 6f 73  truction addrGos
14530 75 62 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ub once for each
14540 20 72 6f 77 2e 0a 2a 2a 20 54 68 69 73 20 66 75   row..** This fu
14550 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c  nction calls sql
14560 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 62  ite3WhereEnd() b
14570 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
14580 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
14590 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28  3WindowCodeStep(
145a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
145b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
145c0 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
145d0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
145e0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
145f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 77 72           /* Rewr
14600 69 74 74 65 6e 20 53 45 4c 45 43 54 20 73 74 61  itten SELECT sta
14610 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57 68 65 72  tement */.  Wher
14620 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20  eInfo *pWInfo,  
14630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
14640 6f 6e 74 65 78 74 20 72 65 74 75 72 6e 65 64 20  ontext returned 
14650 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
14660 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  egin() */.  int 
14670 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20 20  regGosub,       
14680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14690 65 67 69 73 74 65 72 20 66 6f 72 20 4f 50 5f 47  egister for OP_G
146a0 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74 20 61 64  osub */.  int ad
146b0 64 72 47 6f 73 75 62 20 20 20 20 20 20 20 20 20  drGosub         
146c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f            /* OP_
146d0 47 6f 73 75 62 20 68 65 72 65 20 74 6f 20 72 65  Gosub here to re
146e0 74 75 72 6e 20 65 61 63 68 20 72 6f 77 20 2a 2f  turn each row */
146f0 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  .){.  Window *pM
14700 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 0a  Win = p->pWin;..
14710 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 74    /* There are t
14720 68 72 65 65 20 64 69 66 66 65 72 65 6e 74 20 66  hree different f
14730 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 61  unctions that ma
14740 79 20 62 65 20 75 73 65 64 20 74 6f 20 64 6f 20  y be used to do 
14750 74 68 65 20 77 6f 72 6b 0a 20 20 2a 2a 20 6f 66  the work.  ** of
14760 20 74 68 69 73 20 6f 6e 65 2c 20 64 65 70 65 6e   this one, depen
14770 64 69 6e 67 20 6f 6e 20 74 68 65 20 77 69 6e 64  ding on the wind
14780 6f 77 20 66 72 61 6d 65 20 61 6e 64 20 74 68 65  ow frame and the
14790 20 73 70 65 63 69 66 69 63 20 62 75 69 6c 74 2d   specific built-
147a0 69 6e 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 20 66  in.  ** window f
147b0 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 28 69  unctions used (i
147c0 66 20 61 6e 79 29 2e 0a 20 20 2a 2a 0a 20 20 2a  f any)..  **.  *
147d0 2a 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45  * windowCodeRowE
147e0 78 70 72 53 74 65 70 28 29 20 68 61 6e 64 6c 65  xprStep() handle
147f0 73 20 61 6c 6c 20 22 52 4f 57 53 22 20 77 69 6e  s all "ROWS" win
14800 64 6f 77 20 66 72 61 6d 65 73 2c 20 65 78 63 65  dow frames, exce
14810 70 74 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a  pt for:.  **.  *
14820 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
14830 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
14840 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
14850 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   ROW.  **.  ** T
14860 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
14870 62 65 63 61 75 73 65 20 77 69 6e 64 6f 77 43 6f  because windowCo
14880 64 65 52 6f 77 45 78 70 72 53 74 65 70 28 29 20  deRowExprStep() 
14890 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6c 6c 20 77  implements all w
148a0 69 6e 64 6f 77 0a 20 20 2a 2a 20 66 72 61 6d 65  indow.  ** frame
148b0 20 74 79 70 65 73 20 62 79 20 63 61 63 68 69 6e   types by cachin
148c0 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72  g the entire par
148d0 74 69 74 69 6f 6e 20 69 6e 20 61 20 74 65 6d 70  tition in a temp
148e0 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20 20 2a 2a   table, and.  **
148f0 20 22 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55   "ROWS BETWEEN U
14900 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
14910 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  NG AND CURRENT R
14920 4f 57 22 20 69 73 20 65 61 73 79 20 65 6e 6f 75  OW" is easy enou
14930 67 68 20 74 6f 0a 20 20 2a 2a 20 69 6d 70 6c 65  gh to.  ** imple
14940 6d 65 6e 74 20 77 69 74 68 6f 75 74 20 73 75 63  ment without suc
14950 68 20 61 20 63 61 63 68 65 2e 0a 20 20 2a 2a 0a  h a cache..  **.
14960 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65 43    ** windowCodeC
14970 61 63 68 65 53 74 65 70 28 29 20 69 73 20 75 73  acheStep() is us
14980 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a  ed for:.  **.  *
14990 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45  *   RANGE BETWEE
149a0 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 41 4e  N CURRENT ROW AN
149b0 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c  D UNBOUNDED FOLL
149c0 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a 20  OWING.  **.  ** 
149d0 49 74 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  It is also used 
149e0 66 6f 72 20 61 6e 79 74 68 69 6e 67 20 6e 6f 74  for anything not
149f0 20 68 61 6e 64 6c 65 64 20 62 79 20 77 69 6e 64   handled by wind
14a00 6f 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65  owCodeRowExprSte
14a10 70 28 29 20 0a 20 20 2a 2a 20 74 68 61 74 20 69  p() .  ** that i
14a20 6e 76 6f 6b 65 73 20 61 20 62 75 69 6c 74 2d 69  nvokes a built-i
14a30 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  n window functio
14a40 6e 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  n that requires 
14a50 74 68 65 20 65 6e 74 69 72 65 20 0a 20 20 2a 2a  the entire .  **
14a60 20 70 61 72 74 69 74 69 6f 6e 20 74 6f 20 62 65   partition to be
14a70 20 63 61 63 68 65 64 20 69 6e 20 61 20 74 65 6d   cached in a tem
14a80 70 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 61  p table before a
14a90 6e 79 20 72 6f 77 73 20 61 72 65 20 72 65 74 75  ny rows are retu
14aa0 72 6e 65 64 0a 20 20 2a 2a 20 28 65 2e 67 2e 20  rned.  ** (e.g. 
14ab0 6e 74 68 5f 76 61 6c 75 65 28 29 20 6f 72 20 70  nth_value() or p
14ac0 65 72 63 65 6e 74 5f 72 61 6e 6b 28 29 29 2e 0a  ercent_rank())..
14ad0 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 6e 61 6c 6c    **.  ** Finall
14ae0 79 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 72  y, assuming ther
14af0 65 20 69 73 20 6e 6f 20 62 75 69 6c 74 2d 69 6e  e is no built-in
14b00 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
14b10 20 74 68 61 74 20 72 65 71 75 69 72 65 73 0a 20   that requires. 
14b20 20 2a 2a 20 74 68 65 20 70 61 72 74 69 74 69 6f   ** the partitio
14b30 6e 20 74 6f 20 62 65 20 63 61 63 68 65 64 2c 20  n to be cached, 
14b40 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c  windowCodeDefaul
14b50 74 53 74 65 70 28 29 20 69 73 20 75 73 65 64 20  tStep() is used 
14b60 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  for:.  **.  **  
14b70 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 55   RANGE BETWEEN U
14b80 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49  NBOUNDED PRECEDI
14b90 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52  NG AND CURRENT R
14ba0 4f 57 20 0a 20 20 2a 2a 20 20 20 52 41 4e 47 45  OW .  **   RANGE
14bb0 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
14bc0 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
14bd0 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f   UNBOUNDED FOLLO
14be0 57 49 4e 47 0a 20 20 2a 2a 20 20 20 52 41 4e 47  WING.  **   RANG
14bf0 45 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e  E BETWEEN CURREN
14c00 54 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e  T ROW AND CURREN
14c10 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52 4f  T ROW .  **   RO
14c20 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  WS BETWEEN UNBOU
14c30 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
14c40 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 20  ND CURRENT ROW. 
14c50 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43   **.  ** windowC
14c60 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 29  odeDefaultStep()
14c70 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65   is the only one
14c80 20 6f 66 20 74 68 65 20 74 68 72 65 65 20 66 75   of the three fu
14c90 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 20 20 2a  nctions that.  *
14ca0 2a 20 64 6f 65 73 20 6e 6f 74 20 63 61 63 68 65  * does not cache
14cb0 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20   each partition 
14cc0 69 6e 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  in a temp table 
14cd0 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67  before beginning
14ce0 20 74 6f 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20   to.  ** return 
14cf0 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rows..  */.  if(
14d00 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   pMWin->eType==T
14d10 4b 5f 52 4f 57 53 20 0a 20 20 20 26 26 20 28 70  K_ROWS .   && (p
14d20 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b  MWin->eStart!=TK
14d30 5f 55 4e 42 4f 55 4e 44 45 44 7c 7c 70 4d 57 69  _UNBOUNDED||pMWi
14d40 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43 55 52 52  n->eEnd!=TK_CURR
14d50 45 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e 70 4f 72  ENT||!pMWin->pOr
14d60 64 65 72 42 79 29 0a 20 20 29 7b 0a 20 20 20 20  derBy).  ){.    
14d70 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
14d80 20 20 69 6e 74 20 62 43 61 63 68 65 20 3d 20 30    int bCache = 0
14d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14da0 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 43  /* True to use C
14db0 61 63 68 65 53 74 65 70 28 29 20 2a 2f 0a 20 20  acheStep() */.  
14dc0 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
14dd0 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
14de0 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
14df0 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 46 75      FuncDef *pFu
14e00 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63  nc = pWin->pFunc
14e10 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 46 75  ;.      if( (pFu
14e20 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
14e30 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
14e40 4f 57 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  OW_SIZE).       
14e50 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
14e60 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65  e==nth_valueName
14e70 29 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46  ).        || (pF
14e80 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73  unc->zName==firs
14e90 74 5f 76 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20  t_valueName).   
14ea0 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e       || (pFunc->
14eb0 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 29  zName==leadName)
14ec0 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75  .        || (pFu
14ed0 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61  nc->zName==lagNa
14ee0 6d 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  me).      ){.   
14ef0 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b       bCache = 1;
14f00 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
14f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14f20 20 20 69 66 28 20 62 43 61 63 68 65 20 0a 20 20    if( bCache .  
14f30 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65 53 74    || (pMWin->eSt
14f40 61 72 74 21 3d 54 4b 5f 50 52 45 43 45 44 49 4e  art!=TK_PRECEDIN
14f50 47 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61  G && pMWin->eSta
14f60 72 74 21 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt!=TK_FOLLOWING
14f70 29 0a 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d  ).    || (pMWin-
14f80 3e 65 45 6e 64 21 3d 54 4b 5f 46 4f 4c 4c 4f 57  >eEnd!=TK_FOLLOW
14f90 49 4e 47 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  ING && pMWin->eE
14fa0 6e 64 21 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd!=TK_PRECEDING
14fb0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
14fc0 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
14fd0 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t((pParse->pVdbe
14fe0 2c 20 22 42 65 67 69 6e 20 52 6f 77 45 78 70 72  , "Begin RowExpr
14ff0 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20 20  Step()"));.     
15000 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78   windowCodeRowEx
15010 70 72 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  prStep(pParse, p
15020 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73  , pWInfo, regGos
15030 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
15040 20 20 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65        VdbeModule
15050 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d  Comment((pParse-
15060 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 52 6f 77  >pVdbe, "End Row
15070 45 78 70 72 53 74 65 70 28 29 22 29 29 3b 0a 20  ExprStep()"));. 
15080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15090 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
150a0 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t((pParse->pVdbe
150b0 2c 20 22 42 65 67 69 6e 20 77 69 6e 64 6f 77 43  , "Begin windowC
150c0 6f 64 65 53 74 65 70 28 29 22 29 29 3b 0a 20 20  odeStep()"));.  
150d0 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 53 74      windowCodeSt
150e0 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57  ep(pParse, p, pW
150f0 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20  Info, regGosub, 
15100 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20  addrGosub);.    
15110 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d    VdbeModuleComm
15120 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64  ent((pParse->pVd
15130 62 65 2c 20 22 45 6e 64 20 77 69 6e 64 6f 77 43  be, "End windowC
15140 6f 64 65 53 74 65 70 28 29 22 29 29 3b 0a 20 20  odeStep()"));.  
15150 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
15160 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
15170 20 20 20 69 6e 74 20 62 43 61 63 68 65 20 3d 20     int bCache = 
15180 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15190 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
151a0 43 61 63 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a  CacheStep() */..
151b0 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65      if( pMWin->e
151c0 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e  Start==TK_CURREN
151d0 54 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64  T && pMWin->eEnd
151e0 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29  ==TK_UNBOUNDED )
151f0 7b 0a 20 20 20 20 20 20 62 43 61 63 68 65 20 3d  {.      bCache =
15200 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
15210 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d       for(pWin=pM
15220 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
15230 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
15240 0a 20 20 20 20 20 20 20 20 46 75 6e 63 44 65 66  .        FuncDef
15250 20 2a 70 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e   *pFunc = pWin->
15260 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 69  pFunc;.        i
15270 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  f( (pFunc->funcF
15280 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
15290 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a  NC_WINDOW_SIZE).
152a0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 46 75           || (pFu
152b0 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76  nc->zName==nth_v
152c0 61 6c 75 65 4e 61 6d 65 29 0a 20 20 20 20 20 20  alueName).      
152d0 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e     || (pFunc->zN
152e0 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65  ame==first_value
152f0 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 7c  Name).         |
15300 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  | (pFunc->zName=
15310 3d 6c 65 61 64 4e 61 6d 65 29 0a 20 20 20 20 20  =leadName).     
15320 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a      || (pFunc->z
15330 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20  Name==lagName). 
15340 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
15350 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b 0a      bCache = 1;.
15360 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15380 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
15390 20 4f 74 68 65 72 77 69 73 65 2c 20 63 61 6c 6c   Otherwise, call
153a0 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75   windowCodeDefau
153b0 6c 74 53 74 65 70 28 29 2e 20 20 2a 2f 0a 20 20  ltStep().  */.  
153c0 20 20 69 66 28 20 62 43 61 63 68 65 20 29 7b 0a    if( bCache ){.
153d0 20 20 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65        VdbeModule
153e0 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d  Comment((pParse-
153f0 3e 70 56 64 62 65 2c 20 22 42 65 67 69 6e 20 43  >pVdbe, "Begin C
15400 61 63 68 65 53 74 65 70 28 29 22 29 29 3b 0a 20  acheStep()"));. 
15410 20 20 20 20 20 77 69 6e 64 6f 77 43 6f 64 65 43       windowCodeC
15420 61 63 68 65 53 74 65 70 28 70 50 61 72 73 65 2c  acheStep(pParse,
15430 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47   p, pWInfo, regG
15440 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
15450 3b 0a 20 20 20 20 20 20 56 64 62 65 4d 6f 64 75  ;.      VdbeModu
15460 6c 65 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73  leComment((pPars
15470 65 2d 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 43  e->pVdbe, "End C
15480 61 63 68 65 53 74 65 70 28 29 22 29 29 3b 0a 20  acheStep()"));. 
15490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
154a0 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
154b0 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t((pParse->pVdbe
154c0 2c 20 22 42 65 67 69 6e 20 44 65 66 61 75 6c 74  , "Begin Default
154d0 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20 20  Step()"));.     
154e0 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75   windowCodeDefau
154f0 6c 74 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ltStep(pParse, p
15500 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73  , pWInfo, regGos
15510 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
15520 20 20 20 20 20 20 56 64 62 65 4d 6f 64 75 6c 65        VdbeModule
15530 43 6f 6d 6d 65 6e 74 28 28 70 50 61 72 73 65 2d  Comment((pParse-
15540 3e 70 56 64 62 65 2c 20 22 45 6e 64 20 44 65 66  >pVdbe, "End Def
15550 61 75 6c 74 53 74 65 70 28 29 22 29 29 3b 0a 20  aultStep()"));. 
15560 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64     }.  }.}..#end
15570 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15580 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.