/ Hex Artifact Content
Login

Artifact 4b503da928dace3e845b891381a4d98eeb8c5744313ae3643df8d8d21fdcca65:


0000: 2f 2a 0a 2a 2a 20 32 30 31 38 20 4d 61 79 20 30  /*.** 2018 May 0
0010: 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  8.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0180: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e  liteInt.h"..#ifn
0190: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
01a0: 57 49 4e 44 4f 57 46 55 4e 43 0a 0a 2f 2a 0a 2a  WINDOWFUNC../*.*
01b0: 2a 20 53 45 4c 45 43 54 20 52 45 57 52 49 54 49  * SELECT REWRITI
01c0: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41 6e 79 20 53  NG.**.**   Any S
01d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
01e0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  that contains on
01f0: 65 20 6f 72 20 6d 6f 72 65 20 77 69 6e 64 6f 77  e or more window
0200: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 0a 2a 2a   functions in.**
0210: 20 20 20 65 69 74 68 65 72 20 74 68 65 20 73 65     either the se
0220: 6c 65 63 74 20 6c 69 73 74 20 6f 72 20 4f 52 44  lect list or ORD
0230: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 74 68  ER BY clause (th
0240: 65 20 6f 6e 6c 79 20 74 77 6f 20 70 6c 61 63 65  e only two place
0250: 73 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75  s window.**   fu
0260: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 75  nctions may be u
0270: 73 65 64 29 20 69 73 20 74 72 61 6e 73 66 6f 72  sed) is transfor
0280: 6d 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e 20  med by function 
0290: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65 77  sqlite3WindowRew
02a0: 72 69 74 65 28 29 0a 2a 2a 20 20 20 69 6e 20 6f  rite().**   in o
02b0: 72 64 65 72 20 74 6f 20 73 75 70 70 6f 72 74 20  rder to support 
02c0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
02d0: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 6f 72 20  processing. For 
02e0: 65 78 61 6d 70 6c 65 2c 20 77 69 74 68 20 74 68  example, with th
02f0: 65 0a 2a 2a 20 20 20 73 63 68 65 6d 61 3a 0a 2a  e.**   schema:.*
0300: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
0310: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
0320: 2c 20 64 2c 20 65 2c 20 66 2c 20 67 29 3b 0a 2a  , d, e, f, g);.*
0330: 2a 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 74 65  *.**   the state
0340: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
0350: 53 45 4c 45 43 54 20 61 2b 31 2c 20 6d 61 78 28  SELECT a+1, max(
0360: 62 29 20 4f 56 45 52 20 28 50 41 52 54 49 54 49  b) OVER (PARTITI
0370: 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20 42 59  ON BY c ORDER BY
0380: 20 64 29 20 46 52 4f 4d 20 74 31 20 4f 52 44 45   d) FROM t1 ORDE
0390: 52 20 42 59 20 65 3b 0a 2a 2a 0a 2a 2a 20 20 20  R BY e;.**.**   
03a0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
03b0: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  o:.**.**     SEL
03c0: 45 43 54 20 61 2b 31 2c 20 6d 61 78 28 62 29 20  ECT a+1, max(b) 
03d0: 4f 56 45 52 20 28 50 41 52 54 49 54 49 4f 4e 20  OVER (PARTITION 
03e0: 42 59 20 63 20 4f 52 44 45 52 20 42 59 20 64 29  BY c ORDER BY d)
03f0: 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 20   FROM (.**      
0400: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 65 2c 20     SELECT a, e, 
0410: 63 2c 20 64 2c 20 62 20 46 52 4f 4d 20 74 31 20  c, d, b FROM t1 
0420: 4f 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a  ORDER BY c, d.**
0430: 20 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20       ) ORDER BY 
0440: 65 3b 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e;.**.**   The f
0450: 6c 61 74 74 65 6e 69 6e 67 20 6f 70 74 69 6d 69  lattening optimi
0460: 7a 61 74 69 6f 6e 20 69 73 20 64 69 73 61 62 6c  zation is disabl
0470: 65 64 20 77 68 65 6e 20 70 72 6f 63 65 73 73 69  ed when processi
0480: 6e 67 20 74 68 69 73 20 74 72 61 6e 73 66 6f 72  ng this transfor
0490: 6d 65 64 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  med.**   SELECT 
04a0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
04b0: 61 6c 6c 6f 77 73 20 74 68 65 20 69 6d 70 6c 65  allows the imple
04c0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
04d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
04e0: 0a 2a 2a 20 20 20 28 69 6e 20 74 68 69 73 20 63  .**   (in this c
04f0: 61 73 65 20 6d 61 78 28 29 29 20 74 6f 20 70 72  ase max()) to pr
0500: 6f 63 65 73 73 20 72 6f 77 73 20 73 6f 72 74 65  ocess rows sorte
0510: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 28 63  d in order of (c
0520: 2c 20 64 29 2c 20 77 68 69 63 68 0a 2a 2a 20 20  , d), which.**  
0530: 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 65 61   makes things ea
0540: 73 69 65 72 20 66 6f 72 20 6f 62 76 69 6f 75 73  sier for obvious
0550: 20 72 65 61 73 6f 6e 73 2e 20 4d 6f 72 65 20 67   reasons. More g
0560: 65 6e 65 72 61 6c 6c 79 3a 0a 2a 2a 0a 2a 2a 20  enerally:.**.** 
0570: 20 20 20 20 2a 20 46 52 4f 4d 2c 20 57 48 45 52      * FROM, WHER
0580: 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  E, GROUP BY and 
0590: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 61  HAVING clauses a
05a0: 72 65 20 61 6c 6c 20 6d 6f 76 65 64 20 74 6f 20  re all moved to 
05b0: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 75  .**       the su
05c0: 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
05d0: 20 20 20 2a 20 4f 52 44 45 52 20 42 59 2c 20 4c     * ORDER BY, L
05e0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
05f0: 72 65 6d 61 69 6e 20 70 61 72 74 20 6f 66 20 74  remain part of t
0600: 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e  he parent query.
0610: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 65 72  .**.**     * Ter
0620: 6d 69 6e 61 6c 73 20 66 72 6f 6d 20 65 61 63 68  minals from each
0630: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
0640: 6f 6e 20 74 72 65 65 73 20 74 68 61 74 20 6d 61  on trees that ma
0650: 6b 65 20 75 70 20 74 68 65 20 0a 2a 2a 20 20 20  ke up the .**   
0660: 20 20 20 20 73 65 6c 65 63 74 2d 6c 69 73 74 20      select-list 
0670: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 65 78 70  and ORDER BY exp
0680: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
0690: 70 61 72 65 6e 74 20 71 75 65 72 79 20 61 72 65  parent query are
06a0: 0a 2a 2a 20 20 20 20 20 20 20 73 65 6c 65 63 74  .**       select
06b0: 65 64 20 62 79 20 74 68 65 20 73 75 62 2d 71 75  ed by the sub-qu
06c0: 65 72 79 2e 20 46 6f 72 20 74 68 65 20 70 75 72  ery. For the pur
06d0: 70 6f 73 65 73 20 6f 66 20 74 68 65 20 74 72 61  poses of the tra
06e0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 0a 2a 2a 20  nsformation,.** 
06f0: 20 20 20 20 20 20 74 65 72 6d 69 6e 61 6c 73 20        terminals 
0700: 61 72 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  are column refer
0710: 65 6e 63 65 73 20 61 6e 64 20 61 67 67 72 65 67  ences and aggreg
0720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
0730: 2a 0a 2a 2a 20 20 20 49 66 20 74 68 65 72 65 20  *.**   If there 
0740: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
0750: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
0760: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 74   in the SELECT t
0770: 68 61 74 20 75 73 65 73 0a 2a 2a 20 20 20 74 68  hat uses.**   th
0780: 65 20 73 61 6d 65 20 77 69 6e 64 6f 77 20 64 65  e same window de
0790: 63 6c 61 72 61 74 69 6f 6e 20 28 74 68 65 20 4f  claration (the O
07a0: 56 45 52 20 62 69 74 29 2c 20 74 68 65 6e 20 61  VER bit), then a
07b0: 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 6d 61 79   single scan may
07c0: 0a 2a 2a 20 20 20 62 65 20 75 73 65 64 20 74 6f  .**   be used to
07d0: 20 70 72 6f 63 65 73 73 20 6d 6f 72 65 20 74 68   process more th
07e0: 61 6e 20 6f 6e 65 20 77 69 6e 64 6f 77 20 66 75  an one window fu
07f0: 6e 63 74 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d  nction. For exam
0800: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ple:.**.**     S
0810: 45 4c 45 43 54 20 6d 61 78 28 62 29 20 4f 56 45  ELECT max(b) OVE
0820: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0830: 63 20 4f 52 44 45 52 20 42 59 20 64 29 2c 20 0a  c ORDER BY d), .
0840: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 6d 69  **            mi
0850: 6e 28 65 29 20 4f 56 45 52 20 28 50 41 52 54 49  n(e) OVER (PARTI
0860: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0870: 42 59 20 64 29 20 0a 2a 2a 20 20 20 20 20 46 52  BY d) .**     FR
0880: 4f 4d 20 74 31 3b 0a 2a 2a 0a 2a 2a 20 20 20 69  OM t1;.**.**   i
0890: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
08a0: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
08b0: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
08c0: 76 65 2e 20 48 6f 77 65 76 65 72 3a 0a 2a 2a 0a  ve. However:.**.
08d0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 6d 61  **     SELECT ma
08e0: 78 28 62 29 20 4f 56 45 52 20 28 50 41 52 54 49  x(b) OVER (PARTI
08f0: 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45 52 20  TION BY c ORDER 
0900: 42 59 20 64 29 2c 20 0a 2a 2a 20 20 20 20 20 20  BY d), .**      
0910: 20 20 20 20 20 20 6d 69 6e 28 65 29 20 4f 56 45        min(e) OVE
0920: 52 20 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20  R (PARTITION BY 
0930: 61 20 4f 52 44 45 52 20 42 59 20 62 29 20 0a 2a  a ORDER BY b) .*
0940: 2a 20 20 20 20 20 46 52 4f 4d 20 74 31 3b 0a 2a  *     FROM t1;.*
0950: 2a 0a 2a 2a 20 20 20 4d 75 73 74 20 62 65 20 74  *.**   Must be t
0960: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 2a  ransformed to:.*
0970: 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
0980: 6d 61 78 28 62 29 20 4f 56 45 52 20 28 50 41 52  max(b) OVER (PAR
0990: 54 49 54 49 4f 4e 20 42 59 20 63 20 4f 52 44 45  TITION BY c ORDE
09a0: 52 20 42 59 20 64 29 20 46 52 4f 4d 20 28 0a 2a  R BY d) FROM (.*
09b0: 2a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  *         SELECT
09c0: 20 65 2c 20 6d 69 6e 28 65 29 20 4f 56 45 52 20   e, min(e) OVER 
09d0: 28 50 41 52 54 49 54 49 4f 4e 20 42 59 20 61 20  (PARTITION BY a 
09e0: 4f 52 44 45 52 20 42 59 20 62 29 2c 20 63 2c 20  ORDER BY b), c, 
09f0: 64 2c 20 62 20 46 52 4f 4d 0a 2a 2a 20 20 20 20  d, b FROM.**    
0a00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
0a10: 20 65 2c 20 63 2c 20 64 2c 20 62 20 46 52 4f 4d   e, c, d, b FROM
0a20: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2c 20   t1 ORDER BY a, 
0a30: 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 29 20 4f  b.**         ) O
0a40: 52 44 45 52 20 42 59 20 63 2c 20 64 0a 2a 2a 20  RDER BY c, d.** 
0a50: 20 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 65      ) ORDER BY e
0a60: 3b 0a 2a 2a 0a 2a 2a 20 20 20 73 6f 20 74 68 61  ;.**.**   so tha
0a70: 74 20 62 6f 74 68 20 6d 69 6e 28 29 20 61 6e 64  t both min() and
0a80: 20 6d 61 78 28 29 20 6d 61 79 20 70 72 6f 63 65   max() may proce
0a90: 73 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  ss rows in the o
0aa0: 72 64 65 72 20 64 65 66 69 6e 65 64 20 62 79 0a  rder defined by.
0ab0: 2a 2a 20 20 20 74 68 65 69 72 20 72 65 73 70 65  **   their respe
0ac0: 63 74 69 76 65 20 77 69 6e 64 6f 77 20 64 65 63  ctive window dec
0ad0: 6c 61 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  larations..**.**
0ae0: 20 49 4e 54 45 52 46 41 43 45 20 57 49 54 48 20   INTERFACE WITH 
0af0: 53 45 4c 45 43 54 2e 43 0a 2a 2a 0a 2a 2a 20 20  SELECT.C.**.**  
0b00: 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e 67   When processing
0b10: 20 74 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   the rewritten S
0b20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
0b30: 20 63 6f 64 65 20 69 6e 20 73 65 6c 65 63 74 2e   code in select.
0b40: 63 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73 71 6c  c calls.**   sql
0b50: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
0b60: 20 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74   to begin iterat
0b70: 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20  ing through the 
0b80: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 0a 2a  results of the.*
0b90: 2a 20 20 20 73 75 62 2d 71 75 65 72 79 2c 20 77  *   sub-query, w
0ba0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 69  hich is always i
0bb0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
0bc0: 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 74 20 74  co-routine. It t
0bd0: 68 65 6e 20 63 61 6c 6c 73 0a 2a 2a 20 20 20 73  hen calls.**   s
0be0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65  qlite3WindowCode
0bf0: 53 74 65 70 28 29 20 74 6f 20 70 72 6f 63 65 73  Step() to proces
0c00: 73 20 72 6f 77 73 20 61 6e 64 20 66 69 6e 69 73  s rows and finis
0c10: 68 20 74 68 65 20 73 63 61 6e 20 62 79 20 63 61  h the scan by ca
0c20: 6c 6c 69 6e 67 0a 2a 2a 20 20 20 73 71 6c 69 74  lling.**   sqlit
0c30: 65 33 57 68 65 72 65 45 6e 64 28 29 2e 0a 2a 2a  e3WhereEnd()..**
0c40: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 69 6e  .**   sqlite3Win
0c50: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 67 65  dowCodeStep() ge
0c60: 6e 65 72 61 74 65 73 20 56 4d 20 63 6f 64 65 20  nerates VM code 
0c70: 73 6f 20 74 68 61 74 2c 20 66 6f 72 20 65 61 63  so that, for eac
0c80: 68 20 72 6f 77 20 72 65 74 75 72 6e 65 64 0a 2a  h row returned.*
0c90: 2a 20 20 20 62 79 20 74 68 65 20 73 75 62 2d 71  *   by the sub-q
0ca0: 75 65 72 79 20 61 20 73 75 62 2d 72 6f 75 74 69  uery a sub-routi
0cb0: 6e 65 20 28 4f 50 5f 47 6f 73 75 62 29 20 63 6f  ne (OP_Gosub) co
0cc0: 64 65 64 20 62 79 20 73 65 6c 65 63 74 2e 63 20  ded by select.c 
0cd0: 69 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2a 20 20  is invoked..**  
0ce0: 20 57 68 65 6e 20 74 68 65 20 73 75 62 2d 72 6f   When the sub-ro
0cf0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
0d00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68  :.**.**     * Th
0d10: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 61 6c 6c  e results of all
0d20: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
0d30: 73 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 72  s for the row ar
0d40: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 20 20 20 20  e stored.**     
0d50: 20 20 69 6e 20 74 68 65 20 61 73 73 6f 63 69 61    in the associa
0d60: 74 65 64 20 57 69 6e 64 6f 77 2e 72 65 67 52 65  ted Window.regRe
0d70: 73 75 6c 74 20 72 65 67 69 73 74 65 72 73 2e 0a  sult registers..
0d80: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 54 68 65 20  **.**     * The 
0d90: 72 65 71 75 69 72 65 64 20 74 65 72 6d 69 6e 61  required termina
0da0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
0db0: 72 65 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  red in the curre
0dc0: 6e 74 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  nt row of.**    
0dd0: 20 20 20 74 65 6d 70 20 74 61 62 6c 65 20 57 69     temp table Wi
0de0: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 0a 2a 2a  ndow.iEphCsr..**
0df0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 63 61  .**   In some ca
0e00: 73 65 73 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  ses, depending o
0e10: 6e 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  n the window fra
0e20: 6d 65 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  me and the speci
0e30: 66 69 63 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20  fic window.**   
0e40: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 76 6f 6b 65  functions invoke
0e50: 64 2c 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  d, sqlite3Window
0e60: 43 6f 64 65 53 74 65 70 28 29 20 63 61 63 68 65  CodeStep() cache
0e70: 73 20 65 61 63 68 20 65 6e 74 69 72 65 20 70 61  s each entire pa
0e80: 72 74 69 74 69 6f 6e 0a 2a 2a 20 20 20 69 6e 20  rtition.**   in 
0e90: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66  a temp table bef
0ea0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  ore returning an
0eb0: 79 20 72 6f 77 73 2e 20 49 6e 20 6f 74 68 65 72  y rows. In other
0ec0: 20 63 61 73 65 73 20 69 74 20 64 6f 65 73 20 6e   cases it does n
0ed0: 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20 64 65  ot..**   This de
0ee0: 74 61 69 6c 20 69 73 20 65 6e 63 61 70 73 75 6c  tail is encapsul
0ef0: 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 69 73  ated within this
0f00: 20 66 69 6c 65 2c 20 74 68 65 20 63 6f 64 65 20   file, the code 
0f10: 67 65 6e 65 72 61 74 65 64 20 62 79 0a 2a 2a 20  generated by.** 
0f20: 20 20 73 65 6c 65 63 74 2e 63 20 69 73 20 74 68    select.c is th
0f30: 65 20 73 61 6d 65 20 69 6e 20 65 69 74 68 65 72  e same in either
0f40: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 55 49   case..**.** BUI
0f50: 4c 54 2d 49 4e 20 57 49 4e 44 4f 57 20 46 55 4e  LT-IN WINDOW FUN
0f60: 43 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54  CTIONS.**.**   T
0f70: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
0f80: 6f 6e 20 66 65 61 74 75 72 65 73 20 74 68 65 20  on features the 
0f90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 75 69 6c 74 2d  following built-
0fa0: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
0fb0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  ons:.**.**     r
0fc0: 6f 77 5f 6e 75 6d 62 65 72 28 29 0a 2a 2a 20 20  ow_number().**  
0fd0: 20 20 20 72 61 6e 6b 28 29 0a 2a 2a 20 20 20 20     rank().**    
0fe0: 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29 0a 2a 2a   dense_rank().**
0ff0: 20 20 20 20 20 70 65 72 63 65 6e 74 5f 72 61 6e       percent_ran
1000: 6b 28 29 0a 2a 2a 20 20 20 20 20 63 75 6d 65 5f  k().**     cume_
1010: 64 69 73 74 28 29 0a 2a 2a 20 20 20 20 20 6e 74  dist().**     nt
1020: 69 6c 65 28 4e 29 0a 2a 2a 20 20 20 20 20 6c 65  ile(N).**     le
1030: 61 64 28 65 78 70 72 20 5b 2c 20 6f 66 66 73 65  ad(expr [, offse
1040: 74 20 5b 2c 20 64 65 66 61 75 6c 74 5d 5d 29 0a  t [, default]]).
1050: 2a 2a 20 20 20 20 20 6c 61 67 28 65 78 70 72 20  **     lag(expr 
1060: 5b 2c 20 6f 66 66 73 65 74 20 5b 2c 20 64 65 66  [, offset [, def
1070: 61 75 6c 74 5d 5d 29 0a 2a 2a 20 20 20 20 20 66  ault]]).**     f
1080: 69 72 73 74 5f 76 61 6c 75 65 28 65 78 70 72 29  irst_value(expr)
1090: 0a 2a 2a 20 20 20 20 20 6c 61 73 74 5f 76 61 6c  .**     last_val
10a0: 75 65 28 65 78 70 72 29 0a 2a 2a 20 20 20 20 20  ue(expr).**     
10b0: 6e 74 68 5f 76 61 6c 75 65 28 65 78 70 72 2c 20  nth_value(expr, 
10c0: 4e 29 0a 2a 2a 20 20 20 0a 2a 2a 20 20 20 54 68  N).**   .**   Th
10d0: 65 73 65 20 61 72 65 20 74 68 65 20 73 61 6d 65  ese are the same
10e0: 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77   built-in window
10f0: 20 66 75 6e 63 74 69 6f 6e 73 20 73 75 70 70 6f   functions suppo
1100: 72 74 65 64 20 62 79 20 50 6f 73 74 67 72 65 73  rted by Postgres
1110: 2e 20 0a 2a 2a 20 20 20 41 6c 74 68 6f 75 67 68  . .**   Although
1120: 20 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f   the behaviour o
1130: 66 20 61 67 67 72 65 67 61 74 65 20 77 69 6e 64  f aggregate wind
1140: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 28 66 75  ow functions (fu
1150: 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a 2a 2a 20  nctions that.** 
1160: 20 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73    can be used as
1170: 20 65 69 74 68 65 72 20 61 67 67 72 65 67 61 74   either aggregat
1180: 65 73 20 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e  es or window fun
1190: 74 69 6f 6e 73 29 20 61 6c 6c 6f 77 73 20 74 68  tions) allows th
11a0: 65 6d 20 74 6f 0a 2a 2a 20 20 20 62 65 20 69 6d  em to.**   be im
11b0: 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67 20  plemented using 
11c0: 61 6e 20 41 50 49 2c 20 62 75 69 6c 74 2d 69 6e  an API, built-in
11d0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
11e0: 73 20 61 72 65 20 6d 75 63 68 20 6d 6f 72 65 0a  s are much more.
11f0: 2a 2a 20 20 20 65 73 6f 74 65 72 69 63 2e 20 41  **   esoteric. A
1200: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 73 6f 6d  dditionally, som
1210: 65 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  e window functio
1220: 6e 73 20 28 65 2e 67 2e 20 6e 74 68 5f 76 61 6c  ns (e.g. nth_val
1230: 75 65 28 29 29 20 0a 2a 2a 20 20 20 6d 61 79 20  ue()) .**   may 
1240: 6f 6e 6c 79 20 62 65 20 69 6d 70 6c 65 6d 65 6e  only be implemen
1250: 74 65 64 20 62 79 20 63 61 63 68 69 6e 67 20 74  ted by caching t
1260: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
1270: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ion in memory..*
1280: 2a 20 20 20 41 73 20 73 75 63 68 2c 20 73 6f 6d  *   As such, som
1290: 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f  e built-in windo
12a0: 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 20  w functions use 
12b0: 74 68 65 20 73 61 6d 65 20 41 50 49 20 61 73 20  the same API as 
12c0: 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 77  aggregate.**   w
12d0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
12e0: 61 6e 64 20 73 6f 6d 65 20 61 72 65 20 69 6d 70  and some are imp
12f0: 6c 65 6d 65 6e 74 65 64 20 64 69 72 65 63 74 6c  lemented directl
1300: 79 20 75 73 69 6e 67 20 56 44 42 45 20 0a 2a 2a  y using VDBE .**
1310: 20 20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e     instructions.
1320: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 66   Additionally, f
1330: 6f 72 20 74 68 6f 73 65 20 66 75 6e 63 74 69 6f  or those functio
1340: 6e 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ns that use the 
1350: 41 50 49 2c 20 74 68 65 0a 2a 2a 20 20 20 77 69  API, the.**   wi
1360: 6e 64 6f 77 20 66 72 61 6d 65 20 69 73 20 73 6f  ndow frame is so
1370: 6d 65 74 69 6d 65 73 20 6d 6f 64 69 66 69 65 64  metimes modified
1380: 20 62 65 66 6f 72 65 20 74 68 65 20 53 45 4c 45   before the SELE
1390: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  CT statement is.
13a0: 2a 2a 20 20 20 72 65 77 72 69 74 74 65 6e 2e 20  **   rewritten. 
13b0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 72 65 67  For example, reg
13c0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 73  ardless of the s
13d0: 70 65 63 69 66 69 65 64 20 77 69 6e 64 6f 77 20  pecified window 
13e0: 66 72 61 6d 65 2c 20 74 68 65 0a 2a 2a 20 20 20  frame, the.**   
13f0: 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e  row_number() fun
1400: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 75 73 65  ction always use
1410: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 57  s:.**.**     ROW
1420: 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
1430: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
1440: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
1450: 0a 2a 2a 20 20 20 53 65 65 20 73 71 6c 69 74 65  .**   See sqlite
1460: 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 29 20  3WindowUpdate() 
1470: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  for details..**.
1480: 2a 2a 20 20 20 41 73 20 77 65 6c 6c 20 61 73 20  **   As well as 
1490: 73 6f 6d 65 20 6f 66 20 74 68 65 20 62 75 69 6c  some of the buil
14a0: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
14b0: 74 69 6f 6e 73 2c 20 61 67 67 72 65 67 61 74 65  tions, aggregate
14c0: 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 66 75 6e   window.**   fun
14d0: 63 74 69 6f 6e 73 20 6d 69 6e 28 29 20 61 6e 64  ctions min() and
14e0: 20 6d 61 78 28 29 20 61 72 65 20 69 6d 70 6c 65   max() are imple
14f0: 6d 65 6e 74 65 64 20 75 73 69 6e 67 20 56 44 42  mented using VDB
1500: 45 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69  E instructions i
1510: 66 0a 2a 2a 20 20 20 74 68 65 20 73 74 61 72 74  f.**   the start
1520: 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 66   of the window f
1530: 72 61 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64  rame is declared
1540: 20 61 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68   as anything oth
1550: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 20 20 55 4e  er than .**   UN
1560: 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
1570: 47 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  G..*/../*.** Imp
1580: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 62  lementation of b
1590: 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66  uilt-in window f
15a0: 75 6e 63 74 69 6f 6e 20 72 6f 77 5f 6e 75 6d 62  unction row_numb
15b0: 65 72 28 29 2e 20 41 73 73 75 6d 65 73 20 74 68  er(). Assumes th
15c0: 61 74 20 74 68 65 0a 2a 2a 20 77 69 6e 64 6f 77  at the.** window
15d0: 20 66 72 61 6d 65 20 68 61 73 20 62 65 65 6e 20   frame has been 
15e0: 63 6f 65 72 63 65 64 20 74 6f 3a 0a 2a 2a 0a 2a  coerced to:.**.*
15f0: 2a 20 20 20 52 4f 57 53 20 42 45 54 57 45 45 4e  *   ROWS BETWEEN
1600: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
1610: 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e 54  DING AND CURRENT
1620: 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63 20 76   ROW.*/.static v
1630: 6f 69 64 20 72 6f 77 5f 6e 75 6d 62 65 72 53 74  oid row_numberSt
1640: 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  epFunc(.  sqlite
1650: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
1660: 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
1670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1680: 61 70 41 72 67 0a 29 7b 0a 20 20 69 36 34 20 2a  apArg.){.  i64 *
1690: 70 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65  p = (i64*)sqlite
16a0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
16b0: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
16c0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
16d0: 20 28 2a 70 29 2b 2b 3b 0a 20 20 55 4e 55 53 45   (*p)++;.  UNUSE
16e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67  D_PARAMETER(nArg
16f0: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1700: 4d 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a  METER(apArg);.}.
1710: 73 74 61 74 69 63 20 76 6f 69 64 20 72 6f 77 5f  static void row_
1720: 6e 75 6d 62 65 72 56 61 6c 75 65 46 75 6e 63 28  numberValueFunc(
1730: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
1740: 2a 70 43 74 78 29 7b 0a 20 20 69 36 34 20 2a 70  *pCtx){.  i64 *p
1750: 20 3d 20 28 69 36 34 2a 29 73 71 6c 69 74 65 33   = (i64*)sqlite3
1760: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
1770: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
1780: 2a 70 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *p));.  sqlite3_
1790: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
17a0: 78 2c 20 28 70 20 3f 20 2a 70 20 3a 20 30 29 29  x, (p ? *p : 0))
17b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65  ;.}../*.** Conte
17c0: 78 74 20 6f 62 6a 65 63 74 20 74 79 70 65 20 75  xt object type u
17d0: 73 65 64 20 62 79 20 72 61 6e 6b 28 29 2c 20 64  sed by rank(), d
17e0: 65 6e 73 65 5f 72 61 6e 6b 28 29 2c 20 70 65 72  ense_rank(), per
17f0: 63 65 6e 74 5f 72 61 6e 6b 28 29 20 61 6e 64 0a  cent_rank() and.
1800: 2a 2a 20 63 75 6d 65 5f 64 69 73 74 28 29 2e 0a  ** cume_dist()..
1810: 2a 2f 0a 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  */.struct CallCo
1820: 75 6e 74 20 7b 0a 20 20 69 36 34 20 6e 56 61 6c  unt {.  i64 nVal
1830: 75 65 3b 0a 20 20 69 36 34 20 6e 53 74 65 70 3b  ue;.  i64 nStep;
1840: 0a 20 20 69 36 34 20 6e 54 6f 74 61 6c 3b 0a 7d  .  i64 nTotal;.}
1850: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  ;../*.** Impleme
1860: 6e 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74  ntation of built
1870: 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
1880: 69 6f 6e 20 64 65 6e 73 65 5f 72 61 6e 6b 28 29  ion dense_rank()
1890: 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  . Assumes that.*
18a0: 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72 61  * the window fra
18b0: 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 20  me has been set 
18c0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e 47  to:.**.**   RANG
18d0: 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  E BETWEEN UNBOUN
18e0: 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
18f0: 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a 2a  D CURRENT ROW .*
1900: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
1910: 6e 73 65 5f 72 61 6e 6b 53 74 65 70 46 75 6e 63  nse_rankStepFunc
1920: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
1930: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
1940: 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
1950: 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a  3_value **apArg.
1960: 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61 6c 6c  ){.  struct Call
1970: 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20 3d 20  Count *p;.  p = 
1980: 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e  (struct CallCoun
1990: 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t*)sqlite3_aggre
19a0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74  gate_context(pCt
19b0: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  x, sizeof(*p));.
19c0: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 6e 53 74    if( p ) p->nSt
19d0: 65 70 20 3d 20 31 3b 0a 20 20 55 4e 55 53 45 44  ep = 1;.  UNUSED
19e0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72 67 29  _PARAMETER(nArg)
19f0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1a00: 45 54 45 52 28 61 70 41 72 67 29 3b 0a 7d 0a 73  ETER(apArg);.}.s
1a10: 74 61 74 69 63 20 76 6f 69 64 20 64 65 6e 73 65  tatic void dense
1a20: 5f 72 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73  _rankValueFunc(s
1a30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1a40: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
1a50: 43 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20  CallCount *p;.  
1a60: 70 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c  p = (struct Call
1a70: 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61  Count*)sqlite3_a
1a80: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
1a90: 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  (pCtx, sizeof(*p
1aa0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
1ab0: 20 20 20 69 66 28 20 70 2d 3e 6e 53 74 65 70 20     if( p->nStep 
1ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
1ad0: 75 65 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ue++;.      p->n
1ae0: 53 74 65 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Step = 0;.    }.
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
1b00: 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 70  lt_int64(pCtx, p
1b10: 2d 3e 6e 56 61 6c 75 65 29 3b 0a 20 20 7d 0a 7d  ->nValue);.  }.}
1b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1b30: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1b40: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1b50: 6f 6e 20 72 61 6e 6b 28 29 2e 20 41 73 73 75 6d  on rank(). Assum
1b60: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
1b70: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
1b80: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
1b90: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
1ba0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
1bb0: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
1bc0: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
1bd0: 63 20 76 6f 69 64 20 72 61 6e 6b 53 74 65 70 46  c void rankStepF
1be0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1bf0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1c00: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1c10: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1c20: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1c30: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70  allCount *p;.  p
1c40: 20 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43   = (struct CallC
1c50: 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67  ount*)sqlite3_ag
1c60: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
1c70: 70 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29  pCtx, sizeof(*p)
1c80: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
1c90: 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20    p->nStep++;.  
1ca0: 20 20 69 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d    if( p->nValue=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  =0 ){.      p->n
1cc0: 56 61 6c 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70  Value = p->nStep
1cd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 55 4e  ;.    }.  }.  UN
1ce0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
1cf0: 41 72 67 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Arg);.  UNUSED_P
1d00: 41 52 41 4d 45 54 45 52 28 61 70 41 72 67 29 3b  ARAMETER(apArg);
1d10: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
1d20: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
1d30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1d40: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
1d50: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
1d60: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
1d70: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
1d80: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
1d90: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
1da0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1db0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1dc0: 69 6e 74 36 34 28 70 43 74 78 2c 20 70 2d 3e 6e  int64(pCtx, p->n
1dd0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 2d 3e 6e  Value);.    p->n
1de0: 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Value = 0;.  }.}
1df0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1e00: 74 61 74 69 6f 6e 20 6f 66 20 62 75 69 6c 74 2d  tation of built-
1e10: 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  in window functi
1e20: 6f 6e 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28  on percent_rank(
1e30: 29 2e 20 41 73 73 75 6d 65 73 20 74 68 61 74 0a  ). Assumes that.
1e40: 2a 2a 20 74 68 65 20 77 69 6e 64 6f 77 20 66 72  ** the window fr
1e50: 61 6d 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ame has been set
1e60: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 41 4e   to:.**.**   RAN
1e70: 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
1e80: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
1e90: 4e 44 20 43 55 52 52 45 4e 54 20 52 4f 57 20 0a  ND CURRENT ROW .
1ea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1eb0: 65 72 63 65 6e 74 5f 72 61 6e 6b 53 74 65 70 46  ercent_rankStepF
1ec0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
1ed0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
1ee0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
1ef0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
1f00: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 43  rg.){.  struct C
1f10: 61 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 55  allCount *p;.  U
1f20: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f30: 6e 41 72 67 29 3b 20 61 73 73 65 72 74 28 20 6e  nArg); assert( n
1f40: 41 72 67 3d 3d 31 20 29 3b 0a 0a 20 20 70 20 3d  Arg==1 );..  p =
1f50: 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f 75   (struct CallCou
1f60: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  nt*)sqlite3_aggr
1f70: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70 43  egate_context(pC
1f80: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  tx, sizeof(*p));
1f90: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fa0: 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30  if( p->nTotal==0
1fb0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f   ){.      p->nTo
1fc0: 74 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  tal = sqlite3_va
1fd0: 6c 75 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b  lue_int64(apArg[
1fe0: 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  0]);.    }.    p
1ff0: 2d 3e 6e 53 74 65 70 2b 2b 3b 0a 20 20 20 20 69  ->nStep++;.    i
2000: 66 28 20 70 2d 3e 6e 56 61 6c 75 65 3d 3d 30 20  f( p->nValue==0 
2010: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 6c  ){.      p->nVal
2020: 75 65 20 3d 20 70 2d 3e 6e 53 74 65 70 3b 0a 20  ue = p->nStep;. 
2030: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
2040: 63 20 76 6f 69 64 20 70 65 72 63 65 6e 74 5f 72  c void percent_r
2050: 61 6e 6b 56 61 6c 75 65 46 75 6e 63 28 73 71 6c  ankValueFunc(sql
2060: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
2070: 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20 43 61  tx){.  struct Ca
2080: 6c 6c 43 6f 75 6e 74 20 2a 70 3b 0a 20 20 70 20  llCount *p;.  p 
2090: 3d 20 28 73 74 72 75 63 74 20 43 61 6c 6c 43 6f  = (struct CallCo
20a0: 75 6e 74 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  unt*)sqlite3_agg
20b0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
20c0: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
20d0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
20e0: 20 69 66 28 20 70 2d 3e 6e 54 6f 74 61 6c 3e 31   if( p->nTotal>1
20f0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65   ){.      double
2100: 20 72 20 3d 20 28 64 6f 75 62 6c 65 29 28 70 2d   r = (double)(p-
2110: 3e 6e 56 61 6c 75 65 2d 31 29 20 2f 20 28 64 6f  >nValue-1) / (do
2120: 75 62 6c 65 29 28 70 2d 3e 6e 54 6f 74 61 6c 2d  uble)(p->nTotal-
2130: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2140: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
2150: 70 43 74 78 2c 20 72 29 3b 0a 20 20 20 20 7d 65  pCtx, r);.    }e
2160: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2170: 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65  e3_result_double
2180: 28 70 43 74 78 2c 20 30 2e 30 29 3b 0a 20 20 20  (pCtx, 0.0);.   
2190: 20 7d 0a 20 20 20 20 70 2d 3e 6e 56 61 6c 75 65   }.    p->nValue
21a0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
21b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
21c0: 6e 20 6f 66 20 62 75 69 6c 74 2d 69 6e 20 77 69  n of built-in wi
21d0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 63 75  ndow function cu
21e0: 6d 65 5f 64 69 73 74 28 29 2e 20 41 73 73 75 6d  me_dist(). Assum
21f0: 65 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 77  es that.** the w
2200: 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61 73 20  indow frame has 
2210: 62 65 65 6e 20 73 65 74 20 74 6f 3a 0a 2a 2a 0a  been set to:.**.
2220: 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45  **   RANGE BETWE
2230: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
2240: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2250: 4e 54 20 52 4f 57 20 0a 2a 2f 0a 73 74 61 74 69  NT ROW .*/.stati
2260: 63 20 76 6f 69 64 20 63 75 6d 65 5f 64 69 73 74  c void cume_dist
2270: 53 74 65 70 46 75 6e 63 28 0a 20 20 73 71 6c 69  StepFunc(.  sqli
2280: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2290: 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
22a0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22b0: 2a 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72  **apArg.){.  str
22c0: 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20 2a 70  uct CallCount *p
22d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ;.  assert( nArg
22e0: 3d 3d 31 20 29 3b 20 55 4e 55 53 45 44 5f 50 41  ==1 ); UNUSED_PA
22f0: 52 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 0a  RAMETER(nArg);..
2300: 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 43 61    p = (struct Ca
2310: 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c 69 74 65 33  llCount*)sqlite3
2320: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
2330: 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66 28  xt(pCtx, sizeof(
2340: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
2350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 54 6f 74  .    if( p->nTot
2360: 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  al==0 ){.      p
2370: 2d 3e 6e 54 6f 74 61 6c 20 3d 20 73 71 6c 69 74  ->nTotal = sqlit
2380: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
2390: 70 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  pArg[0]);.    }.
23a0: 20 20 20 20 70 2d 3e 6e 53 74 65 70 2b 2b 3b 0a      p->nStep++;.
23b0: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
23c0: 64 20 63 75 6d 65 5f 64 69 73 74 56 61 6c 75 65  d cume_distValue
23d0: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
23e0: 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20 20 73  text *pCtx){.  s
23f0: 74 72 75 63 74 20 43 61 6c 6c 43 6f 75 6e 74 20  truct CallCount 
2400: 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  *p;.  p = (struc
2410: 74 20 43 61 6c 6c 43 6f 75 6e 74 2a 29 73 71 6c  t CallCount*)sql
2420: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
2430: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
2440: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
2450: 70 20 26 26 20 70 2d 3e 6e 54 6f 74 61 6c 20 29  p && p->nTotal )
2460: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d  {.    double r =
2470: 20 28 64 6f 75 62 6c 65 29 28 70 2d 3e 6e 53 74   (double)(p->nSt
2480: 65 70 29 20 2f 20 28 64 6f 75 62 6c 65 29 28 70  ep) / (double)(p
2490: 2d 3e 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 73  ->nTotal);.    s
24a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f  qlite3_result_do
24b0: 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20  uble(pCtx, r);. 
24c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74   }.}../*.** Cont
24d0: 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 6e  ext object for n
24e0: 74 69 6c 65 28 29 20 77 69 6e 64 6f 77 20 66 75  tile() window fu
24f0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63  nction..*/.struc
2500: 74 20 4e 74 69 6c 65 43 74 78 20 7b 0a 20 20 69  t NtileCtx {.  i
2510: 36 34 20 6e 54 6f 74 61 6c 3b 20 20 20 20 20 20  64 nTotal;      
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2530: 2a 20 54 6f 74 61 6c 20 72 6f 77 73 20 69 6e 20  * Total rows in 
2540: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 69  partition */.  i
2550: 36 34 20 6e 50 61 72 61 6d 3b 20 20 20 20 20 20  64 nParam;      
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2570: 2a 20 50 61 72 61 6d 65 74 65 72 20 70 61 73 73  * Parameter pass
2580: 65 64 20 74 6f 20 6e 74 69 6c 65 28 4e 29 20 2a  ed to ntile(N) *
2590: 2f 0a 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20  /.  i64 iRow;   
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
25c0: 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ow */.};../*.** 
25d0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
25e0: 66 20 6e 74 69 6c 65 28 29 2e 20 54 68 69 73 20  f ntile(). This 
25f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
2600: 20 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 68 61   window frame ha
2610: 73 0a 2a 2a 20 62 65 65 6e 20 63 6f 65 72 63 65  s.** been coerce
2620: 64 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 52 4f  d to:.**.**   RO
2630: 57 53 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  WS UNBOUNDED PRE
2640: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
2650: 4e 54 20 52 4f 57 0a 2a 2f 0a 73 74 61 74 69 63  NT ROW.*/.static
2660: 20 76 6f 69 64 20 6e 74 69 6c 65 53 74 65 70 46   void ntileStepF
2670: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2680: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
2690: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
26a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 41  ite3_value **apA
26b0: 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 4e  rg.){.  struct N
26c0: 74 69 6c 65 43 74 78 20 2a 70 3b 0a 20 20 61 73  tileCtx *p;.  as
26d0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b  sert( nArg==2 );
26e0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26f0: 52 28 6e 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  R(nArg);.  p = (
2700: 73 74 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a  struct NtileCtx*
2710: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
2720: 74 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c  te_context(pCtx,
2730: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
2740: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
2750: 20 70 2d 3e 6e 54 6f 74 61 6c 3d 3d 30 20 29 7b   p->nTotal==0 ){
2760: 0a 20 20 20 20 20 20 70 2d 3e 6e 50 61 72 61 6d  .      p->nParam
2770: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2780: 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 30 5d 29  _int64(apArg[0])
2790: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 54 6f 74 61  ;.      p->nTota
27a0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  l = sqlite3_valu
27b0: 65 5f 69 6e 74 36 34 28 61 70 41 72 67 5b 31 5d  e_int64(apArg[1]
27c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
27d0: 6e 50 61 72 61 6d 3c 3d 30 20 29 7b 0a 20 20 20  nParam<=0 ){.   
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
27f0: 75 6c 74 5f 65 72 72 6f 72 28 0a 20 20 20 20 20  ult_error(.     
2800: 20 20 20 20 20 20 20 70 43 74 78 2c 20 22 61 72         pCtx, "ar
2810: 67 75 6d 65 6e 74 20 6f 66 20 6e 74 69 6c 65 20  gument of ntile 
2820: 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69 74 69  must be a positi
2830: 76 65 20 69 6e 74 65 67 65 72 22 2c 20 2d 31 0a  ve integer", -1.
2840: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2850: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
2860: 69 52 6f 77 2b 2b 3b 0a 20 20 7d 0a 7d 0a 73 74  iRow++;.  }.}.st
2870: 61 74 69 63 20 76 6f 69 64 20 6e 74 69 6c 65 56  atic void ntileV
2880: 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65 33  alueFunc(sqlite3
2890: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b  _context *pCtx){
28a0: 0a 20 20 73 74 72 75 63 74 20 4e 74 69 6c 65 43  .  struct NtileC
28b0: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 28 73 74  tx *p;.  p = (st
28c0: 72 75 63 74 20 4e 74 69 6c 65 43 74 78 2a 29 73  ruct NtileCtx*)s
28d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
28e0: 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73  _context(pCtx, s
28f0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
2900: 28 20 70 20 26 26 20 70 2d 3e 6e 50 61 72 61 6d  ( p && p->nParam
2910: 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  >0 ){.    int nS
2920: 69 7a 65 20 3d 20 28 70 2d 3e 6e 54 6f 74 61 6c  ize = (p->nTotal
2930: 20 2f 20 70 2d 3e 6e 50 61 72 61 6d 29 3b 0a 20   / p->nParam);. 
2940: 20 20 20 69 66 28 20 6e 53 69 7a 65 3d 3d 30 20     if( nSize==0 
2950: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2960: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
2970: 74 78 2c 20 70 2d 3e 69 52 6f 77 29 3b 0a 20 20  tx, p->iRow);.  
2980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
2990: 36 34 20 6e 4c 61 72 67 65 20 3d 20 70 2d 3e 6e  64 nLarge = p->n
29a0: 54 6f 74 61 6c 20 2d 20 70 2d 3e 6e 50 61 72 61  Total - p->nPara
29b0: 6d 2a 6e 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  m*nSize;.      i
29c0: 36 34 20 69 53 6d 61 6c 6c 20 3d 20 6e 4c 61 72  64 iSmall = nLar
29d0: 67 65 2a 28 6e 53 69 7a 65 2b 31 29 3b 0a 20 20  ge*(nSize+1);.  
29e0: 20 20 20 20 69 36 34 20 69 52 6f 77 20 3d 20 70      i64 iRow = p
29f0: 2d 3e 69 52 6f 77 2d 31 3b 0a 0a 20 20 20 20 20  ->iRow-1;..     
2a00: 20 61 73 73 65 72 74 28 20 28 6e 4c 61 72 67 65   assert( (nLarge
2a10: 2a 28 6e 53 69 7a 65 2b 31 29 20 2b 20 28 70 2d  *(nSize+1) + (p-
2a20: 3e 6e 50 61 72 61 6d 2d 6e 4c 61 72 67 65 29 2a  >nParam-nLarge)*
2a30: 6e 53 69 7a 65 29 3d 3d 70 2d 3e 6e 54 6f 74 61  nSize)==p->nTota
2a40: 6c 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  l );..      if( 
2a50: 69 52 6f 77 3c 69 53 6d 61 6c 6c 20 29 7b 0a 20  iRow<iSmall ){. 
2a60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2a70: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2a80: 2c 20 31 20 2b 20 69 52 6f 77 2f 28 6e 53 69 7a  , 1 + iRow/(nSiz
2a90: 65 2b 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  e+1));.      }el
2aa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2ab0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2ac0: 28 70 43 74 78 2c 20 31 20 2b 20 6e 4c 61 72 67  (pCtx, 1 + nLarg
2ad0: 65 20 2b 20 28 69 52 6f 77 2d 69 53 6d 61 6c 6c  e + (iRow-iSmall
2ae0: 29 2f 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  )/nSize);.      
2af0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
2b00: 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a  *.** Context obj
2b10: 65 63 74 20 66 6f 72 20 6c 61 73 74 5f 76 61 6c  ect for last_val
2b20: 75 65 28 29 20 77 69 6e 64 6f 77 20 66 75 6e 63  ue() window func
2b30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tion..*/.struct 
2b40: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 7b 0a 20  LastValueCtx {. 
2b50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b60: 70 56 61 6c 3b 0a 20 20 69 6e 74 20 6e 56 61 6c  pVal;.  int nVal
2b70: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.};../*.** Impl
2b80: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6c 61  ementation of la
2b90: 73 74 5f 76 61 6c 75 65 28 29 2e 0a 2a 2f 0a 73  st_value()..*/.s
2ba0: 74 61 74 69 63 20 76 6f 69 64 20 6c 61 73 74 5f  tatic void last_
2bb0: 76 61 6c 75 65 53 74 65 70 46 75 6e 63 28 0a 20  valueStepFunc(. 
2bc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2bd0: 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
2be0: 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
2bf0: 61 6c 75 65 20 2a 2a 61 70 41 72 67 0a 29 7b 0a  alue **apArg.){.
2c00: 20 20 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c    struct LastVal
2c10: 75 65 43 74 78 20 2a 70 3b 0a 20 20 55 4e 55 53  ueCtx *p;.  UNUS
2c20: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 41 72  ED_PARAMETER(nAr
2c30: 67 29 3b 0a 20 20 70 20 3d 20 28 73 74 72 75 63  g);.  p = (struc
2c40: 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 2a 29  t LastValueCtx*)
2c50: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
2c60: 65 5f 63 6f 6e 74 65 78 74 28 70 43 74 78 2c 20  e_context(pCtx, 
2c70: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
2c80: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
2c90: 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28 70  te3_value_free(p
2ca0: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d 3e  ->pVal);.    p->
2cb0: 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVal = sqlite3_v
2cc0: 61 6c 75 65 5f 64 75 70 28 61 70 41 72 67 5b 30  alue_dup(apArg[0
2cd0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  ]);.    if( p->p
2ce0: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2cf0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2d00: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29  rror_nomem(pCtx)
2d10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d20: 20 20 20 70 2d 3e 6e 56 61 6c 2b 2b 3b 0a 20 20     p->nVal++;.  
2d30: 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63    }.  }.}.static
2d40: 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c 75 65   void last_value
2d50: 49 6e 76 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  InvFunc(.  sqlit
2d60: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2d70: 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
2d80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2d90: 2a 61 70 41 72 67 0a 29 7b 0a 20 20 73 74 72 75  *apArg.){.  stru
2da0: 63 74 20 4c 61 73 74 56 61 6c 75 65 43 74 78 20  ct LastValueCtx 
2db0: 2a 70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  *p;.  UNUSED_PAR
2dc0: 41 4d 45 54 45 52 28 6e 41 72 67 29 3b 0a 20 20  AMETER(nArg);.  
2dd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2de0: 28 61 70 41 72 67 29 3b 0a 20 20 70 20 3d 20 28  (apArg);.  p = (
2df0: 73 74 72 75 63 74 20 4c 61 73 74 56 61 6c 75 65  struct LastValue
2e00: 43 74 78 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  Ctx*)sqlite3_agg
2e10: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 70  regate_context(p
2e20: 43 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  Ctx, sizeof(*p))
2e30: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
2e40: 29 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 6c  ) ){.    p->nVal
2e50: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
2e60: 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Val==0 ){.      
2e70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 66 72  sqlite3_value_fr
2e80: 65 65 28 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20  ee(p->pVal);.   
2e90: 20 20 20 70 2d 3e 70 56 61 6c 20 3d 20 30 3b 0a     p->pVal = 0;.
2ea0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74      }.  }.}.stat
2eb0: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2ec0: 75 65 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69  ueValueFunc(sqli
2ed0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
2ee0: 78 29 7b 0a 20 20 73 74 72 75 63 74 20 4c 61 73  x){.  struct Las
2ef0: 74 56 61 6c 75 65 43 74 78 20 2a 70 3b 0a 20 20  tValueCtx *p;.  
2f00: 70 20 3d 20 28 73 74 72 75 63 74 20 4c 61 73 74  p = (struct Last
2f10: 56 61 6c 75 65 43 74 78 2a 29 73 71 6c 69 74 65  ValueCtx*)sqlite
2f20: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
2f30: 65 78 74 28 70 43 74 78 2c 20 73 69 7a 65 6f 66  ext(pCtx, sizeof
2f40: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 26  (*p));.  if( p &
2f50: 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a 20 20 20  & p->pVal ){.   
2f60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2f70: 76 61 6c 75 65 28 70 43 74 78 2c 20 70 2d 3e 70  value(pCtx, p->p
2f80: 56 61 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  Val);.  }.}.stat
2f90: 69 63 20 76 6f 69 64 20 6c 61 73 74 5f 76 61 6c  ic void last_val
2fa0: 75 65 46 69 6e 61 6c 69 7a 65 46 75 6e 63 28 73  ueFinalizeFunc(s
2fb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2fc0: 70 43 74 78 29 7b 0a 20 20 73 74 72 75 63 74 20  pCtx){.  struct 
2fd0: 4c 61 73 74 56 61 6c 75 65 43 74 78 20 2a 70 3b  LastValueCtx *p;
2fe0: 0a 20 20 70 20 3d 20 28 73 74 72 75 63 74 20 4c  .  p = (struct L
2ff0: 61 73 74 56 61 6c 75 65 43 74 78 2a 29 73 71 6c  astValueCtx*)sql
3000: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
3010: 6f 6e 74 65 78 74 28 70 43 74 78 2c 20 73 69 7a  ontext(pCtx, siz
3020: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
3030: 70 20 26 26 20 70 2d 3e 70 56 61 6c 20 29 7b 0a  p && p->pVal ){.
3040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
3050: 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 70  lt_value(pCtx, p
3060: 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  ->pVal);.    sql
3070: 69 74 65 33 5f 76 61 6c 75 65 5f 66 72 65 65 28  ite3_value_free(
3080: 70 2d 3e 70 56 61 6c 29 3b 0a 20 20 20 20 70 2d  p->pVal);.    p-
3090: 3e 70 56 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d  >pVal = 0;.  }.}
30a0: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 6e  ../*.** Static n
30b0: 61 6d 65 73 20 66 6f 72 20 74 68 65 20 62 75 69  ames for the bui
30c0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e  lt-in window fun
30d0: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
30e0: 65 73 65 20 73 74 61 74 69 63 0a 2a 2a 20 6e 61  ese static.** na
30f0: 6d 65 73 20 61 72 65 20 75 73 65 64 2c 20 72 61  mes are used, ra
3100: 74 68 65 72 20 74 68 61 6e 20 73 74 72 69 6e 67  ther than string
3110: 20 6c 69 74 65 72 61 6c 73 2c 20 73 6f 20 74 68   literals, so th
3120: 61 74 20 46 75 6e 63 44 65 66 20 6f 62 6a 65 63  at FuncDef objec
3130: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 61 73 73  ts.** can be ass
3140: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
3150: 61 72 74 69 63 75 6c 61 72 20 77 69 6e 64 6f 77  articular window
3160: 20 66 75 6e 63 74 69 6f 6e 20 62 79 20 64 69 72   function by dir
3170: 65 63 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ect.** compariso
3180: 6e 20 6f 66 20 74 68 65 20 7a 4e 61 6d 65 20 70  n of the zName p
3190: 6f 69 6e 74 65 72 2e 20 20 45 78 61 6d 70 6c 65  ointer.  Example
31a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 66  :.**.**       if
31b0: 28 20 70 46 75 6e 63 44 65 66 2d 3e 7a 4e 61 6d  ( pFuncDef->zNam
31c0: 65 3d 3d 72 6f 77 5f 76 61 6c 75 65 4e 61 6d 65  e==row_valueName
31d0: 20 29 7b 20 2e 2e 2e 20 7d 0a 2a 2f 0a 73 74 61   ){ ... }.*/.sta
31e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 72  tic const char r
31f0: 6f 77 5f 6e 75 6d 62 65 72 4e 61 6d 65 5b 5d 20  ow_numberName[] 
3200: 3d 20 20 20 22 72 6f 77 5f 6e 75 6d 62 65 72 22  =   "row_number"
3210: 3b 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ;.static const c
3220: 68 61 72 20 64 65 6e 73 65 5f 72 61 6e 6b 4e 61  har dense_rankNa
3230: 6d 65 5b 5d 20 3d 20 20 20 22 64 65 6e 73 65 5f  me[] =   "dense_
3240: 72 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f  rank";.static co
3250: 6e 73 74 20 63 68 61 72 20 72 61 6e 6b 4e 61 6d  nst char rankNam
3260: 65 5b 5d 20 3d 20 20 20 20 20 20 20 20 20 22 72  e[] =         "r
3270: 61 6e 6b 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  ank";.static con
3280: 73 74 20 63 68 61 72 20 70 65 72 63 65 6e 74 5f  st char percent_
3290: 72 61 6e 6b 4e 61 6d 65 5b 5d 20 3d 20 22 70 65  rankName[] = "pe
32a0: 72 63 65 6e 74 5f 72 61 6e 6b 22 3b 0a 73 74 61  rcent_rank";.sta
32b0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 63  tic const char c
32c0: 75 6d 65 5f 64 69 73 74 4e 61 6d 65 5b 5d 20 3d  ume_distName[] =
32d0: 20 20 20 20 22 63 75 6d 65 5f 64 69 73 74 22 3b      "cume_dist";
32e0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
32f0: 61 72 20 6e 74 69 6c 65 4e 61 6d 65 5b 5d 20 3d  ar ntileName[] =
3300: 20 20 20 20 20 20 20 20 22 6e 74 69 6c 65 22 3b          "ntile";
3310: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3320: 61 72 20 6c 61 73 74 5f 76 61 6c 75 65 4e 61 6d  ar last_valueNam
3330: 65 5b 5d 20 3d 20 20 20 22 6c 61 73 74 5f 76 61  e[] =   "last_va
3340: 6c 75 65 22 3b 0a 73 74 61 74 69 63 20 63 6f 6e  lue";.static con
3350: 73 74 20 63 68 61 72 20 6e 74 68 5f 76 61 6c 75  st char nth_valu
3360: 65 4e 61 6d 65 5b 5d 20 3d 20 20 20 20 22 6e 74  eName[] =    "nt
3370: 68 5f 76 61 6c 75 65 22 3b 0a 73 74 61 74 69 63  h_value";.static
3380: 20 63 6f 6e 73 74 20 63 68 61 72 20 66 69 72 73   const char firs
3390: 74 5f 76 61 6c 75 65 4e 61 6d 65 5b 5d 20 3d 20  t_valueName[] = 
33a0: 20 22 66 69 72 73 74 5f 76 61 6c 75 65 22 3b 0a   "first_value";.
33b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
33c0: 72 20 6c 65 61 64 4e 61 6d 65 5b 5d 20 3d 20 20  r leadName[] =  
33d0: 20 20 20 20 20 20 20 22 6c 65 61 64 22 3b 0a 73         "lead";.s
33e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
33f0: 20 6c 61 67 4e 61 6d 65 5b 5d 20 3d 20 20 20 20   lagName[] =    
3400: 20 20 20 20 20 20 22 6c 61 67 22 3b 0a 0a 2f 2a        "lag";../*
3410: 0a 2a 2a 20 4e 6f 2d 6f 70 20 69 6d 70 6c 65 6d  .** No-op implem
3420: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 78 53 74  entations of xSt
3430: 65 70 28 29 20 61 6e 64 20 78 46 69 6e 61 6c 69  ep() and xFinali
3440: 7a 65 28 29 2e 20 20 55 73 65 64 20 61 73 20 70  ze().  Used as p
3450: 6c 61 63 65 2d 68 6f 6c 64 65 72 73 0a 2a 2a 20  lace-holders.** 
3460: 66 6f 72 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  for built-in win
3470: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3480: 61 74 20 6e 65 76 65 72 20 63 61 6c 6c 20 74 68  at never call th
3490: 6f 73 65 20 69 6e 74 65 72 66 61 63 65 73 2e 0a  ose interfaces..
34a0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6f 70 56 61  **.** The noopVa
34b0: 6c 75 65 46 75 6e 63 28 29 20 69 73 20 63 61 6c  lueFunc() is cal
34c0: 6c 65 64 20 62 75 74 20 69 73 20 65 78 70 65 63  led but is expec
34d0: 74 65 64 20 74 6f 20 64 6f 20 6e 6f 74 68 69 6e  ted to do nothin
34e0: 67 2e 20 20 54 68 65 0a 2a 2a 20 6e 6f 6f 70 53  g.  The.** noopS
34f0: 74 65 70 46 75 6e 63 28 29 20 69 73 20 6e 65 76  tepFunc() is nev
3500: 65 72 20 63 61 6c 6c 65 64 2c 20 61 6e 64 20 73  er called, and s
3510: 6f 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 77  o it is marked w
3520: 69 74 68 20 4e 4f 5f 54 45 53 54 20 74 6f 0a 2a  ith NO_TEST to.*
3530: 2a 20 6c 65 74 20 74 68 65 20 74 65 73 74 20 63  * let the test c
3540: 6f 76 65 72 61 67 65 20 72 6f 75 74 69 6e 65 20  overage routine 
3550: 6b 6e 6f 77 20 6e 6f 74 20 74 6f 20 65 78 70 65  know not to expe
3560: 63 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ct this function
3570: 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65   to be.** invoke
3580: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3590: 64 20 6e 6f 6f 70 53 74 65 70 46 75 6e 63 28 20  d noopStepFunc( 
35a0: 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
35b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
35c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 4e 4f   *p,        /*NO
35d0: 5f 54 45 53 54 2a 2f 0a 20 20 69 6e 74 20 6e 2c  _TEST*/.  int n,
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
3600: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3610: 20 2a 2a 61 20 20 20 20 20 20 20 20 20 20 2f 2a   **a          /*
3620: 4e 4f 5f 54 45 53 54 2a 2f 0a 29 7b 20 20 20 20  NO_TEST*/.){    
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
3650: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
3660: 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20  METER(p);       
3670: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 55 4e  /*NO_TEST*/.  UN
3680: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
3690: 29 3b 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45  );       /*NO_TE
36a0: 53 54 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  ST*/.  UNUSED_PA
36b0: 52 41 4d 45 54 45 52 28 61 29 3b 20 20 20 20 20  RAMETER(a);     
36c0: 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20    /*NO_TEST*/.  
36d0: 61 73 73 65 72 74 28 30 29 3b 20 20 20 20 20 20  assert(0);      
36e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
36f0: 54 45 53 54 2a 2f 0a 7d 20 20 20 20 20 20 20 20  TEST*/.}        
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
3720: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6f 70  static void noop
3730: 56 61 6c 75 65 46 75 6e 63 28 73 71 6c 69 74 65  ValueFunc(sqlite
3740: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 20 55  3_context *p){ U
3750: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
3760: 70 29 3b 20 2f 2a 6e 6f 2d 6f 70 2a 2f 20 7d 0a  p); /*no-op*/ }.
3770: 0a 2f 2a 20 57 69 6e 64 6f 77 20 66 75 6e 63 74  ./* Window funct
3780: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 61 6c  ions that use al
3790: 6c 20 77 69 6e 64 6f 77 20 69 6e 74 65 72 66 61  l window interfa
37a0: 63 65 73 3a 20 78 53 74 65 70 2c 20 78 46 69 6e  ces: xStep, xFin
37b0: 61 6c 2c 0a 2a 2a 20 78 56 61 6c 75 65 2c 20 61  al,.** xValue, a
37c0: 6e 64 20 78 49 6e 76 65 72 73 65 20 2a 2f 0a 23  nd xInverse */.#
37d0: 64 65 66 69 6e 65 20 57 49 4e 44 4f 57 46 55 4e  define WINDOWFUN
37e0: 43 41 4c 4c 28 6e 61 6d 65 2c 6e 41 72 67 2c 65  CALL(name,nArg,e
37f0: 78 74 72 61 29 20 7b 20 20 20 20 20 20 20 20 20  xtra) {         
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 41            \.  nA
3820: 72 67 2c 20 28 53 51 4c 49 54 45 5f 55 54 46 38  rg, (SQLITE_UTF8
3830: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e  |SQLITE_FUNC_WIN
3840: 44 4f 57 7c 65 78 74 72 61 29 2c 20 30 2c 20 30  DOW|extra), 0, 0
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3860: 20 20 20 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20         \.  name 
3870: 23 23 20 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d  ## StepFunc, nam
3880: 65 20 23 23 20 46 69 6e 61 6c 69 7a 65 46 75 6e  e ## FinalizeFun
3890: 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c 75 65  c, name ## Value
38a0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
38b0: 20 20 20 20 5c 0a 20 20 6e 61 6d 65 20 23 23 20      \.  name ## 
38c0: 49 6e 76 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23  InvFunc, name ##
38d0: 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20 20   Name, {0}      
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e 64 6f 77 20   \.}../* Window 
3910: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61  functions that a
3920: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  re implemented u
3930: 73 69 6e 67 20 62 79 74 65 63 6f 64 65 20 61 6e  sing bytecode an
3940: 64 20 74 68 75 73 20 68 61 76 65 0a 2a 2a 20 6e  d thus have.** n
3950: 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 73 20 66 6f  o-op routines fo
3960: 72 20 74 68 65 69 72 20 6d 65 74 68 6f 64 73 20  r their methods 
3970: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 44 4f  */.#define WINDO
3980: 57 46 55 4e 43 4e 4f 4f 50 28 6e 61 6d 65 2c 6e  WFUNCNOOP(name,n
3990: 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20 20  Arg,extra) {    
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
39c0: 20 20 6e 41 72 67 2c 20 28 53 51 4c 49 54 45 5f    nArg, (SQLITE_
39d0: 55 54 46 38 7c 53 51 4c 49 54 45 5f 46 55 4e 43  UTF8|SQLITE_FUNC
39e0: 5f 57 49 4e 44 4f 57 7c 65 78 74 72 61 29 2c 20  _WINDOW|extra), 
39f0: 30 2c 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  0, 0,           
3a00: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6e             \.  n
3a10: 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 6f 6f  oopStepFunc, noo
3a20: 70 56 61 6c 75 65 46 75 6e 63 2c 20 6e 6f 6f 70  pValueFunc, noop
3a30: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 20 20 20 20 20 5c 0a 20 20 6e 6f 6f 70          \.  noop
3a60: 53 74 65 70 46 75 6e 63 2c 20 6e 61 6d 65 20 23  StepFunc, name #
3a70: 23 20 4e 61 6d 65 2c 20 7b 30 7d 20 20 20 20 20  # Name, {0}     
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 20 57 69 6e       \.}../* Win
3ab0: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ac0: 61 74 20 75 73 65 20 61 6c 6c 20 77 69 6e 64 6f  at use all windo
3ad0: 77 20 69 6e 74 65 72 66 61 63 65 73 3a 20 78 53  w interfaces: xS
3ae0: 74 65 70 2c 20 74 68 65 0a 2a 2a 20 73 61 6d 65  tep, the.** same
3af0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 78 46 69   routine for xFi
3b00: 6e 61 6c 69 7a 65 20 61 6e 64 20 78 56 61 6c 75  nalize and xValu
3b10: 65 20 61 6e 64 20 77 68 69 63 68 20 6e 65 76 65  e and which neve
3b20: 72 20 63 61 6c 6c 0a 2a 2a 20 78 49 6e 76 65 72  r call.** xInver
3b30: 73 65 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  se. */.#define W
3b40: 49 4e 44 4f 57 46 55 4e 43 58 28 6e 61 6d 65 2c  INDOWFUNCX(name,
3b50: 6e 41 72 67 2c 65 78 74 72 61 29 20 7b 20 20 20  nArg,extra) {   
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 5c 0a 20 20 6e 41 72 67 2c 20 28 53 51 4c    \.  nArg, (SQL
3b90: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
3ba0: 46 55 4e 43 5f 57 49 4e 44 4f 57 7c 65 78 74 72  FUNC_WINDOW|extr
3bb0: 61 29 2c 20 30 2c 20 30 2c 20 20 20 20 20 20 20  a), 0, 0,       
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
3bd0: 0a 20 20 6e 61 6d 65 20 23 23 20 53 74 65 70 46  .  name ## StepF
3be0: 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20 56 61 6c  unc, name ## Val
3bf0: 75 65 46 75 6e 63 2c 20 6e 61 6d 65 20 23 23 20  ueFunc, name ## 
3c00: 56 61 6c 75 65 46 75 6e 63 2c 20 20 20 20 20 20  ValueFunc,      
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
3c20: 6e 6f 6f 70 53 74 65 70 46 75 6e 63 2c 20 6e 61  noopStepFunc, na
3c30: 6d 65 20 23 23 20 4e 61 6d 65 2c 20 7b 30 7d 20  me ## Name, {0} 
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f           \.}.../
3c70: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
3c80: 6f 73 65 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ose built-in win
3c90: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  dow functions th
3ca0: 61 74 20 61 72 65 20 6e 6f 74 20 61 6c 73 6f 20  at are not also 
3cb0: 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2f 0a 76  aggregates..*/.v
3cc0: 6f 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  oid sqlite3Windo
3cd0: 77 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64 29  wFunctions(void)
3ce0: 7b 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63 44  {.  static FuncD
3cf0: 65 66 20 61 57 69 6e 64 6f 77 46 75 6e 63 73 5b  ef aWindowFuncs[
3d00: 5d 20 3d 20 7b 0a 20 20 20 20 57 49 4e 44 4f 57  ] = {.    WINDOW
3d10: 46 55 4e 43 58 28 72 6f 77 5f 6e 75 6d 62 65 72  FUNCX(row_number
3d20: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d30: 44 4f 57 46 55 4e 43 58 28 64 65 6e 73 65 5f 72  DOWFUNCX(dense_r
3d40: 61 6e 6b 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20  ank, 0, 0),.    
3d50: 57 49 4e 44 4f 57 46 55 4e 43 58 28 72 61 6e 6b  WINDOWFUNCX(rank
3d60: 2c 20 30 2c 20 30 29 2c 0a 20 20 20 20 57 49 4e  , 0, 0),.    WIN
3d70: 44 4f 57 46 55 4e 43 58 28 70 65 72 63 65 6e 74  DOWFUNCX(percent
3d80: 5f 72 61 6e 6b 2c 20 30 2c 20 53 51 4c 49 54 45  _rank, 0, SQLITE
3d90: 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a  _FUNC_WINDOW_SIZ
3da0: 45 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46 55  E),.    WINDOWFU
3db0: 4e 43 58 28 63 75 6d 65 5f 64 69 73 74 2c 20 30  NCX(cume_dist, 0
3dc0: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  , SQLITE_FUNC_WI
3dd0: 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a 20 20 20 20  NDOW_SIZE),.    
3de0: 57 49 4e 44 4f 57 46 55 4e 43 58 28 6e 74 69 6c  WINDOWFUNCX(ntil
3df0: 65 2c 20 31 2c 20 53 51 4c 49 54 45 5f 46 55 4e  e, 1, SQLITE_FUN
3e00: 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 2c 0a  C_WINDOW_SIZE),.
3e10: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 41 4c      WINDOWFUNCAL
3e20: 4c 28 6c 61 73 74 5f 76 61 6c 75 65 2c 20 31 2c  L(last_value, 1,
3e30: 20 30 29 2c 0a 20 20 20 20 57 49 4e 44 4f 57 46   0),.    WINDOWF
3e40: 55 4e 43 4e 4f 4f 50 28 6e 74 68 5f 76 61 6c 75  UNCNOOP(nth_valu
3e50: 65 2c 20 32 2c 20 30 29 2c 0a 20 20 20 20 57 49  e, 2, 0),.    WI
3e60: 4e 44 4f 57 46 55 4e 43 4e 4f 4f 50 28 66 69 72  NDOWFUNCNOOP(fir
3e70: 73 74 5f 76 61 6c 75 65 2c 20 31 2c 20 30 29 2c  st_value, 1, 0),
3e80: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3e90: 4f 4f 50 28 6c 65 61 64 2c 20 31 2c 20 30 29 2c  OOP(lead, 1, 0),
3ea0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3eb0: 4f 4f 50 28 6c 65 61 64 2c 20 32 2c 20 30 29 2c  OOP(lead, 2, 0),
3ec0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ed0: 4f 4f 50 28 6c 65 61 64 2c 20 33 2c 20 30 29 2c  OOP(lead, 3, 0),
3ee0: 0a 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e  .    WINDOWFUNCN
3ef0: 4f 4f 50 28 6c 61 67 2c 20 31 2c 20 30 29 2c 0a  OOP(lag, 1, 0),.
3f00: 20 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f      WINDOWFUNCNO
3f10: 4f 50 28 6c 61 67 2c 20 32 2c 20 30 29 2c 0a 20  OP(lag, 2, 0),. 
3f20: 20 20 20 57 49 4e 44 4f 57 46 55 4e 43 4e 4f 4f     WINDOWFUNCNOO
3f30: 50 28 6c 61 67 2c 20 33 2c 20 30 29 2c 0a 20 20  P(lag, 3, 0),.  
3f40: 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65  };.  sqlite3Inse
3f50: 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28 61  rtBuiltinFuncs(a
3f60: 57 69 6e 64 6f 77 46 75 6e 63 73 2c 20 41 72 72  WindowFuncs, Arr
3f70: 61 79 53 69 7a 65 28 61 57 69 6e 64 6f 77 46 75  aySize(aWindowFu
3f80: 6e 63 73 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ncs));.}../*.** 
3f90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
3fa0: 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
3fb0: 65 6c 79 20 61 66 74 65 72 20 72 65 73 6f 6c 76  ely after resolv
3fc0: 69 6e 67 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ing the function
3fd0: 20 6e 61 6d 65 0a 2a 2a 20 66 6f 72 20 61 20 77   name.** for a w
3fe0: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 77  indow function w
3ff0: 69 74 68 69 6e 20 61 20 53 45 4c 45 43 54 20 73  ithin a SELECT s
4000: 74 61 74 65 6d 65 6e 74 2e 20 41 72 67 75 6d 65  tatement. Argume
4010: 6e 74 20 70 4c 69 73 74 20 69 73 20 61 0a 2a 2a  nt pList is a.**
4020: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
4030: 57 49 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f  WINDOW definitio
4040: 6e 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ns for the curre
4050: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
4060: 65 6e 74 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ent..** Argument
4070: 20 70 46 75 6e 63 20 69 73 20 74 68 65 20 66 75   pFunc is the fu
4080: 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f  nction definitio
4090: 6e 20 6a 75 73 74 20 72 65 73 6f 6c 76 65 64 20  n just resolved 
40a0: 61 6e 64 20 70 57 69 6e 0a 2a 2a 20 69 73 20 74  and pWin.** is t
40b0: 68 65 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  he Window object
40c0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
40d0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 4f 56 45  e associated OVE
40e0: 52 20 63 6c 61 75 73 65 2e 20 54 68 69 73 0a 2a  R clause. This.*
40f0: 2a 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74  * function updat
4100: 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  es the contents 
4110: 6f 66 20 70 57 69 6e 20 61 73 20 66 6f 6c 6c 6f  of pWin as follo
4120: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
4130: 20 74 68 65 20 4f 56 45 52 20 63 6c 61 75 73 65   the OVER clause
4140: 20 72 65 66 65 72 65 64 20 74 6f 20 61 20 6e 61   refered to a na
4150: 6d 65 64 20 77 69 6e 64 6f 77 20 28 61 73 20 69  med window (as i
4160: 6e 20 22 6d 61 78 28 78 29 20 4f 56 45 52 20 77  n "max(x) OVER w
4170: 69 6e 22 29 2c 0a 2a 2a 20 20 20 20 20 73 65 61  in"),.**     sea
4180: 72 63 68 20 6c 69 73 74 20 70 4c 69 73 74 20 66  rch list pList f
4190: 6f 72 20 61 20 6d 61 74 63 68 69 6e 67 20 57 49  or a matching WI
41a0: 4e 44 4f 57 20 64 65 66 69 6e 69 74 69 6f 6e 2c  NDOW definition,
41b0: 20 61 6e 64 20 75 70 64 61 74 65 20 70 57 69 6e   and update pWin
41c0: 0a 2a 2a 20 20 20 20 20 61 63 63 6f 72 64 69 6e  .**     accordin
41d0: 67 6c 79 2e 20 49 66 20 6e 6f 20 73 75 63 68 20  gly. If no such 
41e0: 57 49 4e 44 4f 57 20 63 6c 61 75 73 65 20 63 61  WINDOW clause ca
41f0: 6e 20 62 65 20 66 6f 75 6e 64 2c 20 6c 65 61 76  n be found, leav
4200: 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 20 20  e an error.**   
4210: 20 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2a 0a    in pParse..**.
4220: 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 66 75  **   * If the fu
4230: 6e 63 74 69 6f 6e 20 69 73 20 61 20 62 75 69 6c  nction is a buil
4240: 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
4250: 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72  tion that requir
4260: 65 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 77 69  es the.**     wi
4270: 6e 64 6f 77 20 74 6f 20 62 65 20 63 6f 65 72 63  ndow to be coerc
4280: 65 64 20 28 73 65 65 20 22 42 55 49 4c 54 2d 49  ed (see "BUILT-I
4290: 4e 20 57 49 4e 44 4f 57 20 46 55 4e 43 54 49 4f  N WINDOW FUNCTIO
42a0: 4e 53 22 20 61 74 20 74 68 65 20 74 6f 70 0a 2a  NS" at the top.*
42b0: 2a 20 20 20 20 20 6f 66 20 74 68 69 73 20 66 69  *     of this fi
42c0: 6c 65 29 2c 20 70 57 69 6e 20 69 73 20 75 70 64  le), pWin is upd
42d0: 61 74 65 64 20 68 65 72 65 2e 0a 2a 2f 0a 76 6f  ated here..*/.vo
42e0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
42f0: 55 70 64 61 74 65 28 0a 20 20 50 61 72 73 65 20  Update(.  Parse 
4300: 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64  *pParse, .  Wind
4310: 6f 77 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  ow *pList,      
4320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
4330: 69 73 74 20 6f 66 20 6e 61 6d 65 64 20 77 69 6e  ist of named win
4340: 64 6f 77 73 20 66 6f 72 20 74 68 69 73 20 53 45  dows for this SE
4350: 4c 45 43 54 20 2a 2f 0a 20 20 57 69 6e 64 6f 77  LECT */.  Window
4360: 20 2a 70 57 69 6e 2c 20 20 20 20 20 20 20 20 20   *pWin,         
4370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
4380: 64 6f 77 20 66 72 61 6d 65 20 74 6f 20 75 70 64  dow frame to upd
4390: 61 74 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66  ate */.  FuncDef
43a0: 20 2a 70 46 75 6e 63 20 20 20 20 20 20 20 20 20   *pFunc         
43b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 64           /* Wind
43c0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  ow function defi
43d0: 6e 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  nition */.){.  i
43e0: 66 28 20 70 57 69 6e 2d 3e 7a 4e 61 6d 65 20 26  f( pWin->zName &
43f0: 26 20 70 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 30  & pWin->eType==0
4400: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
4410: 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  p;.    for(p=pLi
4420: 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  st; p; p=p->pNex
4430: 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 69 66 28  tWin){.      if(
4440: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
4450: 70 2d 3e 7a 4e 61 6d 65 2c 20 70 57 69 6e 2d 3e  p->zName, pWin->
4460: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
4470: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
4480: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   p==0 ){.      s
4490: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
44a0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
44b0: 77 69 6e 64 6f 77 3a 20 25 73 22 2c 20 70 57 69  window: %s", pWi
44c0: 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  n->zName);.     
44d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
44e0: 20 20 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74     pWin->pPartit
44f0: 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ion = sqlite3Exp
4500: 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
4510: 3e 64 62 2c 20 70 2d 3e 70 50 61 72 74 69 74 69  >db, p->pPartiti
4520: 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 57 69 6e  on, 0);.    pWin
4530: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
4540: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
4550: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
4560: 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20  OrderBy, 0);.   
4570: 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20 3d 20   pWin->pStart = 
4580: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
4590: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53  Parse->db, p->pS
45a0: 74 61 72 74 2c 20 30 29 3b 0a 20 20 20 20 70 57  tart, 0);.    pW
45b0: 69 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74  in->pEnd = sqlit
45c0: 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
45d0: 2d 3e 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30  ->db, p->pEnd, 0
45e0: 29 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 65 53 74  );.    pWin->eSt
45f0: 61 72 74 20 3d 20 70 2d 3e 65 53 74 61 72 74 3b  art = p->eStart;
4600: 0a 20 20 20 20 70 57 69 6e 2d 3e 65 45 6e 64 20  .    pWin->eEnd 
4610: 3d 20 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 70  = p->eEnd;.    p
4620: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e  Win->eType = p->
4630: 65 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eType;.  }.  if(
4640: 20 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67   pFunc->funcFlag
4650: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
4660: 57 49 4e 44 4f 57 20 29 7b 0a 20 20 20 20 73 71  WINDOW ){.    sq
4670: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
4680: 73 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20  se->db;.    if( 
4690: 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20 29 7b  pWin->pFilter ){
46a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
46b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
46c0: 20 20 20 20 20 20 20 20 20 20 22 46 49 4c 54 45            "FILTE
46d0: 52 20 63 6c 61 75 73 65 20 6d 61 79 20 6f 6e 6c  R clause may onl
46e0: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
46f0: 67 67 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20  ggregate window 
4700: 66 75 6e 63 74 69 6f 6e 73 22 0a 20 20 20 20 20  functions".     
4710: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20 20   );.    }else.  
4720: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
4730: 6d 65 3d 3d 72 6f 77 5f 6e 75 6d 62 65 72 4e 61  me==row_numberNa
4740: 6d 65 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a 4e 61  me || pFunc->zNa
4750: 6d 65 3d 3d 6e 74 69 6c 65 4e 61 6d 65 20 29 7b  me==ntileName ){
4760: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
4770: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69  prDelete(db, pWi
4780: 6e 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20  n->pStart);.    
4790: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
47a0: 65 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45  ete(db, pWin->pE
47b0: 6e 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d  nd);.      pWin-
47c0: 3e 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e  >pStart = pWin->
47d0: 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  pEnd = 0;.      
47e0: 70 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b  pWin->eType = TK
47f0: 5f 52 4f 57 53 3b 0a 20 20 20 20 20 20 70 57 69  _ROWS;.      pWi
4800: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4810: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4820: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
4830: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  CURRENT;.    }el
4840: 73 65 0a 0a 20 20 20 20 69 66 28 20 70 46 75 6e  se..    if( pFun
4850: 63 2d 3e 7a 4e 61 6d 65 3d 3d 64 65 6e 73 65 5f  c->zName==dense_
4860: 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75 6e  rankName || pFun
4870: 63 2d 3e 7a 4e 61 6d 65 3d 3d 72 61 6e 6b 4e 61  c->zName==rankNa
4880: 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63  me.     || pFunc
4890: 2d 3e 7a 4e 61 6d 65 3d 3d 70 65 72 63 65 6e 74  ->zName==percent
48a0: 5f 72 61 6e 6b 4e 61 6d 65 20 7c 7c 20 70 46 75  _rankName || pFu
48b0: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 63 75 6d 65 5f  nc->zName==cume_
48c0: 64 69 73 74 4e 61 6d 65 0a 20 20 20 20 29 7b 0a  distName.    ){.
48d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
48e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 57 69 6e  rDelete(db, pWin
48f0: 2d 3e 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20  ->pStart);.     
4900: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4910: 74 65 28 64 62 2c 20 70 57 69 6e 2d 3e 70 45 6e  te(db, pWin->pEn
4920: 64 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e  d);.      pWin->
4930: 70 53 74 61 72 74 20 3d 20 70 57 69 6e 2d 3e 70  pStart = pWin->p
4940: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  End = 0;.      p
4950: 57 69 6e 2d 3e 65 54 79 70 65 20 3d 20 54 4b 5f  Win->eType = TK_
4960: 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 70 57 69  RANGE;.      pWi
4970: 6e 2d 3e 65 53 74 61 72 74 20 3d 20 54 4b 5f 55  n->eStart = TK_U
4980: 4e 42 4f 55 4e 44 45 44 3b 0a 20 20 20 20 20 20  NBOUNDED;.      
4990: 70 57 69 6e 2d 3e 65 45 6e 64 20 3d 20 54 4b 5f  pWin->eEnd = TK_
49a0: 43 55 52 52 45 4e 54 3b 0a 20 20 20 20 7d 0a 20  CURRENT;.    }. 
49b0: 20 7d 0a 20 20 70 57 69 6e 2d 3e 70 46 75 6e 63   }.  pWin->pFunc
49c0: 20 3d 20 70 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a   = pFunc;.}../*.
49d0: 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  ** Context objec
49e0: 74 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  t passed through
49f0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
4a00: 4c 69 73 74 28 29 20 74 6f 0a 2a 2a 20 73 65 6c  List() to.** sel
4a10: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
4a20: 45 78 70 72 43 62 28 29 20 62 79 20 73 65 6c 65  ExprCb() by sele
4a30: 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
4a40: 4c 69 73 74 28 29 2e 0a 2a 2f 0a 74 79 70 65 64  List()..*/.typed
4a50: 65 66 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77  ef struct Window
4a60: 52 65 77 72 69 74 65 20 57 69 6e 64 6f 77 52 65  Rewrite WindowRe
4a70: 77 72 69 74 65 3b 0a 73 74 72 75 63 74 20 57 69  write;.struct Wi
4a80: 6e 64 6f 77 52 65 77 72 69 74 65 20 7b 0a 20 20  ndowRewrite {.  
4a90: 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20  Window *pWin;.  
4aa0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
4ab0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62 3b   ExprList *pSub;
4ac0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 53  .  Select *pSubS
4ad0: 65 6c 65 63 74 3b 20 20 20 20 20 20 20 20 20 20  elect;          
4ae0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 75     /* Current su
4af0: 62 2d 73 65 6c 65 63 74 2c 20 69 66 20 61 6e 79  b-select, if any
4b00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61   */.};../*.** Ca
4b10: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
4b20: 75 73 65 64 20 62 79 20 73 65 6c 65 63 74 57 69  used by selectWi
4b30: 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
4b40: 28 29 2e 20 49 66 20 6e 65 63 65 73 73 61 72 79  (). If necessary
4b50: 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
4b60: 6f 6e 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  on appends to th
4b70: 65 20 6f 75 74 70 75 74 20 65 78 70 72 65 73 73  e output express
4b80: 69 6f 6e 2d 6c 69 73 74 20 61 6e 64 20 75 70 64  ion-list and upd
4b90: 61 74 65 73 20 0a 2a 2a 20 65 78 70 72 65 73 73  ates .** express
4ba0: 69 6f 6e 20 28 2a 70 70 45 78 70 72 29 20 69 6e  ion (*ppExpr) in
4bb0: 20 70 6c 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   place..*/.stati
4bc0: 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
4bd0: 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28  owRewriteExprCb(
4be0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
4bf0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
4c00: 20 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65   struct WindowRe
4c10: 77 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b  write *p = pWalk
4c20: 65 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a  er->u.pRewrite;.
4c30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
4c40: 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
4c50: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  e;..  /* If this
4c60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
4c70: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
4c80: 69 74 68 69 6e 20 61 20 73 63 61 6c 61 72 20 73  ithin a scalar s
4c90: 75 62 2d 73 65 6c 65 63 74 0a 20 20 2a 2a 20 74  ub-select.  ** t
4ca0: 68 61 74 20 75 73 65 64 20 62 79 20 74 68 65 20  hat used by the 
4cb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4cc0: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
4cd0: 2c 20 6f 6e 6c 79 20 70 72 6f 63 65 73 73 0a 20  , only process. 
4ce0: 20 2a 2a 20 54 4b 5f 43 4f 4c 55 4d 4e 20 65 78   ** TK_COLUMN ex
4cf0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
4d00: 65 66 65 72 20 74 6f 20 69 74 20 28 74 68 65 20  efer to it (the 
4d10: 6f 75 74 65 72 20 53 45 4c 45 43 54 29 2e 20 44  outer SELECT). D
4d20: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 70 72 6f 63 65  o.  ** not proce
4d30: 73 73 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  ss aggregates or
4d40: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
4d50: 73 20 61 74 20 61 6c 6c 2c 20 61 73 20 74 68 65  s at all, as the
4d60: 79 20 62 65 6c 6f 6e 67 0a 20 20 2a 2a 20 74 6f  y belong.  ** to
4d70: 20 74 68 65 20 73 63 61 6c 61 72 20 73 75 62 2d   the scalar sub-
4d80: 73 65 6c 65 63 74 2e 20 20 2a 2f 0a 20 20 69 66  select.  */.  if
4d90: 28 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74 20  ( p->pSubSelect 
4da0: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
4db0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
4dc0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4dd0: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4de0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
4df0: 6e 74 20 6e 53 72 63 20 3d 20 70 2d 3e 70 53 72  nt nSrc = p->pSr
4e00: 63 2d 3e 6e 53 72 63 3b 0a 20 20 20 20 20 20 69  c->nSrc;.      i
4e10: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
4e20: 69 3d 30 3b 20 69 3c 6e 53 72 63 3b 20 69 2b 2b  i=0; i<nSrc; i++
4e30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4e40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 2d  Expr->iTable==p-
4e50: 3e 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72  >pSrc->a[i].iCur
4e60: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
4e70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
4e80: 3d 3d 6e 53 72 63 20 29 20 72 65 74 75 72 6e 20  ==nSrc ) return 
4e90: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
4ea0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63    }.  }..  switc
4eb0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
4ec0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
4ed0: 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28  CTION:.      if(
4ee0: 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d 3d 30 20   pExpr->pWin==0 
4ef0: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
4f00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4f10: 20 20 20 20 20 20 20 57 69 6e 64 6f 77 20 2a 70         Window *p
4f20: 57 69 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Win;.        for
4f30: 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 3b 20 70  (pWin=p->pWin; p
4f40: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
4f50: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20  pNextWin){.     
4f60: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
4f70: 70 57 69 6e 3d 3d 70 57 69 6e 20 29 7b 0a 20 20  pWin==pWin ){.  
4f80: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
4f90: 28 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 3d 3d  ( pWin->pOwner==
4fa0: 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
4fb0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
4fc0: 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 20  Prune;.         
4fd0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
4fe0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
4ff0: 6c 6c 20 74 68 72 6f 75 67 68 2e 20 20 2a 2f 0a  ll through.  */.
5000: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
5010: 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63  _FUNCTION:.    c
5020: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
5030: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
5040: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
5050: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  up(pParse->db, p
5060: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
5070: 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69 74 65  p->pSub = sqlite
5080: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5090: 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75 62 2c  pParse, p->pSub,
50a0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66   pDup);.      if
50b0: 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20 20 20  ( p->pSub ){.   
50c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78 70       assert( Exp
50d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
50e0: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3d 3d  pr, EP_Static)==
50f0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  0 );.        Exp
5100: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
5110: 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b 0a  pr, EP_Static);.
5120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5130: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
5140: 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  ->db, pExpr);.  
5150: 20 20 20 20 20 20 45 78 70 72 43 6c 65 61 72 50        ExprClearP
5160: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
5170: 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20  P_Static);.     
5180: 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70 72 2c     memset(pExpr,
5190: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
51a0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70  );..        pExp
51b0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
51c0: 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  N;.        pExpr
51d0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d 3e 70  ->iColumn = p->p
51e0: 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a 20 20  Sub->nExpr-1;.  
51f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
5200: 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d 3e 69  ble = p->pWin->i
5210: 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20 7d 0a  EphCsr;.      }.
5220: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5230: 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74    }..    default
5240: 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20  : /* no-op */.  
5250: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
5260: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
5270: 74 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20  tinue;.}.static 
5280: 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77  int selectWindow
5290: 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62 28  RewriteSelectCb(
52a0: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
52b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
52c0: 29 7b 0a 20 20 73 74 72 75 63 74 20 57 69 6e 64  ){.  struct Wind
52d0: 6f 77 52 65 77 72 69 74 65 20 2a 70 20 3d 20 70  owRewrite *p = p
52e0: 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 77 72 69  Walker->u.pRewri
52f0: 74 65 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53  te;.  Select *pS
5300: 61 76 65 20 3d 20 70 2d 3e 70 53 75 62 53 65 6c  ave = p->pSubSel
5310: 65 63 74 3b 0a 20 20 69 66 28 20 70 53 61 76 65  ect;.  if( pSave
5320: 3d 3d 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ==pSelect ){.   
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 20 20 7d 65 6c 73 65 7b 0a 20  inue;.  }else{. 
5350: 20 20 20 70 2d 3e 70 53 75 62 53 65 6c 65 63 74     p->pSubSelect
5360: 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20   = pSelect;.    
5370: 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
5380: 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 65  t(pWalker, pSele
5390: 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 75 62  ct);.    p->pSub
53a0: 53 65 6c 65 63 74 20 3d 20 70 53 61 76 65 3b 0a  Select = pSave;.
53b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
53c0: 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  _Prune;.}.../*.*
53d0: 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
53e0: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
53f0: 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 2d  n in expression-
5400: 6c 69 73 74 20 70 45 4c 69 73 74 2e 20 46 6f 72  list pEList. For
5410: 20 65 61 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   each:.**.**   *
5420: 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 0a 2a 2a 20 20   TK_COLUMN,.**  
5430: 20 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e   * aggregate fun
5440: 63 74 69 6f 6e 2c 20 6f 72 0a 2a 2a 20 20 20 2a  ction, or.**   *
5450: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
5460: 20 77 69 74 68 20 61 20 57 69 6e 64 6f 77 20 6f   with a Window o
5470: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 6e 6f  bject that is no
5480: 74 20 61 20 6d 65 6d 62 65 72 20 6f 66 20 74 68  t a member of th
5490: 65 20 0a 2a 2a 20 20 20 20 20 57 69 6e 64 6f 77  e .**     Window
54a0: 20 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20   list passed as 
54b0: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
54c0: 65 6e 74 20 28 70 57 69 6e 29 2e 0a 2a 2a 0a 2a  ent (pWin)..**.*
54d0: 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64  * Append the nod
54e0: 65 20 74 6f 20 6f 75 74 70 75 74 20 65 78 70 72  e to output expr
54f0: 65 73 73 69 6f 6e 2d 6c 69 73 74 20 28 2a 70 70  ession-list (*pp
5500: 53 75 62 29 2e 20 41 6e 64 20 72 65 70 6c 61 63  Sub). And replac
5510: 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 61 20 54  e it.** with a T
5520: 4b 5f 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65  K_COLUMN that re
5530: 61 64 73 20 74 68 65 20 28 4e 2d 31 29 74 68 20  ads the (N-1)th 
5540: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 61 62 6c 65  element of table
5550: 20 0a 2a 2a 20 70 57 69 6e 2d 3e 69 45 70 68 43   .** pWin->iEphC
5560: 73 72 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74  sr, where N is t
5570: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
5580: 6d 65 6e 74 73 20 69 6e 20 28 2a 70 70 53 75 62  ments in (*ppSub
5590: 29 20 61 66 74 65 72 0a 2a 2a 20 61 70 70 65 6e  ) after.** appen
55a0: 64 69 6e 67 20 74 68 65 20 6e 65 77 20 6f 6e 65  ding the new one
55b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
55c0: 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
55d0: 72 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72  riteEList(.  Par
55e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57  se *pParse, .  W
55f0: 69 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 53  indow *pWin,.  S
5600: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 0a 20 20  rcList *pSrc,.  
5610: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
5620: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5630: 2f 2a 20 52 65 77 72 69 74 65 20 65 78 70 72 65  /* Rewrite expre
5640: 73 73 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c  ssions in this l
5650: 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ist */.  ExprLis
5660: 74 20 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20  t **ppSub       
5670: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
5680: 55 54 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65  UT: Sub-select e
5690: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a  xpression-list *
56a0: 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57  /.){.  Walker sW
56b0: 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52  alker;.  WindowR
56c0: 65 77 72 69 74 65 20 73 52 65 77 72 69 74 65 3b  ewrite sRewrite;
56d0: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c  ..  memset(&sWal
56e0: 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  ker, 0, sizeof(W
56f0: 61 6c 6b 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  alker));.  memse
5700: 74 28 26 73 52 65 77 72 69 74 65 2c 20 30 2c 20  t(&sRewrite, 0, 
5710: 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 52 65 77  sizeof(WindowRew
5720: 72 69 74 65 29 29 3b 0a 0a 20 20 73 52 65 77 72  rite));..  sRewr
5730: 69 74 65 2e 70 53 75 62 20 3d 20 2a 70 70 53 75  ite.pSub = *ppSu
5740: 62 3b 0a 20 20 73 52 65 77 72 69 74 65 2e 70 57  b;.  sRewrite.pW
5750: 69 6e 20 3d 20 70 57 69 6e 3b 0a 20 20 73 52 65  in = pWin;.  sRe
5760: 77 72 69 74 65 2e 70 53 72 63 20 3d 20 70 53 72  write.pSrc = pSr
5770: 63 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50  c;..  sWalker.pP
5780: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
5790: 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61   sWalker.xExprCa
57a0: 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57  llback = selectW
57b0: 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72  indowRewriteExpr
57c0: 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53  Cb;.  sWalker.xS
57d0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
57e0: 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
57f0: 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73  iteSelectCb;.  s
5800: 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74  Walker.u.pRewrit
5810: 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a  e = &sRewrite;..
5820: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
5830: 61 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61  alkExprList(&sWa
5840: 6c 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a  lker, pEList);..
5850: 20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72    *ppSub = sRewr
5860: 69 74 65 2e 70 53 75 62 3b 0a 7d 0a 0a 2f 2a 0a  ite.pSub;.}../*.
5870: 2a 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 70 79  ** Append a copy
5880: 20 6f 66 20 65 61 63 68 20 65 78 70 72 65 73 73   of each express
5890: 69 6f 6e 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ion in expressio
58a0: 6e 2d 6c 69 73 74 20 70 41 70 70 65 6e 64 20 74  n-list pAppend t
58b0: 6f 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  o.** expression 
58c0: 6c 69 73 74 20 70 4c 69 73 74 2e 20 52 65 74 75  list pList. Retu
58d0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
58e0: 74 68 65 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  the result list.
58f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 4c  .*/.static ExprL
5900: 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41 70 70  ist *exprListApp
5910: 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72 73 65  endList(.  Parse
5920: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5930: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
5940: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
5950: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
5960: 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 77 68     /* List to wh
5970: 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d  ich to append. M
5980: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
5990: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 70 70    ExprList *pApp
59a0: 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  end       /* Lis
59b0: 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f 20 61  t of values to a
59c0: 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20  ppend. Might be 
59d0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
59e0: 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20 20 20   pAppend ){.    
59f0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
5a00: 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f 20 70  Init = pList ? p
5a10: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
5a20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5a30: 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72 3b 20  pAppend->nExpr; 
5a40: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
5a50: 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33   *pDup = sqlite3
5a60: 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
5a70: 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69  db, pAppend->a[i
5a80: 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
5a90: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
5aa0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
5ab0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
5ac0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69 66 28  pDup);.      if(
5ad0: 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74 2d 3e   pList ) pList->
5ae0: 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72 74 4f  a[nInit+i].sortO
5af0: 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64 2d 3e  rder = pAppend->
5b00: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
5b10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5b20: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
5b30: 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
5b40: 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
5b50: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
5b60: 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20 6e 6f  argument does no
5b70: 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e 79 20  t invoke.** any 
5b80: 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  SQL window funct
5b90: 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ions, this funct
5ba0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
5bb0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 0a 2a  Otherwise, it .*
5bc0: 2a 20 72 65 77 72 69 74 65 73 20 74 68 65 20 53  * rewrites the S
5bd0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
5be0: 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77 20 66  so that window f
5bf0: 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20 66 75  unction xStep fu
5c00: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 69  nctions.** are i
5c10: 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20 63 6f  nvoked in the co
5c20: 72 72 65 63 74 20 6f 72 64 65 72 20 61 73 20 64  rrect order as d
5c30: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 20 22  escribed under "
5c40: 53 45 4c 45 43 54 20 52 45 57 52 49 54 49 4e 47  SELECT REWRITING
5c50: 22 0a 2a 2a 20 61 74 20 74 68 65 20 74 6f 70 20  ".** at the top 
5c60: 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2f  of this file..*/
5c70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 64  .int sqlite3Wind
5c80: 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20  owRewrite(Parse 
5c90: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
5ca0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
5cb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
5cc0: 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20   p->pWin ){.    
5cd0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5ce0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
5cf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
5d00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5d10: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
5d20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5d30: 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
5d40: 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  y */.    SrcList
5d50: 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
5d60: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 57 68 65  ;.    Expr *pWhe
5d70: 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
5d80: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47      ExprList *pG
5d90: 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
5da0: 75 70 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  upBy;.    Expr *
5db0: 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
5dc0: 76 69 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  ving;.    ExprLi
5dd0: 73 74 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a  st *pSort = 0;..
5de0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53      ExprList *pS
5df0: 75 62 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  ublist = 0;     
5e00: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
5e10: 6c 69 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65  list for sub-que
5e20: 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77  ry */.    Window
5e30: 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
5e40: 6e 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65  n;      /* Maste
5e50: 72 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20  r window object 
5e60: 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  */.    Window *p
5e70: 57 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Win;            
5e80: 20 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f       /* Window o
5e90: 62 6a 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a  bject iterator *
5ea0: 2f 0a 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d  /..    p->pSrc =
5eb0: 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72   0;.    p->pWher
5ec0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47  e = 0;.    p->pG
5ed0: 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20  roupBy = 0;.    
5ee0: 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  p->pHaving = 0;.
5ef0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
5f00: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
5f10: 73 65 20 66 6f 72 20 74 68 65 20 73 75 62 2d 73  se for the sub-s
5f20: 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20 74  elect. This is t
5f30: 68 65 20 63 6f 6e 63 61 74 65 6e 61 74 69 6f 6e  he concatenation
5f40: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 77  .    ** of the w
5f50: 69 6e 64 6f 77 20 50 41 52 54 49 54 49 4f 4e 20  indow PARTITION 
5f60: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c 61  and ORDER BY cla
5f70: 75 73 65 73 2e 20 54 68 65 6e 2c 20 69 66 20 74  uses. Then, if t
5f80: 68 69 73 20 6d 61 6b 65 73 20 69 74 0a 20 20 20  his makes it.   
5f90: 20 2a 2a 20 72 65 64 75 6e 64 61 6e 74 2c 20 72   ** redundant, r
5fa0: 65 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20  emove the ORDER 
5fb0: 42 59 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  BY from the pare
5fc0: 6e 74 20 53 45 4c 45 43 54 2e 20 20 2a 2f 0a 20  nt SELECT.  */. 
5fd0: 20 20 20 70 53 6f 72 74 20 3d 20 73 71 6c 69 74     pSort = sqlit
5fe0: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
5ff0: 2c 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74  , pMWin->pPartit
6000: 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 70 53 6f  ion, 0);.    pSo
6010: 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70  rt = exprListApp
6020: 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20  endList(pParse, 
6030: 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f  pSort, pMWin->pO
6040: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
6050: 20 70 53 6f 72 74 20 26 26 20 70 2d 3e 70 4f 72   pSort && p->pOr
6060: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
6070: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
6080: 73 74 43 6f 6d 70 61 72 65 28 70 53 6f 72 74 2c  stCompare(pSort,
6090: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 2d 31   p->pOrderBy, -1
60a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
60b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
60c0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
60d0: 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20  derBy);.        
60e0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
60f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6100: 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20      /* Assign a 
6110: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
6120: 72 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  r the ephemeral 
6130: 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75  table used to bu
6140: 66 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a  ffer rows..    *
6150: 2a 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65  * The OpenEpheme
6160: 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
6170: 69 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20  is coded later, 
6180: 61 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77  after it is know
6190: 6e 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e  n how.    ** man
61a0: 79 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61  y columns the ta
61b0: 62 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20  ble will have.  
61c0: 2a 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45  */.    pMWin->iE
61d0: 70 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e  phCsr = pParse->
61e0: 6e 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 73 65 6c  nTab++;..    sel
61f0: 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
6200: 45 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4d  EList(pParse, pM
6210: 57 69 6e 2c 20 70 53 72 63 2c 20 70 2d 3e 70 45  Win, pSrc, p->pE
6220: 4c 69 73 74 2c 20 26 70 53 75 62 6c 69 73 74 29  List, &pSublist)
6230: 3b 0a 20 20 20 20 73 65 6c 65 63 74 57 69 6e 64  ;.    selectWind
6240: 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 70  owRewriteEList(p
6250: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 70 53  Parse, pMWin, pS
6260: 72 63 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  rc, p->pOrderBy,
6270: 20 26 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20   &pSublist);.   
6280: 20 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43   pMWin->nBufferC
6290: 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74 20 3f  ol = (pSublist ?
62a0: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
62b0: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 41   : 0);..    /* A
62c0: 70 70 65 6e 64 20 74 68 65 20 50 41 52 54 49 54  ppend the PARTIT
62d0: 49 4f 4e 20 42 59 20 61 6e 64 20 4f 52 44 45 52  ION BY and ORDER
62e0: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 73 20   BY expressions 
62f0: 74 6f 20 74 68 65 20 74 6f 20 74 68 65 20 0a 20  to the to the . 
6300: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
6310: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
6320: 2e 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69  . They are requi
6330: 72 65 64 20 74 6f 20 66 69 67 75 72 65 20 6f 75  red to figure ou
6340: 74 20 77 68 65 72 65 20 0a 20 20 20 20 2a 2a 20  t where .    ** 
6350: 62 6f 75 6e 64 61 72 69 65 73 20 66 6f 72 20 70  boundaries for p
6360: 61 72 74 69 74 69 6f 6e 73 20 61 6e 64 20 73 65  artitions and se
6370: 74 73 20 6f 66 20 70 65 65 72 20 72 6f 77 73 20  ts of peer rows 
6380: 6c 69 65 2e 20 20 2a 2f 0a 20 20 20 20 70 53 75  lie.  */.    pSu
6390: 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69 73 74  blist = exprList
63a0: 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73  AppendList(pPars
63b0: 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 4d 57  e, pSublist, pMW
63c0: 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 3b  in->pPartition);
63d0: 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
63e0: 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
63f0: 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
6400: 69 73 74 2c 20 70 4d 57 69 6e 2d 3e 70 4f 72 64  ist, pMWin->pOrd
6410: 65 72 42 79 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  erBy);..    /* A
6420: 70 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65  ppend the argume
6430: 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 65 61  nts passed to ea
6440: 63 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69  ch window functi
6450: 6f 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  on to the.    **
6460: 20 73 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72   sub-select expr
6470: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 41 6c 73  ession list. Als
6480: 6f 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 72  o allocate two r
6490: 65 67 69 73 74 65 72 73 20 66 6f 72 20 65 61 63  egisters for eac
64a0: 68 0a 20 20 20 20 2a 2a 20 77 69 6e 64 6f 77 20  h.    ** window 
64b0: 66 75 6e 63 74 69 6f 6e 20 2d 20 6f 6e 65 20 66  function - one f
64c0: 6f 72 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  or the accumulat
64d0: 6f 72 2c 20 61 6e 6f 74 68 65 72 20 66 6f 72 20  or, another for 
64e0: 69 6e 74 65 72 69 6d 0a 20 20 20 20 2a 2a 20 72  interim.    ** r
64f0: 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20  esults.  */.    
6500: 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20  for(pWin=pMWin; 
6510: 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d  pWin; pWin=pWin-
6520: 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20  >pNextWin){.    
6530: 20 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20    pWin->iArgCol 
6540: 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53  = (pSublist ? pS
6550: 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  ublist->nExpr : 
6560: 30 29 3b 0a 20 20 20 20 20 20 70 53 75 62 6c 69  0);.      pSubli
6570: 73 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70  st = exprListApp
6580: 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20  endList(pParse, 
6590: 70 53 75 62 6c 69 73 74 2c 20 70 57 69 6e 2d 3e  pSublist, pWin->
65a0: 70 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 29  pOwner->x.pList)
65b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e  ;.      if( pWin
65c0: 2d 3e 70 46 69 6c 74 65 72 20 29 7b 0a 20 20 20  ->pFilter ){.   
65d0: 20 20 20 20 20 45 78 70 72 20 2a 70 46 69 6c 74       Expr *pFilt
65e0: 65 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  er = sqlite3Expr
65f0: 44 75 70 28 64 62 2c 20 70 57 69 6e 2d 3e 70 46  Dup(db, pWin->pF
6600: 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  ilter, 0);.     
6610: 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 73 71     pSublist = sq
6620: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
6630: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 53 75 62  end(pParse, pSub
6640: 6c 69 73 74 2c 20 70 46 69 6c 74 65 72 29 3b 0a  list, pFilter);.
6650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57        }.      pW
6660: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 20 3d 20 2b  in->regAccum = +
6670: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
6680: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65       pWin->regRe
6690: 73 75 6c 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  sult = ++pParse-
66a0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
66b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
66c0: 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57  , OP_Null, 0, pW
66d0: 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20  in->regAccum);. 
66e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
66f0: 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45  there is no ORDE
6700: 52 20 42 59 20 6f 72 20 50 41 52 54 49 54 49 4f  R BY or PARTITIO
6710: 4e 20 42 59 20 63 6c 61 75 73 65 2c 20 61 6e 64  N BY clause, and
6720: 20 74 68 65 20 77 69 6e 64 6f 77 0a 20 20 20 20   the window.    
6730: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 63 63 65  ** function acce
6740: 70 74 73 20 7a 65 72 6f 20 61 72 67 75 6d 65 6e  pts zero argumen
6750: 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  ts, and there ar
6760: 65 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6c 75 6d  e no other colum
6770: 6e 73 0a 20 20 20 20 2a 2a 20 73 65 6c 65 63 74  ns.    ** select
6780: 65 64 20 28 65 2e 67 2e 20 22 53 45 4c 45 43 54  ed (e.g. "SELECT
6790: 20 72 6f 77 5f 6e 75 6d 62 65 72 28 29 20 4f 56   row_number() OV
67a0: 45 52 20 28 29 20 46 52 4f 4d 20 74 31 22 29 2c  ER () FROM t1"),
67b0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 0a   it is possible.
67c0: 20 20 20 20 2a 2a 20 74 68 61 74 20 70 53 75 62      ** that pSub
67d0: 6c 69 73 74 20 69 73 20 73 74 69 6c 6c 20 4e 55  list is still NU
67e0: 4c 4c 20 68 65 72 65 2e 20 41 64 64 20 61 20 63  LL here. Add a c
67f0: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
6800: 6f 6e 20 68 65 72 65 20 74 6f 20 0a 20 20 20 20  on here to .    
6810: 2a 2a 20 6b 65 65 70 20 65 76 65 72 79 74 68 69  ** keep everythi
6820: 6e 67 20 6c 65 67 61 6c 20 69 6e 20 74 68 69 73  ng legal in this
6830: 20 63 61 73 65 2e 20 0a 20 20 20 20 2a 2f 0a 20   case. .    */. 
6840: 20 20 20 69 66 28 20 70 53 75 62 6c 69 73 74 3d     if( pSublist=
6850: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53 75 62  =0 ){.      pSub
6860: 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  list = sqlite3Ex
6870: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
6880: 72 73 65 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  rse, 0, .       
6890: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c     sqlite3ExprAl
68a0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  loc(db, TK_INTEG
68b0: 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e 74 54  ER, &sqlite3IntT
68c0: 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 0a 20 20 20  okens[0], 0).   
68d0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
68e0: 20 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 53   pSub = sqlite3S
68f0: 65 6c 65 63 74 4e 65 77 28 0a 20 20 20 20 20 20  electNew(.      
6900: 20 20 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69    pParse, pSubli
6910: 73 74 2c 20 70 53 72 63 2c 20 70 57 68 65 72 65  st, pSrc, pWhere
6920: 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 48 61 76  , pGroupBy, pHav
6930: 69 6e 67 2c 20 70 53 6f 72 74 2c 20 30 2c 20 30  ing, pSort, 0, 0
6940: 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 2d 3e 70  .    );.    p->p
6950: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
6960: 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30  ListAppend(db, 0
6970: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  , 0, 0);.    ass
6980: 65 72 74 28 20 70 2d 3e 70 53 72 63 20 7c 7c 20  ert( p->pSrc || 
6990: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
69a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
69b0: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Src ){.      p->
69c0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
69d0: 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20 20  ct = pSub;.     
69e0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
69f0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
6a00: 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  rse, p->pSrc);. 
6a10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6a20: 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70  ExpandSubquery(p
6a30: 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d  Parse, &p->pSrc-
6a40: 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  >a[0]) ){.      
6a50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
6a60: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
6a70: 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  {.        pSub->
6a80: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
6a90: 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 20  xpanded;.       
6aa0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
6ab0: 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20  ~SF_Aggregate;. 
6ac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
6ad0: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
6ae0: 20 70 53 75 62 2c 20 30 29 3b 0a 20 20 20 20 20   pSub, 0);.     
6af0: 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65   }..      sqlite
6b00: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6b10: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
6b20: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c   pMWin->iEphCsr,
6b30: 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72   pSublist->nExpr
6b40: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6b50: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
6b60: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
6b70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6b80: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
6b90: 64 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  d ) rc = SQLITE_
6ba0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65  NOMEM;.  }..  re
6bb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6bc0: 2a 20 46 72 65 65 20 74 68 65 20 57 69 6e 64 6f  * Free the Windo
6bd0: 77 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  w object passed 
6be0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
6bf0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
6c00: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c  sqlite3WindowDel
6c10: 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
6c20: 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 69   Window *p){.  i
6c30: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( p ){.    sqli
6c40: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
6c50: 2c 20 70 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20  , p->pFilter);. 
6c60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
6c70: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
6c80: 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20  pPartition);.   
6c90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6ca0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
6cb0: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
6cc0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
6cd0: 62 2c 20 70 2d 3e 70 45 6e 64 29 3b 0a 20 20 20  b, p->pEnd);.   
6ce0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6cf0: 74 65 28 64 62 2c 20 70 2d 3e 70 53 74 61 72 74  te(db, p->pStart
6d00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
6d10: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d  Free(db, p->zNam
6d20: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
6d30: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
6d40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
6d50: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
6d60: 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  of Window object
6d70: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 74 68  s starting at th
6d80: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
6d90: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6da0: 65 33 57 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65  e3WindowListDele
6db0: 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
6dc0: 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20 77 68  Window *p){.  wh
6dd0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 57 69  ile( p ){.    Wi
6de0: 6e 64 6f 77 20 2a 70 4e 65 78 74 20 3d 20 70 2d  ndow *pNext = p-
6df0: 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20 73  >pNextWin;.    s
6e00: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
6e10: 74 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 70  te(db, p);.    p
6e20: 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a   = pNext;.  }.}.
6e30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
6e40: 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ent expression i
6e50: 73 20 61 6e 20 50 52 45 43 45 44 49 4e 47 20 6f  s an PRECEDING o
6e60: 72 20 46 4f 4c 4c 4f 57 49 4e 47 20 6f 66 66 73  r FOLLOWING offs
6e70: 65 74 2e 20 20 54 68 65 0a 2a 2a 20 76 61 6c 75  et.  The.** valu
6e80: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  e should be a no
6e90: 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67  n-negative integ
6ea0: 65 72 2e 20 20 49 66 20 74 68 65 20 76 61 6c 75  er.  If the valu
6eb0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 63 6f  e is not a.** co
6ec0: 6e 73 74 61 6e 74 2c 20 63 68 61 6e 67 65 20 69  nstant, change i
6ed0: 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 65 20  t to NULL.  The 
6ee0: 66 61 63 74 20 74 68 61 74 20 69 74 20 69 73 20  fact that it is 
6ef0: 74 68 65 6e 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  then a non-negat
6f00: 69 76 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 77  ive.** integer w
6f10: 69 6c 6c 20 62 65 20 63 61 75 67 68 74 20 6c 61  ill be caught la
6f20: 74 65 72 2e 20 20 42 75 74 20 69 74 20 69 73 20  ter.  But it is 
6f30: 69 6d 70 6f 72 74 61 6e 74 20 6e 6f 74 20 74 6f  important not to
6f40: 20 6c 65 61 76 65 0a 2a 2a 20 76 61 72 69 61 62   leave.** variab
6f50: 6c 65 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  le values in the
6f60: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
6f80: 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f   *sqlite3WindowO
6f90: 66 66 73 65 74 45 78 70 72 28 50 61 72 73 65 20  ffsetExpr(Parse 
6fa0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
6fb0: 45 78 70 72 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Expr){.  if( 0==
6fc0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
6fd0: 73 74 61 6e 74 28 70 45 78 70 72 29 20 29 7b 0a  stant(pExpr) ){.
6fe0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6ff0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7000: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 70 45  , pExpr);.    pE
7010: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7020: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
7030: 62 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  b, TK_NULL, 0, 0
7040: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7050: 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pExpr;.}../*.** 
7060: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
7070: 75 72 6e 20 61 20 6e 65 77 20 57 69 6e 64 6f 77  urn a new Window
7080: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   object describi
7090: 6e 67 20 61 20 57 69 6e 64 6f 77 20 44 65 66 69  ng a Window Defi
70a0: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 57 69 6e 64 6f  nition..*/.Windo
70b0: 77 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  w *sqlite3Window
70c0: 41 6c 6c 6f 63 28 0a 20 20 50 61 72 73 65 20 2a  Alloc(.  Parse *
70d0: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
70e0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
70f0: 0a 20 20 69 6e 74 20 65 54 79 70 65 2c 20 20 20  .  int eType,   
7100: 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 79       /* Frame ty
7110: 70 65 2e 20 54 4b 5f 52 41 4e 47 45 20 6f 72 20  pe. TK_RANGE or 
7120: 54 4b 5f 52 4f 57 53 20 2a 2f 0a 20 20 69 6e 74  TK_ROWS */.  int
7130: 20 65 53 74 61 72 74 2c 20 20 20 20 20 20 20 2f   eStart,       /
7140: 2a 20 53 74 61 72 74 20 74 79 70 65 3a 20 43 55  * Start type: CU
7150: 52 52 45 4e 54 2c 20 50 52 45 43 45 44 49 4e 47  RRENT, PRECEDING
7160: 2c 20 46 4f 4c 4c 4f 57 49 4e 47 2c 20 55 4e 42  , FOLLOWING, UNB
7170: 4f 55 4e 44 45 44 20 2a 2f 0a 20 20 45 78 70 72  OUNDED */.  Expr
7180: 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
7190: 20 53 74 61 72 74 20 77 69 6e 64 6f 77 20 73 69   Start window si
71a0: 7a 65 20 69 66 20 54 4b 5f 50 52 45 43 45 44 49  ze if TK_PRECEDI
71b0: 4e 47 20 6f 72 20 46 4f 4c 4c 4f 57 49 4e 47 20  NG or FOLLOWING 
71c0: 2a 2f 0a 20 20 69 6e 74 20 65 45 6e 64 2c 20 20  */.  int eEnd,  
71d0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 79         /* End ty
71e0: 70 65 3a 20 43 55 52 52 45 4e 54 2c 20 46 4f 4c  pe: CURRENT, FOL
71f0: 4c 4f 57 49 4e 47 2c 20 54 4b 5f 55 4e 42 4f 55  LOWING, TK_UNBOU
7200: 4e 44 45 44 2c 20 50 52 45 43 45 44 49 4e 47 20  NDED, PRECEDING 
7210: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 6e 64 20  */.  Expr *pEnd 
7220: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 77 69         /* End wi
7230: 6e 64 6f 77 20 73 69 7a 65 20 69 66 20 54 4b 5f  ndow size if TK_
7240: 46 4f 4c 4c 4f 57 49 4e 47 20 6f 72 20 50 52 45  FOLLOWING or PRE
7250: 43 45 44 49 4e 47 20 2a 2f 0a 29 7b 0a 20 20 57  CEDING */.){.  W
7260: 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 30 3b  indow *pWin = 0;
7270: 0a 0a 20 20 2f 2a 20 50 61 72 73 65 72 20 61 73  ..  /* Parser as
7280: 73 75 72 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sures the follow
7290: 69 6e 67 3a 20 2a 2f 0a 20 20 61 73 73 65 72 74  ing: */.  assert
72a0: 28 20 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47  ( eType==TK_RANG
72b0: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52  E || eType==TK_R
72c0: 4f 57 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OWS );.  assert(
72d0: 20 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55 52 52   eStart==TK_CURR
72e0: 45 4e 54 20 7c 7c 20 65 53 74 61 72 74 3d 3d 54  ENT || eStart==T
72f0: 4b 5f 50 52 45 43 45 44 49 4e 47 0a 20 20 20 20  K_PRECEDING.    
7300: 20 20 20 20 20 20 20 7c 7c 20 65 53 74 61 72 74         || eStart
7310: 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c  ==TK_UNBOUNDED |
7320: 7c 20 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c  | eStart==TK_FOL
7330: 4c 4f 57 49 4e 47 20 29 3b 0a 20 20 61 73 73 65  LOWING );.  asse
7340: 72 74 28 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52  rt( eEnd==TK_CUR
7350: 52 45 4e 54 20 7c 7c 20 65 45 6e 64 3d 3d 54 4b  RENT || eEnd==TK
7360: 5f 46 4f 4c 4c 4f 57 49 4e 47 0a 20 20 20 20 20  _FOLLOWING.     
7370: 20 20 20 20 20 20 7c 7c 20 65 45 6e 64 3d 3d 54        || eEnd==T
7380: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 7c 7c 20 65  K_UNBOUNDED || e
7390: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
73a0: 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  G );.  assert( (
73b0: 65 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45  eStart==TK_PRECE
73c0: 44 49 4e 47 20 7c 7c 20 65 53 74 61 72 74 3d 3d  DING || eStart==
73d0: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 29 3d 3d 28  TK_FOLLOWING)==(
73e0: 70 53 74 61 72 74 21 3d 30 29 20 29 3b 0a 20 20  pStart!=0) );.  
73f0: 61 73 73 65 72 74 28 20 28 65 45 6e 64 3d 3d 54  assert( (eEnd==T
7400: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 7c 7c 20 65  K_FOLLOWING || e
7410: 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e  End==TK_PRECEDIN
7420: 47 29 3d 3d 28 70 45 6e 64 21 3d 30 29 20 29 3b  G)==(pEnd!=0) );
7430: 0a 0a 0a 20 20 2f 2a 20 49 66 20 61 20 66 72 61  ...  /* If a fra
7440: 6d 65 20 69 73 20 64 65 63 6c 61 72 65 64 20 22  me is declared "
7450: 52 41 4e 47 45 22 20 28 6e 6f 74 20 22 52 4f 57  RANGE" (not "ROW
7460: 53 22 29 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  S"), then it may
7470: 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 65 69   not use.  ** ei
7480: 74 68 65 72 20 22 3c 65 78 70 72 3e 20 50 52 45  ther "<expr> PRE
7490: 43 45 44 49 4e 47 22 20 6f 72 20 22 3c 65 78 70  CEDING" or "<exp
74a0: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2e 0a 20  r> FOLLOWING".. 
74b0: 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
74c0: 3d 54 4b 5f 52 41 4e 47 45 20 26 26 20 28 70 53  =TK_RANGE && (pS
74d0: 74 61 72 74 21 3d 30 20 7c 7c 20 70 45 6e 64 21  tart!=0 || pEnd!
74e0: 3d 30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =0) ){.    sqlit
74f0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7500: 65 2c 20 22 52 41 4e 47 45 20 6d 75 73 74 20 75  e, "RANGE must u
7510: 73 65 20 6f 6e 6c 79 20 55 4e 42 4f 55 4e 44 45  se only UNBOUNDE
7520: 44 20 6f 72 20 43 55 52 52 45 4e 54 20 52 4f 57  D or CURRENT ROW
7530: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 77 69 6e  ");.    goto win
7540: 64 6f 77 41 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d  dowAllocErr;.  }
7550: 0a 0a 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61  ..  /* Additiona
7560: 6c 6c 79 2c 20 74 68 65 0a 20 20 2a 2a 20 73 74  lly, the.  ** st
7570: 61 72 74 69 6e 67 20 62 6f 75 6e 64 61 72 79 20  arting boundary 
7580: 74 79 70 65 20 6d 61 79 20 6e 6f 74 20 6f 63 63  type may not occ
7590: 75 72 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68  ur earlier in th
75a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 73 74  e following list
75b0: 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65 20 65   than.  ** the e
75c0: 6e 64 69 6e 67 20 62 6f 75 6e 64 61 72 79 20 74  nding boundary t
75d0: 79 70 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ype:.  **.  **  
75e0: 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43 45   UNBOUNDED PRECE
75f0: 44 49 4e 47 0a 20 20 2a 2a 20 20 20 3c 65 78 70  DING.  **   <exp
7600: 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 20 20 2a  r> PRECEDING.  *
7610: 2a 20 20 20 43 55 52 52 45 4e 54 20 52 4f 57 0a  *   CURRENT ROW.
7620: 20 20 2a 2a 20 20 20 3c 65 78 70 72 3e 20 46 4f    **   <expr> FO
7630: 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 55  LLOWING.  **   U
7640: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
7650: 4e 47 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  NG.  **.  ** The
7660: 20 70 61 72 73 65 72 20 65 6e 73 75 72 65 73 20   parser ensures 
7670: 74 68 61 74 20 22 55 4e 42 4f 55 4e 44 45 44 20  that "UNBOUNDED 
7680: 50 52 45 43 45 44 49 4e 47 22 20 63 61 6e 6e 6f  PRECEDING" canno
7690: 74 20 62 65 20 75 73 65 64 20 61 73 20 61 6e 20  t be used as an 
76a0: 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 6f 75 6e  ending.  ** boun
76b0: 64 61 72 79 2c 20 61 6e 64 20 74 68 61 6e 20 22  dary, and than "
76c0: 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57  UNBOUNDED FOLLOW
76d0: 49 4e 47 22 20 63 61 6e 6e 6f 74 20 62 65 20 75  ING" cannot be u
76e0: 73 65 64 20 61 73 20 61 20 73 74 61 72 74 69 6e  sed as a startin
76f0: 67 0a 20 20 2a 2a 20 66 72 61 6d 65 20 62 6f 75  g.  ** frame bou
7700: 6e 64 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ndary..  */.  if
7710: 28 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 43 55  ( (eStart==TK_CU
7720: 52 52 45 4e 54 20 26 26 20 65 45 6e 64 3d 3d 54  RRENT && eEnd==T
7730: 4b 5f 50 52 45 43 45 44 49 4e 47 29 0a 20 20 20  K_PRECEDING).   
7740: 7c 7c 20 28 65 53 74 61 72 74 3d 3d 54 4b 5f 46  || (eStart==TK_F
7750: 4f 4c 4c 4f 57 49 4e 47 20 26 26 20 28 65 45 6e  OLLOWING && (eEn
7760: 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20  d==TK_PRECEDING 
7770: 7c 7c 20 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52  || eEnd==TK_CURR
7780: 45 4e 54 29 29 0a 20 20 29 7b 0a 20 20 20 20 73  ENT)).  ){.    s
7790: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
77a0: 50 61 72 73 65 2c 20 22 75 6e 73 75 70 70 6f 72  Parse, "unsuppor
77b0: 74 65 64 20 66 72 61 6d 65 20 64 65 6c 69 6d 69  ted frame delimi
77c0: 74 65 72 20 66 6f 72 20 52 4f 57 53 22 29 3b 0a  ter for ROWS");.
77d0: 20 20 20 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41      goto windowA
77e0: 6c 6c 6f 63 45 72 72 3b 0a 20 20 7d 0a 0a 20 20  llocErr;.  }..  
77f0: 70 57 69 6e 20 3d 20 28 57 69 6e 64 6f 77 2a 29  pWin = (Window*)
7800: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7810: 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ero(pParse->db, 
7820: 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b  sizeof(Window));
7830: 0a 20 20 69 66 28 20 70 57 69 6e 3d 3d 30 20 29  .  if( pWin==0 )
7840: 20 67 6f 74 6f 20 77 69 6e 64 6f 77 41 6c 6c 6f   goto windowAllo
7850: 63 45 72 72 3b 0a 20 20 70 57 69 6e 2d 3e 65 54  cErr;.  pWin->eT
7860: 79 70 65 20 3d 20 65 54 79 70 65 3b 0a 20 20 70  ype = eType;.  p
7870: 57 69 6e 2d 3e 65 53 74 61 72 74 20 3d 20 65 53  Win->eStart = eS
7880: 74 61 72 74 3b 0a 20 20 70 57 69 6e 2d 3e 65 45  tart;.  pWin->eE
7890: 6e 64 20 3d 20 65 45 6e 64 3b 0a 20 20 70 57 69  nd = eEnd;.  pWi
78a0: 6e 2d 3e 70 45 6e 64 20 3d 20 73 71 6c 69 74 65  n->pEnd = sqlite
78b0: 33 57 69 6e 64 6f 77 4f 66 66 73 65 74 45 78 70  3WindowOffsetExp
78c0: 72 28 70 50 61 72 73 65 2c 20 70 45 6e 64 29 3b  r(pParse, pEnd);
78d0: 0a 20 20 70 57 69 6e 2d 3e 70 53 74 61 72 74 20  .  pWin->pStart 
78e0: 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4f  = sqlite3WindowO
78f0: 66 66 73 65 74 45 78 70 72 28 70 50 61 72 73 65  ffsetExpr(pParse
7900: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65 74  , pStart);.  ret
7910: 75 72 6e 20 70 57 69 6e 3b 0a 0a 77 69 6e 64 6f  urn pWin;..windo
7920: 77 41 6c 6c 6f 63 45 72 72 3a 0a 20 20 73 71 6c  wAllocErr:.  sql
7930: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
7940: 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 6e 64 29  Parse->db, pEnd)
7950: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
7960: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
7970: 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 72 65 74  , pStart);.  ret
7980: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7990: 41 74 74 61 63 68 20 77 69 6e 64 6f 77 20 6f 62  Attach window ob
79a0: 6a 65 63 74 20 70 57 69 6e 20 74 6f 20 65 78 70  ject pWin to exp
79b0: 72 65 73 73 69 6f 6e 20 70 2e 0a 2a 2f 0a 76 6f  ression p..*/.vo
79c0: 69 64 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  id sqlite3Window
79d0: 41 74 74 61 63 68 28 50 61 72 73 65 20 2a 70 50  Attach(Parse *pP
79e0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 57  arse, Expr *p, W
79f0: 69 6e 64 6f 77 20 2a 70 57 69 6e 29 7b 0a 20 20  indow *pWin){.  
7a00: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 2f 2a 20  if( p ){.    /* 
7a10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
7a20: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20  only called for 
7a30: 74 68 65 20 70 61 72 73 65 72 2e 20 20 49 66 20  the parser.  If 
7a40: 70 57 69 6e 20 77 61 73 20 6e 6f 74 0a 20 20 20  pWin was not.   
7a50: 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 64 75   ** allocated du
7a60: 65 20 74 6f 20 61 6e 20 4f 4f 4d 2c 20 74 68 65  e to an OOM, the
7a70: 6e 20 74 68 65 20 70 61 72 73 65 72 20 77 6f 75  n the parser wou
7a80: 6c 64 20 66 61 69 6c 20 62 65 66 6f 72 65 20 65  ld fail before e
7a90: 76 65 72 0a 20 20 20 20 2a 2a 20 69 6e 76 6f 6b  ver.    ** invok
7aa0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
7ab0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 41 4c 57 41   */.    if( ALWA
7ac0: 59 53 28 70 57 69 6e 29 20 29 7b 0a 20 20 20 20  YS(pWin) ){.    
7ad0: 20 20 70 2d 3e 70 57 69 6e 20 3d 20 70 57 69 6e    p->pWin = pWin
7ae0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4f  ;.      pWin->pO
7af0: 77 6e 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  wner = p;.      
7b00: 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45  if( p->flags & E
7b10: 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  P_Distinct ){.  
7b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7b30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
7b40: 20 20 20 20 20 20 20 20 20 22 44 49 53 54 49 4e           "DISTIN
7b50: 43 54 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72  CT is not suppor
7b60: 74 65 64 20 66 6f 72 20 77 69 6e 64 6f 77 20 66  ted for window f
7b70: 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20  unctions");.    
7b80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
7b90: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69  e{.    sqlite3Wi
7ba0: 6e 64 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73  ndowDelete(pPars
7bb0: 65 2d 3e 64 62 2c 20 70 57 69 6e 29 3b 0a 20 20  e->db, pWin);.  
7bc0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
7bd0: 6e 20 30 20 69 66 20 74 68 65 20 74 77 6f 20 77  n 0 if the two w
7be0: 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 61 72  indow objects ar
7bf0: 65 20 69 64 65 6e 74 69 63 61 6c 2c 20 6f 72 20  e identical, or 
7c00: 6e 6f 6e 2d 7a 65 72 6f 20 6f 74 68 65 72 77 69  non-zero otherwi
7c10: 73 65 2e 0a 2a 2a 20 49 64 65 6e 74 69 63 61 6c  se..** Identical
7c20: 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20   window objects 
7c30: 63 61 6e 20 62 65 20 70 72 6f 63 65 73 73 65 64  can be processed
7c40: 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 73 63 61   in a single sca
7c50: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
7c60: 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72 65 28 50  3WindowCompare(P
7c70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69  arse *pParse, Wi
7c80: 6e 64 6f 77 20 2a 70 31 2c 20 57 69 6e 64 6f 77  ndow *p1, Window
7c90: 20 2a 70 32 29 7b 0a 20 20 69 66 28 20 70 31 2d   *p2){.  if( p1-
7ca0: 3e 65 54 79 70 65 21 3d 70 32 2d 3e 65 54 79 70  >eType!=p2->eTyp
7cb0: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
7cc0: 69 66 28 20 70 31 2d 3e 65 53 74 61 72 74 21 3d  if( p1->eStart!=
7cd0: 70 32 2d 3e 65 53 74 61 72 74 20 29 20 72 65 74  p2->eStart ) ret
7ce0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 31 2d  urn 1;.  if( p1-
7cf0: 3e 65 45 6e 64 21 3d 70 32 2d 3e 65 45 6e 64 20  >eEnd!=p2->eEnd 
7d00: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
7d10: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
7d20: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 31 2d  pare(pParse, p1-
7d30: 3e 70 53 74 61 72 74 2c 20 70 32 2d 3e 70 53 74  >pStart, p2->pSt
7d40: 61 72 74 2c 20 2d 31 29 20 29 20 72 65 74 75 72  art, -1) ) retur
7d50: 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 1;.  if( sqlit
7d60: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 50  e3ExprCompare(pP
7d70: 61 72 73 65 2c 20 70 31 2d 3e 70 45 6e 64 2c 20  arse, p1->pEnd, 
7d80: 70 32 2d 3e 70 45 6e 64 2c 20 2d 31 29 20 29 20  p2->pEnd, -1) ) 
7d90: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
7da0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
7db0: 6f 6d 70 61 72 65 28 70 31 2d 3e 70 50 61 72 74  ompare(p1->pPart
7dc0: 69 74 69 6f 6e 2c 20 70 32 2d 3e 70 50 61 72 74  ition, p2->pPart
7dd0: 69 74 69 6f 6e 2c 20 2d 31 29 20 29 20 72 65 74  ition, -1) ) ret
7de0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
7df0: 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
7e00: 61 72 65 28 70 31 2d 3e 70 4f 72 64 65 72 42 79  are(p1->pOrderBy
7e10: 2c 20 70 32 2d 3e 70 4f 72 64 65 72 42 79 2c 20  , p2->pOrderBy, 
7e20: 2d 31 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  -1) ) return 1;.
7e30: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
7e40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61  /*.** This is ca
7e50: 6c 6c 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  lled by code in 
7e60: 73 65 6c 65 63 74 2e 63 20 62 65 66 6f 72 65 20  select.c before 
7e70: 69 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  it calls sqlite3
7e80: 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
7e90: 74 6f 20 62 65 67 69 6e 20 69 74 65 72 61 74 69  to begin iterati
7ea0: 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 73  ng through the s
7eb0: 75 62 2d 71 75 65 72 79 20 72 65 73 75 6c 74 73  ub-query results
7ec0: 2e 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 20  . It is used to 
7ed0: 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20  allocate.** and 
7ee0: 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 69 73  initialize regis
7ef0: 74 65 72 73 20 61 6e 64 20 63 75 72 73 6f 72 73  ters and cursors
7f00: 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
7f10: 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 29  WindowCodeStep()
7f20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7f30: 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69 74 28  3WindowCodeInit(
7f40: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
7f50: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 29 7b 0a 20  indow *pMWin){. 
7f60: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
7f70: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
7f80: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7f90: 29 3b 0a 20 20 69 6e 74 20 6e 50 61 72 74 20 3d  );.  int nPart =
7fa0: 20 28 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69 74   (pMWin->pPartit
7fb0: 69 6f 6e 20 3f 20 70 4d 57 69 6e 2d 3e 70 50 61  ion ? pMWin->pPa
7fc0: 72 74 69 74 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a  rtition->nExpr :
7fd0: 20 30 29 3b 0a 20 20 6e 50 61 72 74 20 2b 3d 20   0);.  nPart += 
7fe0: 28 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79  (pMWin->pOrderBy
7ff0: 20 3f 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72   ? pMWin->pOrder
8000: 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  By->nExpr : 0);.
8010: 20 20 69 66 28 20 6e 50 61 72 74 20 29 7b 0a 20    if( nPart ){. 
8020: 20 20 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61 72     pMWin->regPar
8030: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
8040: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
8050: 6e 4d 65 6d 20 2b 3d 20 6e 50 61 72 74 3b 0a 20  nMem += nPart;. 
8060: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8070: 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
8080: 20 30 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61   0, pMWin->regPa
8090: 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  rt, pMWin->regPa
80a0: 72 74 2b 6e 50 61 72 74 2d 31 29 3b 0a 20 20 7d  rt+nPart-1);.  }
80b0: 0a 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57  ..  for(pWin=pMW
80c0: 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  in; pWin; pWin=p
80d0: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
80e0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 20 3d      FuncDef *p =
80f0: 20 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20   pWin->pFunc;.  
8100: 20 20 69 66 28 20 28 70 2d 3e 66 75 6e 63 46 6c    if( (p->funcFl
8110: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
8120: 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57 69  C_MINMAX) && pWi
8130: 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e  n->eStart!=TK_UN
8140: 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20 20  BOUNDED ){.     
8150: 20 2f 2a 20 54 68 65 20 69 6e 6c 69 6e 65 20 76   /* The inline v
8160: 65 72 73 69 6f 6e 73 20 6f 66 20 6d 69 6e 28 29  ersions of min()
8170: 20 61 6e 64 20 6d 61 78 28 29 20 72 65 71 75 69   and max() requi
8180: 72 65 20 61 20 73 69 6e 67 6c 65 20 65 70 68 65  re a single ephe
8190: 6d 65 72 61 6c 0a 20 20 20 20 20 20 2a 2a 20 74  meral.      ** t
81a0: 61 62 6c 65 20 61 6e 64 20 33 20 72 65 67 69 73  able and 3 regis
81b0: 74 65 72 73 2e 20 54 68 65 20 72 65 67 69 73 74  ters. The regist
81c0: 65 72 73 20 61 72 65 20 75 73 65 64 20 61 73 20  ers are used as 
81d0: 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a  follows:.      *
81e0: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 72 65 67  *.      **   reg
81f0: 41 70 70 2b 30 3a 20 73 6c 6f 74 20 74 6f 20 63  App+0: slot to c
8200: 6f 70 79 20 6d 69 6e 28 29 2f 6d 61 78 28 29 20  opy min()/max() 
8210: 61 72 67 75 6d 65 6e 74 20 74 6f 20 66 6f 72 20  argument to for 
8220: 4d 61 6b 65 52 65 63 6f 72 64 0a 20 20 20 20 20  MakeRecord.     
8230: 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 31 3a 20   **   regApp+1: 
8240: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 75 73  integer value us
8250: 65 64 20 74 6f 20 65 6e 73 75 72 65 20 6b 65 79  ed to ensure key
8260: 73 20 61 72 65 20 75 6e 69 71 75 65 0a 20 20 20  s are unique.   
8270: 20 20 20 2a 2a 20 20 20 72 65 67 41 70 70 2b 32     **   regApp+2
8280: 3a 20 6f 75 74 70 75 74 20 6f 66 20 4d 61 6b 65  : output of Make
8290: 52 65 63 6f 72 64 0a 20 20 20 20 20 20 2a 2f 0a  Record.      */.
82a0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
82b0: 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70 4f  pList = pWin->pO
82c0: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  wner->x.pList;. 
82d0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
82e0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
82f0: 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  KeyInfoFromExprL
8300: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
8310: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
8320: 70 57 69 6e 2d 3e 63 73 72 41 70 70 20 3d 20 70  pWin->csrApp = p
8330: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
8340: 20 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70       pWin->regAp
8350: 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  p = pParse->nMem
8360: 2b 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  +1;.      pParse
8370: 2d 3e 6e 4d 65 6d 20 2b 3d 20 33 3b 0a 20 20 20  ->nMem += 3;.   
8380: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
8390: 26 26 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e  && pWin->pFunc->
83a0: 7a 4e 61 6d 65 5b 31 5d 3d 3d 27 69 27 20 29 7b  zName[1]=='i' ){
83b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
83c0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
83d0: 4f 72 64 65 72 5b 30 5d 3d 3d 30 20 29 3b 0a 20  Order[0]==0 );. 
83e0: 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
83f0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 3d  >aSortOrder[0] =
8400: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
8410: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8420: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
8430: 68 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 63  hemeral, pWin->c
8440: 73 72 41 70 70 2c 20 32 29 3b 0a 20 20 20 20 20  srApp, 2);.     
8450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
8460: 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 6f  ndP4(v, pKeyInfo
8470: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
8480: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8490: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
84a0: 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  eger, 0, pWin->r
84b0: 65 67 41 70 70 2b 31 29 3b 0a 20 20 20 20 7d 0a  egApp+1);.    }.
84c0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 2d 3e      else if( p->
84d0: 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65  zName==nth_value
84e0: 4e 61 6d 65 20 7c 7c 20 70 2d 3e 7a 4e 61 6d 65  Name || p->zName
84f0: 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  ==first_valueNam
8500: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  e ){.      /* Al
8510: 6c 6f 63 61 74 65 20 74 77 6f 20 72 65 67 69 73  locate two regis
8520: 74 65 72 73 20 61 74 20 70 57 69 6e 2d 3e 72 65  ters at pWin->re
8530: 67 41 70 70 2e 20 54 68 65 73 65 20 77 69 6c 6c  gApp. These will
8540: 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 20 20   be used to.    
8550: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 73    ** store the s
8560: 74 61 72 74 20 61 6e 64 20 65 6e 64 20 69 6e 64  tart and end ind
8570: 65 78 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ex of the curren
8580: 74 20 66 72 61 6d 65 2e 20 20 2a 2f 0a 20 20 20  t frame.  */.   
8590: 20 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e     assert( pMWin
85a0: 2d 3e 69 45 70 68 43 73 72 20 29 3b 0a 20 20 20  ->iEphCsr );.   
85b0: 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 20     pWin->regApp 
85c0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
85d0: 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 63 73  ;.      pWin->cs
85e0: 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rApp = pParse->n
85f0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Tab++;.      pPa
8600: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 32 3b 0a  rse->nMem += 2;.
8610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8620: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
8630: 65 6e 44 75 70 2c 20 70 57 69 6e 2d 3e 63 73 72  enDup, pWin->csr
8640: 41 70 70 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  App, pMWin->iEph
8650: 43 73 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Csr);.    }.    
8660: 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4e 61 6d  else if( p->zNam
8670: 65 3d 3d 6c 65 61 64 4e 61 6d 65 20 7c 7c 20 70  e==leadName || p
8680: 2d 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65  ->zName==lagName
8690: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
86a0: 28 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72  ( pMWin->iEphCsr
86b0: 20 29 3b 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e   );.      pWin->
86c0: 63 73 72 41 70 70 20 3d 20 70 50 61 72 73 65 2d  csrApp = pParse-
86d0: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73  >nTab++;.      s
86e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
86f0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
8700: 70 57 69 6e 2d 3e 63 73 72 41 70 70 2c 20 70 4d  pWin->csrApp, pM
8710: 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20  Win->iEphCsr);. 
8720: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8730: 2a 20 41 20 22 50 52 45 43 45 44 49 4e 47 20 3c  * A "PRECEDING <
8740: 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d 30  expr>" (eCond==0
8750: 29 20 6f 72 20 22 46 4f 4c 4c 4f 57 49 4e 47 20  ) or "FOLLOWING 
8760: 3c 65 78 70 72 3e 22 20 28 65 43 6f 6e 64 3d 3d  <expr>" (eCond==
8770: 31 29 20 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c  1) or the.** val
8780: 75 65 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  ue of the second
8790: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6e 74 68   argument to nth
87a0: 5f 76 61 6c 75 65 28 29 20 28 65 43 6f 6e 64 3d  _value() (eCond=
87b0: 3d 32 29 20 68 61 73 20 6a 75 73 74 20 62 65 65  =2) has just bee
87c0: 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 61  n.** evaluated a
87d0: 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 6c 65  nd the result le
87e0: 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 72  ft in register r
87f0: 65 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  eg. This functio
8800: 6e 20 67 65 6e 65 72 61 74 65 73 20 56 4d 0a 2a  n generates VM.*
8810: 2a 20 63 6f 64 65 20 74 6f 20 63 68 65 63 6b 20  * code to check 
8820: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 69  that the value i
8830: 73 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  s a non-negative
8840: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 74 68 72   integer and thr
8850: 6f 77 73 20 61 6e 0a 2a 2a 20 65 78 63 65 70 74  ows an.** except
8860: 69 6f 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ion if it is not
8870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8880: 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56   windowCheckIntV
8890: 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  alue(Parse *pPar
88a0: 73 65 2c 20 69 6e 74 20 72 65 67 2c 20 69 6e 74  se, int reg, int
88b0: 20 65 43 6f 6e 64 29 7b 0a 20 20 73 74 61 74 69   eCond){.  stati
88c0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
88d0: 45 72 72 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 66  Err[] = {.    "f
88e0: 72 61 6d 65 20 73 74 61 72 74 69 6e 67 20 6f 66  rame starting of
88f0: 66 73 65 74 20 6d 75 73 74 20 62 65 20 61 20 6e  fset must be a n
8900: 6f 6e 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65  on-negative inte
8910: 67 65 72 22 2c 0a 20 20 20 20 22 66 72 61 6d 65  ger",.    "frame
8920: 20 65 6e 64 69 6e 67 20 6f 66 66 73 65 74 20 6d   ending offset m
8930: 75 73 74 20 62 65 20 61 20 6e 6f 6e 2d 6e 65 67  ust be a non-neg
8940: 61 74 69 76 65 20 69 6e 74 65 67 65 72 22 2c 0a  ative integer",.
8950: 20 20 20 20 22 73 65 63 6f 6e 64 20 61 72 67 75      "second argu
8960: 6d 65 6e 74 20 74 6f 20 6e 74 68 5f 76 61 6c 75  ment to nth_valu
8970: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 73 69  e must be a posi
8980: 74 69 76 65 20 69 6e 74 65 67 65 72 22 0a 20 20  tive integer".  
8990: 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  };.  static int 
89a0: 61 4f 70 5b 5d 20 3d 20 7b 20 4f 50 5f 47 65 2c  aOp[] = { OP_Ge,
89b0: 20 4f 50 5f 47 65 2c 20 4f 50 5f 47 74 20 7d 3b   OP_Ge, OP_Gt };
89c0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
89d0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
89e0: 73 65 29 3b 0a 20 20 69 6e 74 20 72 65 67 5a 65  se);.  int regZe
89f0: 72 6f 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ro = sqlite3GetT
8a00: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
8a10: 20 20 61 73 73 65 72 74 28 20 65 43 6f 6e 64 3d    assert( eCond=
8a20: 3d 30 20 7c 7c 20 65 43 6f 6e 64 3d 3d 31 20 7c  =0 || eCond==1 |
8a30: 7c 20 65 43 6f 6e 64 3d 3d 32 20 29 3b 0a 20 20  | eCond==2 );.  
8a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8a50: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
8a60: 20 30 2c 20 72 65 67 5a 65 72 6f 29 3b 0a 20 20   0, regZero);.  
8a70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8a80: 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
8a90: 74 2c 20 72 65 67 2c 20 73 71 6c 69 74 65 33 56  t, reg, sqlite3V
8aa0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
8ab0: 29 2b 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65  )+2);.  VdbeCove
8ac0: 72 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d  rageIf(v, eCond=
8ad0: 3d 30 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72  =0);.  VdbeCover
8ae0: 61 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d  ageIf(v, eCond==
8af0: 31 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  1);.  VdbeCovera
8b00: 67 65 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 32  geIf(v, eCond==2
8b10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
8b20: 41 64 64 4f 70 33 28 76 2c 20 61 4f 70 5b 65 43  AddOp3(v, aOp[eC
8b30: 6f 6e 64 5d 2c 20 72 65 67 5a 65 72 6f 2c 20 73  ond], regZero, s
8b40: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
8b50: 74 41 64 64 72 28 76 29 2b 32 2c 20 72 65 67 29  tAddr(v)+2, reg)
8b60: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
8b70: 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65  NeverNullIf(v, e
8b80: 43 6f 6e 64 3d 3d 30 29 3b 0a 20 20 56 64 62 65  Cond==0);.  Vdbe
8b90: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c  CoverageNeverNul
8ba0: 6c 49 66 28 76 2c 20 65 43 6f 6e 64 3d 3d 31 29  lIf(v, eCond==1)
8bb0: 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
8bc0: 4e 65 76 65 72 4e 75 6c 6c 49 66 28 76 2c 20 65  NeverNullIf(v, e
8bd0: 43 6f 6e 64 3d 3d 32 29 3b 0a 20 20 73 71 6c 69  Cond==2);.  sqli
8be0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8bf0: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
8c00: 5f 45 52 52 4f 52 2c 20 4f 45 5f 41 62 6f 72 74  _ERROR, OE_Abort
8c10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
8c20: 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69  AppendP4(v, (voi
8c30: 64 2a 29 61 7a 45 72 72 5b 65 43 6f 6e 64 5d 2c  d*)azErr[eCond],
8c40: 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 73   P4_STATIC);.  s
8c50: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8c60: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
8c70: 5a 65 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Zero);.}../*.** 
8c80: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
8c90: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  r of arguments p
8ca0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e  assed to the win
8cb0: 64 6f 77 2d 66 75 6e 63 74 69 6f 6e 20 61 73 73  dow-function ass
8cc0: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
8cd0: 74 68 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65  the object passe
8ce0: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
8cf0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
8d00: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
8d10: 69 63 20 69 6e 74 20 77 69 6e 64 6f 77 41 72 67  ic int windowArg
8d20: 43 6f 75 6e 74 28 57 69 6e 64 6f 77 20 2a 70 57  Count(Window *pW
8d30: 69 6e 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  in){.  ExprList 
8d40: 2a 70 4c 69 73 74 20 3d 20 70 57 69 6e 2d 3e 70  *pList = pWin->p
8d50: 4f 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  Owner->x.pList;.
8d60: 20 20 72 65 74 75 72 6e 20 28 70 4c 69 73 74 20    return (pList 
8d70: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
8d80: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65   0);.}../*.** Ge
8d90: 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74  nerate VM code t
8da0: 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20  o invoke either 
8db0: 78 53 74 65 70 28 29 20 28 69 66 20 62 49 6e 76  xStep() (if bInv
8dc0: 65 72 73 65 20 69 73 20 30 29 20 6f 72 20 0a 2a  erse is 0) or .*
8dd0: 2a 20 78 49 6e 76 65 72 73 65 20 28 69 66 20 62  * xInverse (if b
8de0: 49 6e 76 65 72 73 65 20 69 73 20 6e 6f 6e 2d 7a  Inverse is non-z
8df0: 65 72 6f 29 20 66 6f 72 20 65 61 63 68 20 77 69  ero) for each wi
8e00: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ndow function in
8e10: 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
8e20: 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
8e30: 20 70 4d 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20   pMWin. Or, for 
8e40: 62 75 69 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 20  built-in window 
8e50: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 74 68 61  functions.** tha
8e60: 74 20 64 6f 20 6e 6f 74 20 75 73 65 20 74 68 65  t do not use the
8e70: 20 73 74 61 6e 64 61 72 64 20 66 75 6e 63 74 69   standard functi
8e80: 6f 6e 20 41 50 49 2c 20 67 65 6e 65 72 61 74 65  on API, generate
8e90: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 2a 2a   the required.**
8ea0: 20 69 6e 6c 69 6e 65 20 56 4d 20 63 6f 64 65 2e   inline VM code.
8eb0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
8ec0: 6e 74 20 63 73 72 20 69 73 20 67 72 65 61 74 65  nt csr is greate
8ed0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
8ee0: 74 6f 20 30 2c 20 74 68 65 6e 20 61 72 67 75 6d  to 0, then argum
8ef0: 65 6e 74 20 72 65 67 20 69 73 0a 2a 2a 20 74 68  ent reg is.** th
8f00: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
8f10: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
8f20: 72 65 67 69 73 74 65 72 73 20 67 75 61 72 61 6e  registers guaran
8f30: 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  teed to be large
8f40: 0a 2a 2a 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  .** enough to ho
8f50: 6c 64 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  ld the array of 
8f60: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 65 61  arguments for ea
8f70: 63 68 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 20  ch function. In 
8f80: 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68 65  this case.** the
8f90: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 65   arguments are e
8fa0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
8fb0: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
8fc0: 20 63 73 72 20 69 6e 74 6f 20 74 68 65 0a 2a 2a   csr into the.**
8fd0: 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74   array of regist
8fe0: 65 72 73 20 62 65 66 6f 72 65 20 69 6e 76 6f 6b  ers before invok
8ff0: 69 6e 67 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  ing OP_AggStep o
9000: 72 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 0a  r OP_AggInverse.
9010: 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 63 73 72  **.** Or, if csr
9020: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
9030: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 61 72 72  ro, then the arr
9040: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
9050: 61 74 20 72 65 67 20 69 73 0a 2a 2a 20 61 6c 72  at reg is.** alr
9060: 65 61 64 79 20 70 6f 70 75 6c 61 74 65 64 20 77  eady populated w
9070: 69 74 68 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  ith all columns 
9080: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
9090: 20 72 6f 77 20 6f 66 20 74 68 65 20 73 75 62 2d   row of the sub-
90a0: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
90b0: 61 72 67 75 6d 65 6e 74 20 72 65 67 50 61 72 74  argument regPart
90c0: 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Size is non-zero
90d0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72  , then it is a r
90e0: 65 67 69 73 74 65 72 20 63 6f 6e 74 61 69 6e 69  egister containi
90f0: 6e 67 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  ng the.** number
9100: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
9110: 63 75 72 72 65 6e 74 20 70 61 72 74 69 74 69 6f  current partitio
9120: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
9130: 64 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28  d windowAggStep(
9140: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9150: 2c 20 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d 57  , .  Window *pMW
9160: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
9170: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
9180: 69 73 74 20 6f 66 20 77 69 6e 64 6f 77 20 66 75  ist of window fu
9190: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
91a0: 20 63 73 72 2c 20 20 20 20 20 20 20 20 20 20 20   csr,           
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
91c0: 52 65 61 64 20 61 72 67 75 6d 65 6e 74 73 20 66  Read arguments f
91d0: 72 6f 6d 20 74 68 69 73 20 63 75 72 73 6f 72 20  rom this cursor 
91e0: 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 76 65 72 73  */.  int bInvers
91f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
9200: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
9210: 69 6e 76 6f 6b 65 20 78 49 6e 76 65 72 73 65 20  invoke xInverse 
9220: 69 6e 73 74 65 61 64 20 6f 66 20 78 53 74 65 70  instead of xStep
9230: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 2c 20 20   */.  int reg,  
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
9260: 66 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  f registers */. 
9270: 20 69 6e 74 20 72 65 67 50 61 72 74 53 69 7a 65   int regPartSize
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9290: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e   /* Register con
92a0: 74 61 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20  taining size of 
92b0: 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a  partition */.){.
92c0: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
92d0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
92e0: 65 29 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57  e);.  Window *pW
92f0: 69 6e 3b 0a 20 20 66 6f 72 28 70 57 69 6e 3d 70  in;.  for(pWin=p
9300: 4d 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  MWin; pWin; pWin
9310: 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
9320: 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
9330: 3d 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66  = pWin->pFunc->f
9340: 75 6e 63 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e  uncFlags;.    in
9350: 74 20 72 65 67 41 72 67 3b 0a 20 20 20 20 69 6e  t regArg;.    in
9360: 74 20 6e 41 72 67 20 3d 20 77 69 6e 64 6f 77 41  t nArg = windowA
9370: 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 3b 0a 0a  rgCount(pWin);..
9380: 20 20 20 20 69 66 28 20 63 73 72 3e 3d 30 20 29      if( csr>=0 )
9390: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
93a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
93b0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
93c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
93d0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
93e0: 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69  mn, csr, pWin->i
93f0: 41 72 67 43 6f 6c 2b 69 2c 20 72 65 67 2b 69 29  ArgCol+i, reg+i)
9400: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9410: 72 65 67 41 72 67 20 3d 20 72 65 67 3b 0a 20 20  regArg = reg;.  
9420: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
9430: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
9440: 4f 57 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  OW_SIZE ){.     
9450: 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29     if( nArg==0 )
9460: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 41  {.          regA
9470: 72 67 20 3d 20 72 65 67 50 61 72 74 53 69 7a 65  rg = regPartSize
9480: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9490: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
94a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
94b0: 4f 50 5f 53 43 6f 70 79 2c 20 72 65 67 50 61 72  OP_SCopy, regPar
94c0: 74 53 69 7a 65 2c 20 72 65 67 2b 6e 41 72 67 29  tSize, reg+nArg)
94d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
94e0: 20 20 20 20 6e 41 72 67 2b 2b 3b 0a 20 20 20 20      nArg++;.    
94f0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
9500: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 66       assert( !(f
9510: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
9520: 4e 43 5f 57 49 4e 44 4f 57 5f 53 49 5a 45 29 20  NC_WINDOW_SIZE) 
9530: 29 3b 0a 20 20 20 20 20 20 72 65 67 41 72 67 20  );.      regArg 
9540: 3d 20 72 65 67 20 2b 20 70 57 69 6e 2d 3e 69 41  = reg + pWin->iA
9550: 72 67 43 6f 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20  rgCol;.    }..  
9560: 20 20 69 66 28 20 28 70 57 69 6e 2d 3e 70 46 75    if( (pWin->pFu
9570: 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
9580: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
9590: 41 58 29 20 0a 20 20 20 20 20 20 26 26 20 70 57  AX) .      && pW
95a0: 69 6e 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55  in->eStart!=TK_U
95b0: 4e 42 4f 55 4e 44 45 44 20 0a 20 20 20 20 29 7b  NBOUNDED .    ){
95c0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 49  .      int addrI
95d0: 73 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56  sNull = sqlite3V
95e0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
95f0: 49 73 4e 75 6c 6c 2c 20 72 65 67 41 72 67 29 3b  IsNull, regArg);
9600: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
9610: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 69 66  age(v);.      if
9620: 28 20 62 49 6e 76 65 72 73 65 3d 3d 30 20 29 7b  ( bInverse==0 ){
9630: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9640: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9650: 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e 2d 3e 72  _AddImm, pWin->r
9660: 65 67 41 70 70 2b 31 2c 20 31 29 3b 0a 20 20 20  egApp+1, 1);.   
9670: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9680: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f  AddOp2(v, OP_SCo
9690: 70 79 2c 20 72 65 67 41 72 67 2c 20 70 57 69 6e  py, regArg, pWin
96a0: 2d 3e 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20  ->regApp);.     
96b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
96c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
96d0: 65 63 6f 72 64 2c 20 70 57 69 6e 2d 3e 72 65 67  ecord, pWin->reg
96e0: 41 70 70 2c 20 32 2c 20 70 57 69 6e 2d 3e 72 65  App, 2, pWin->re
96f0: 67 41 70 70 2b 32 29 3b 0a 20 20 20 20 20 20 20  gApp+2);.       
9700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9710: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
9720: 72 74 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  rt, pWin->csrApp
9730: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b 32  , pWin->regApp+2
9740: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9750: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9760: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
9770: 4f 50 5f 53 65 65 6b 47 45 2c 20 70 57 69 6e 2d  OP_SeekGE, pWin-
9780: 3e 63 73 72 41 70 70 2c 20 30 2c 20 72 65 67 41  >csrApp, 0, regA
9790: 72 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rg, 1);.        
97a0: 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65  VdbeCoverageNeve
97b0: 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20 20  rTaken(v);.     
97c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
97d0: 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
97e0: 65 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  e, pWin->csrApp)
97f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9800: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
9810: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
9820: 65 6e 74 41 64 64 72 28 76 29 2d 32 29 3b 0a 20  entAddr(v)-2);. 
9830: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9840: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
9850: 28 76 2c 20 61 64 64 72 49 73 4e 75 6c 6c 29 3b  (v, addrIsNull);
9860: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
9870: 57 69 6e 2d 3e 72 65 67 41 70 70 20 29 7b 0a 20  Win->regApp ){. 
9880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69       assert( pWi
9890: 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  n->pFunc->zName=
98a0: 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a 20  =nth_valueName. 
98b0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 57 69            || pWi
98c0: 6e 2d 3e 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d  n->pFunc->zName=
98d0: 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d 65  =first_valueName
98e0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
98f0: 61 73 73 65 72 74 28 20 62 49 6e 76 65 72 73 65  assert( bInverse
9900: 3d 3d 30 20 7c 7c 20 62 49 6e 76 65 72 73 65 3d  ==0 || bInverse=
9910: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
9920: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9930: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 57 69 6e   OP_AddImm, pWin
9940: 2d 3e 72 65 67 41 70 70 2b 31 2d 62 49 6e 76 65  ->regApp+1-bInve
9950: 72 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  rse, 1);.    }el
9960: 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 70 46 75  se if( pWin->pFu
9970: 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e  nc->zName==leadN
9980: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ame.           |
9990: 7c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 7a  | pWin->pFunc->z
99a0: 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 0a 20 20  Name==lagName.  
99b0: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f    ){.      /* no
99c0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  -op */.    }else
99d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
99e0: 49 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  If = 0;.      if
99f0: 28 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 20  ( pWin->pFilter 
9a00: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
9a10: 65 67 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  egTmp;.        a
9a20: 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 30 20 7c  ssert( nArg==0 |
9a30: 7c 20 6e 41 72 67 3d 3d 70 57 69 6e 2d 3e 70 4f  | nArg==pWin->pO
9a40: 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  wner->x.pList->n
9a50: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
9a60: 61 73 73 65 72 74 28 20 6e 41 72 67 20 7c 7c 20  assert( nArg || 
9a70: 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e  pWin->pOwner->x.
9a80: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
9a90: 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29 7b      if( csr>0 ){
9aa0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 67 54 6d  .          regTm
9ab0: 70 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  p = sqlite3GetTe
9ac0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
9ad0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9ae0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9af0: 5f 43 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57  _Column, csr, pW
9b00: 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 6e 41 72 67  in->iArgCol+nArg
9b10: 2c 72 65 67 54 6d 70 29 3b 0a 20 20 20 20 20 20  ,regTmp);.      
9b20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9b30: 20 20 20 72 65 67 54 6d 70 20 3d 20 72 65 67 41     regTmp = regA
9b40: 72 67 20 2b 20 6e 41 72 67 3b 0a 20 20 20 20 20  rg + nArg;.     
9b50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64     }.        add
9b60: 72 49 66 20 3d 20 73 71 6c 69 74 65 33 56 64 62  rIf = sqlite3Vdb
9b70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
9b80: 4e 6f 74 2c 20 72 65 67 54 6d 70 2c 20 30 2c 20  Not, regTmp, 0, 
9b90: 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
9ba0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
9bb0: 20 20 20 20 20 69 66 28 20 63 73 72 3e 30 20 29       if( csr>0 )
9bc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9bd0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9be0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 54 6d 70  g(pParse, regTmp
9bf0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9c00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
9c10: 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63  Win->pFunc->func
9c20: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
9c30: 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
9c40: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
9c50: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
9c60: 61 73 73 65 72 74 28 20 6e 41 72 67 3e 30 20 29  assert( nArg>0 )
9c70: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
9c80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43  = sqlite3ExprNNC
9c90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
9ca0: 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
9cb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
9cc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9cd0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
9ce0: 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 30 2c  OP_CollSeq, 0,0,
9cf0: 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  0, (const char*)
9d00: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
9d10: 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Q);.      }.    
9d20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9d30: 4f 70 33 28 76 2c 20 62 49 6e 76 65 72 73 65 3f  Op3(v, bInverse?
9d40: 20 4f 50 5f 41 67 67 49 6e 76 65 72 73 65 20 3a   OP_AggInverse :
9d50: 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 0a 20 20   OP_AggStep, .  
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 62 49 6e 76 65 72 73 65 2c 20        bInverse, 
9d80: 72 65 67 41 72 67 2c 20 70 57 69 6e 2d 3e 72 65  regArg, pWin->re
9d90: 67 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73  gAccum);.      s
9da0: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
9db0: 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e  P4(v, pWin->pFun
9dc0: 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
9dd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9de0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
9df0: 29 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 69 66  )nArg);.      if
9e00: 28 20 61 64 64 72 49 66 20 29 20 73 71 6c 69 74  ( addrIf ) sqlit
9e10: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
9e20: 2c 20 61 64 64 72 49 66 29 3b 0a 20 20 20 20 7d  , addrIf);.    }
9e30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
9e40: 6e 65 72 61 74 65 20 56 4d 20 63 6f 64 65 20 74  nerate VM code t
9e50: 6f 20 69 6e 76 6f 6b 65 20 65 69 74 68 65 72 20  o invoke either 
9e60: 78 56 61 6c 75 65 28 29 20 28 62 46 69 6e 61 6c  xValue() (bFinal
9e70: 3d 3d 30 29 20 6f 72 20 78 46 69 6e 61 6c 69 7a  ==0) or xFinaliz
9e80: 65 28 29 0a 2a 2a 20 28 62 46 69 6e 61 6c 3d 3d  e().** (bFinal==
9e90: 31 29 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64  1) for each wind
9ea0: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 74  ow function in t
9eb0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
9ec0: 74 61 72 74 69 6e 67 20 61 74 0a 2a 2a 20 70 4d  tarting at.** pM
9ed0: 57 69 6e 2e 20 4f 72 2c 20 66 6f 72 20 62 75 69  Win. Or, for bui
9ee0: 6c 74 2d 69 6e 20 77 69 6e 64 6f 77 2d 66 75 6e  lt-in window-fun
9ef0: 63 74 69 6f 6e 73 20 74 68 61 74 20 64 6f 20 6e  ctions that do n
9f00: 6f 74 20 75 73 65 20 74 68 65 20 73 74 61 6e 64  ot use the stand
9f10: 61 72 64 0a 2a 2a 20 41 50 49 2c 20 67 65 6e 65  ard.** API, gene
9f20: 72 61 74 65 20 74 68 65 20 65 71 75 69 76 61 6c  rate the equival
9f30: 65 6e 74 20 56 4d 20 63 6f 64 65 2e 0a 2a 2f 0a  ent VM code..*/.
9f40: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
9f50: 6f 77 41 67 67 46 69 6e 61 6c 28 50 61 72 73 65  owAggFinal(Parse
9f60: 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f 77   *pParse, Window
9f70: 20 2a 70 4d 57 69 6e 2c 20 69 6e 74 20 62 46 69   *pMWin, int bFi
9f80: 6e 61 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nal){.  Vdbe *v 
9f90: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
9fa0: 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69 6e 64  (pParse);.  Wind
9fb0: 6f 77 20 2a 70 57 69 6e 3b 0a 0a 20 20 66 6f 72  ow *pWin;..  for
9fc0: 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57 69  (pWin=pMWin; pWi
9fd0: 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e  n; pWin=pWin->pN
9fe0: 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 69 66 28  extWin){.    if(
9ff0: 20 28 70 57 69 6e 2d 3e 70 46 75 6e 63 2d 3e 66   (pWin->pFunc->f
a000: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
a010: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 20 0a  E_FUNC_MINMAX) .
a020: 20 20 20 20 20 26 26 20 70 57 69 6e 2d 3e 65 53       && pWin->eS
a030: 74 61 72 74 21 3d 54 4b 5f 55 4e 42 4f 55 4e 44  tart!=TK_UNBOUND
a040: 45 44 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ED .    ){.     
a050: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a060: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
a070: 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c  , pWin->regResul
a080: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
a090: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
a0a0: 50 5f 4c 61 73 74 2c 20 70 57 69 6e 2d 3e 63 73  P_Last, pWin->cs
a0b0: 72 41 70 70 29 3b 0a 20 20 20 20 20 20 56 64 62  rApp);.      Vdb
a0c0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a0d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a0e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
a0f0: 6d 6e 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70  mn, pWin->csrApp
a100: 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  , 0, pWin->regRe
a110: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  sult);.      sql
a120: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
a130: 28 76 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  (v, sqlite3VdbeC
a140: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2d 32 29  urrentAddr(v)-2)
a150: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 6e  ;.      if( bFin
a160: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
a170: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
a180: 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74 65  v, OP_ResetSorte
a190: 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 29  r, pWin->csrApp)
a1a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
a1b0: 6c 73 65 20 69 66 28 20 70 57 69 6e 2d 3e 72 65  lse if( pWin->re
a1c0: 67 41 70 70 20 29 7b 0a 20 20 20 20 7d 65 6c 73  gApp ){.    }els
a1d0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 62 46 69  e{.      if( bFi
a1e0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nal ){.        s
a1f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a200: 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
a210: 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
a220: 20 77 69 6e 64 6f 77 41 72 67 43 6f 75 6e 74 28   windowArgCount(
a230: 70 57 69 6e 29 29 3b 0a 20 20 20 20 20 20 20 20  pWin));.        
a240: 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
a250: 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75  dP4(v, pWin->pFu
a260: 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
a270: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a280: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
a290: 5f 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67  _Copy, pWin->reg
a2a0: 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67  Accum, pWin->reg
a2b0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20  Result);.       
a2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2d0: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
a2e0: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
a2f0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a310: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
a320: 41 67 67 56 61 6c 75 65 2c 20 70 57 69 6e 2d 3e  AggValue, pWin->
a330: 72 65 67 41 63 63 75 6d 2c 20 77 69 6e 64 6f 77  regAccum, window
a340: 41 72 67 43 6f 75 6e 74 28 70 57 69 6e 29 2c 0a  ArgCount(pWin),.
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 69               pWi
a370: 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20  n->regResult);. 
a380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a390: 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
a3a0: 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
a3b0: 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 7d 0a  NCDEF);.      }.
a3c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
a3d0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a3e0: 20 67 65 6e 65 72 61 74 65 73 20 56 4d 20 63 6f   generates VM co
a3f0: 64 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  de to invoke the
a400: 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20   sub-routine at 
a410: 61 64 64 72 65 73 73 0a 2a 2a 20 6c 62 6c 46 6c  address.** lblFl
a420: 75 73 68 50 61 72 74 20 6f 6e 63 65 20 66 6f 72  ushPart once for
a430: 20 65 61 63 68 20 70 61 72 74 69 74 69 6f 6e 20   each partition 
a440: 77 69 74 68 20 74 68 65 20 65 6e 74 69 72 65 20  with the entire 
a450: 70 61 72 74 69 74 69 6f 6e 20 63 61 63 68 65 64  partition cached
a460: 20 69 6e 0a 2a 2a 20 74 68 65 20 57 69 6e 64 6f   in.** the Windo
a470: 77 2e 69 45 70 68 43 73 72 20 74 65 6d 70 20 74  w.iEphCsr temp t
a480: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
a490: 76 6f 69 64 20 77 69 6e 64 6f 77 50 61 72 74 69  void windowParti
a4a0: 74 69 6f 6e 43 61 63 68 65 28 0a 20 20 50 61 72  tionCache(.  Par
a4b0: 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 65  se *pParse,.  Se
a4c0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a4e0: 20 54 68 65 20 72 65 77 72 69 74 74 65 6e 20 53   The rewritten S
a4f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
a500: 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
a510: 70 57 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  pWInfo,         
a520: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 49 6e 66       /* WhereInf
a530: 6f 20 74 6f 20 63 61 6c 6c 20 57 68 65 72 65 45  o to call WhereE
a540: 6e 64 28 29 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nd() on */.  int
a550: 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c 20 20   regFlushPart,  
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a570: 52 65 67 69 73 74 65 72 20 74 6f 20 75 73 65 20  Register to use 
a580: 77 69 74 68 20 47 6f 73 75 62 20 6c 62 6c 46 6c  with Gosub lblFl
a590: 75 73 68 50 61 72 74 20 2a 2f 0a 20 20 69 6e 74  ushPart */.  int
a5a0: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 2c 20 20   lblFlushPart,  
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a5c0: 53 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 47 6f  Subroutine to Go
a5d0: 73 75 62 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  sub to */.  int 
a5e0: 2a 70 52 65 67 53 69 7a 65 20 20 20 20 20 20 20  *pRegSize       
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
a600: 55 54 3a 20 52 65 67 69 73 74 65 72 20 63 6f 6e  UT: Register con
a610: 74 61 69 6e 69 6e 67 20 70 61 72 74 69 74 69 6f  taining partitio
a620: 6e 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 57  n size */.){.  W
a630: 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70  indow *pMWin = p
a640: 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a  ->pWin;.  Vdbe *
a650: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
a660: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
a670: 74 20 69 53 75 62 43 73 72 20 3d 20 70 2d 3e 70  t iSubCsr = p->p
a680: 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  Src->a[0].iCurso
a690: 72 3b 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  r;.  int nSub = 
a6a0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
a6b0: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20  ab->nCol;.  int 
a6c0: 6b 3b 0a 0a 20 20 69 6e 74 20 72 65 67 20 3d 20  k;..  int reg = 
a6d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
a6e0: 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20    int regRecord 
a6f0: 3d 20 72 65 67 2b 6e 53 75 62 3b 0a 20 20 69 6e  = reg+nSub;.  in
a700: 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65 67  t regRowid = reg
a710: 52 65 63 6f 72 64 2b 31 3b 0a 0a 20 20 2a 70 52  Record+1;..  *pR
a720: 65 67 53 69 7a 65 20 3d 20 72 65 67 52 6f 77 69  egSize = regRowi
a730: 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  d;.  pParse->nMe
a740: 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a  m += nSub + 2;..
a750: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 63 6f    /* Load the co
a760: 6c 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72 20  lumn values for 
a770: 74 68 65 20 72 6f 77 20 72 65 74 75 72 6e 65 64  the row returned
a780: 20 62 79 20 74 68 65 20 73 75 62 2d 73 65 6c 65   by the sub-sele
a790: 63 74 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  ct.  ** into an 
a7a0: 61 72 72 61 79 20 6f 66 20 72 65 67 69 73 74 65  array of registe
a7b0: 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 72  rs starting at r
a7c0: 65 67 2e 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30  eg. */.  for(k=0
a7d0: 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a  ; k<nSub; k++){.
a7e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a7f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
a800: 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c 20  mn, iSubCsr, k, 
a810: 72 65 67 2b 6b 29 3b 0a 20 20 7d 0a 20 20 73 71  reg+k);.  }.  sq
a820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a830: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
a840: 2c 20 72 65 67 2c 20 6e 53 75 62 2c 20 72 65 67  , reg, nSub, reg
a850: 52 65 63 6f 72 64 29 3b 0a 0a 20 20 2f 2a 20 43  Record);..  /* C
a860: 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
a870: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6e  the start of a n
a880: 65 77 20 70 61 72 74 69 74 69 6f 6e 2e 20 49 66  ew partition. If
a890: 20 73 6f 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20   so, call the.  
a8a0: 2a 2a 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  ** flush_partiti
a8b0: 6f 6e 20 73 75 62 2d 72 6f 75 74 69 6e 65 2e 20  on sub-routine. 
a8c0: 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d   */.  if( pMWin-
a8d0: 3e 70 50 61 72 74 69 74 69 6f 6e 20 29 7b 0a 20  >pPartition ){. 
a8e0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
a8f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
a900: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
a910: 74 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 50  tion;.    int nP
a920: 61 72 74 20 3d 20 70 50 61 72 74 2d 3e 6e 45 78  art = pPart->nEx
a930: 70 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 4e  pr;.    int regN
a940: 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20 70  ewPart = reg + p
a950: 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c  MWin->nBufferCol
a960: 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ;.    KeyInfo *p
a970: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
a980: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
a990: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61  List(pParse, pPa
a9a0: 72 74 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  rt, 0, 0);..    
a9b0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
a9c0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
a9d0: 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61  ompare, regNewPa
a9e0: 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  rt, pMWin->regPa
a9f0: 72 74 2c 6e 50 61 72 74 29 3b 0a 20 20 20 20 73  rt,nPart);.    s
aa00: 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
aa10: 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65  P4(v, (void*)pKe
aa20: 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
aa30: 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
aa40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
aa50: 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 61 64  Jump, addr+2, ad
aa60: 64 72 2b 34 2c 20 61 64 64 72 2b 32 29 3b 0a 20  dr+4, addr+2);. 
aa70: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45     VdbeCoverageE
aa80: 71 4e 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  qNe(v);.    sqli
aa90: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
aaa0: 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4e 65 77   OP_Copy, regNew
aab0: 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72 65 67  Part, pMWin->reg
aac0: 50 61 72 74 2c 20 6e 50 61 72 74 2d 31 29 3b 0a  Part, nPart-1);.
aad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aae0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
aaf0: 62 2c 20 72 65 67 46 6c 75 73 68 50 61 72 74 2c  b, regFlushPart,
ab00: 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29 3b 0a   lblFlushPart);.
ab10: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
ab20: 28 76 2c 20 22 63 61 6c 6c 20 66 6c 75 73 68 5f  (v, "call flush_
ab30: 70 61 72 74 69 74 69 6f 6e 22 29 29 3b 0a 20 20  partition"));.  
ab40: 7d 0a 0a 20 20 2f 2a 20 42 75 66 66 65 72 20 74  }..  /* Buffer t
ab50: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
ab60: 6e 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  n the ephemeral 
ab70: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
ab80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ab90: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d   OP_NewRowid, pM
aba0: 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 72 65  Win->iEphCsr, re
abb0: 67 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  gRowid);.  sqlit
abc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
abd0: 4f 50 5f 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e  OP_Insert, pMWin
abe0: 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 65  ->iEphCsr, regRe
abf0: 63 6f 72 64 2c 20 72 65 67 52 6f 77 69 64 29 3b  cord, regRowid);
ac00: 0a 0a 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  ..  /* End of th
ac10: 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
ac20: 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
ac30: 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20 20 2f 2a  d(pWInfo);..  /*
ac40: 20 49 6e 76 6f 6b 65 20 22 66 6c 75 73 68 5f 70   Invoke "flush_p
ac50: 61 72 74 69 74 69 6f 6e 22 20 74 6f 20 64 65 61  artition" to dea
ac60: 6c 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c  l with the final
ac70: 20 28 6f 72 20 6f 6e 6c 79 29 20 70 61 72 74 69   (or only) parti
ac80: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
ac90: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
aca0: 50 5f 47 6f 73 75 62 2c 20 72 65 67 46 6c 75 73  P_Gosub, regFlus
acb0: 68 50 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50  hPart, lblFlushP
acc0: 61 72 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  art);.  VdbeComm
acd0: 65 6e 74 28 28 76 2c 20 22 63 61 6c 6c 20 66 6c  ent((v, "call fl
ace0: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22 29 29  ush_partition"))
acf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
ad00: 65 20 74 68 65 20 73 75 62 2d 72 6f 75 74 69 6e  e the sub-routin
ad10: 65 20 61 74 20 72 65 67 47 6f 73 75 62 20 28 67  e at regGosub (g
ad20: 65 6e 65 72 61 74 65 64 20 62 79 20 63 6f 64 65  enerated by code
ad30: 20 69 6e 20 73 65 6c 65 63 74 2e 63 29 20 74 6f   in select.c) to
ad40: 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63  .** return the c
ad50: 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 57 69  urrent row of Wi
ad60: 6e 64 6f 77 2e 69 45 70 68 43 73 72 2e 20 49 66  ndow.iEphCsr. If
ad70: 20 61 6c 6c 20 77 69 6e 64 6f 77 20 66 75 6e 63   all window func
ad80: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 61 67 67  tions are.** agg
ad90: 72 65 67 61 74 65 20 77 69 6e 64 6f 77 20 66 75  regate window fu
ada0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65  nctions that use
adb0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 41 50   the standard AP
adc0: 49 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 4f  I, a single.** O
add0: 50 5f 47 6f 73 75 62 20 69 6e 73 74 72 75 63 74  P_Gosub instruct
ade0: 69 6f 6e 20 69 73 20 61 6c 6c 20 74 68 61 74 20  ion is all that 
adf0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  this routine gen
ae00: 65 72 61 74 65 73 2e 20 45 78 74 72 61 20 56 4d  erates. Extra VM
ae10: 20 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 70 65 72   code.** for per
ae20: 2d 72 6f 77 20 70 72 6f 63 65 73 73 69 6e 67 20  -row processing 
ae30: 69 73 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74 65  is only generate
ae40: 64 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  d for the follow
ae50: 69 6e 67 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  ing built-in win
ae60: 64 6f 77 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  dow.** functions
ae70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e 74 68 5f 76 61  :.**.**   nth_va
ae80: 6c 75 65 28 29 0a 2a 2a 20 20 20 66 69 72 73 74  lue().**   first
ae90: 5f 76 61 6c 75 65 28 29 0a 2a 2a 20 20 20 6c 61  _value().**   la
aea0: 67 28 29 0a 2a 2a 20 20 20 6c 65 61 64 28 29 0a  g().**   lead().
aeb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
aec0: 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
aed0: 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  w(.  Parse *pPar
aee0: 73 65 2c 0a 20 20 57 69 6e 64 6f 77 20 2a 70 4d  se,.  Window *pM
aef0: 57 69 6e 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f  Win,.  int regGo
af00: 73 75 62 2c 0a 20 20 69 6e 74 20 61 64 64 72 47  sub,.  int addrG
af10: 6f 73 75 62 0a 29 7b 0a 20 20 56 64 62 65 20 2a  osub.){.  Vdbe *
af20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
af30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 57 69  be(pParse);.  Wi
af40: 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66 6f  ndow *pWin;.  fo
af50: 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70 57  r(pWin=pMWin; pW
af60: 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70  in; pWin=pWin->p
af70: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46 75  NextWin){.    Fu
af80: 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20 70  ncDef *pFunc = p
af90: 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  Win->pFunc;.    
afa0: 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  if( pFunc->zName
afb0: 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d 65 0a  ==nth_valueName.
afc0: 20 20 20 20 20 7c 7c 20 70 46 75 6e 63 2d 3e 7a       || pFunc->z
afd0: 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76 61 6c 75  Name==first_valu
afe0: 65 4e 61 6d 65 0a 20 20 20 20 29 7b 0a 20 20 20  eName.    ){.   
aff0: 20 20 20 69 6e 74 20 63 73 72 20 3d 20 70 57 69     int csr = pWi
b000: 6e 2d 3e 63 73 72 41 70 70 3b 0a 20 20 20 20 20  n->csrApp;.     
b010: 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74   int lbl = sqlit
b020: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
b030: 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6d  v);.      int tm
b040: 70 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65  pReg = sqlite3Ge
b050: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b070: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b080: 4e 75 6c 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72  Null, 0, pWin->r
b090: 65 67 52 65 73 75 6c 74 29 3b 0a 0a 20 20 20 20  egResult);..    
b0a0: 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e 61    if( pFunc->zNa
b0b0: 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61 6d  me==nth_valueNam
b0c0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
b0d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b0e0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 4d 57  , OP_Column, pMW
b0f0: 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 57 69  in->iEphCsr, pWi
b100: 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 74 6d 70  n->iArgCol+1,tmp
b110: 52 65 67 29 3b 0a 20 20 20 20 20 20 20 20 77 69  Reg);.        wi
b120: 6e 64 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75  ndowCheckIntValu
b130: 65 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67  e(pParse, tmpReg
b140: 2c 20 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 2);.      }els
b150: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b160: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b170: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74  OP_Integer, 1, t
b180: 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a  mpReg);.      }.
b190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b1a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64  eAddOp3(v, OP_Ad
b1b0: 64 2c 20 74 6d 70 52 65 67 2c 20 70 57 69 6e 2d  d, tmpReg, pWin-
b1c0: 3e 72 65 67 41 70 70 2c 20 74 6d 70 52 65 67 29  >regApp, tmpReg)
b1d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b1e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b1f0: 47 74 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70  Gt, pWin->regApp
b200: 2b 31 2c 20 6c 62 6c 2c 20 74 6d 70 52 65 67 29  +1, lbl, tmpReg)
b210: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
b220: 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c 28 76 29  rageNeverNull(v)
b230: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b240: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b250: 53 65 65 6b 52 6f 77 69 64 2c 20 63 73 72 2c 20  SeekRowid, csr, 
b260: 30 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20  0, tmpReg);.    
b270: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65    VdbeCoverageNe
b280: 76 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20  verTaken(v);.   
b290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b2b0: 6e 2c 20 63 73 72 2c 20 70 57 69 6e 2d 3e 69 41  n, csr, pWin->iA
b2c0: 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67  rgCol, pWin->reg
b2d0: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73  Result);.      s
b2e0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
b2f0: 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a  eLabel(v, lbl);.
b300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
b310: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
b320: 73 65 2c 20 74 6d 70 52 65 67 29 3b 0a 20 20 20  se, tmpReg);.   
b330: 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20   }.    else if( 
b340: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  pFunc->zName==le
b350: 61 64 4e 61 6d 65 20 7c 7c 20 70 46 75 6e 63 2d  adName || pFunc-
b360: 3e 7a 4e 61 6d 65 3d 3d 6c 61 67 4e 61 6d 65 20  >zName==lagName 
b370: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 72  ){.      int nAr
b380: 67 20 3d 20 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  g = pWin->pOwner
b390: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
b3a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 70 68  ;.      int iEph
b3b0: 20 3d 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73   = pMWin->iEphCs
b3c0: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 73 72  r;.      int csr
b3d0: 20 3d 20 70 57 69 6e 2d 3e 63 73 72 41 70 70 3b   = pWin->csrApp;
b3e0: 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d  .      int lbl =
b3f0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
b400: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
b410: 69 6e 74 20 74 6d 70 52 65 67 20 3d 20 73 71 6c  int tmpReg = sql
b420: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
b430: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 69  Parse);..      i
b440: 66 28 20 6e 41 72 67 3c 33 20 29 7b 0a 20 20 20  f( nArg<3 ){.   
b450: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b460: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
b470: 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 52  l, 0, pWin->regR
b480: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65  esult);.      }e
b490: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
b4a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b4b0: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70  , OP_Column, iEp
b4c0: 68 2c 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c  h, pWin->iArgCol
b4d0: 2b 32 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  +2, pWin->regRes
b4e0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ult);.      }.  
b4f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b500: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
b510: 64 2c 20 69 45 70 68 2c 20 74 6d 70 52 65 67 29  d, iEph, tmpReg)
b520: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
b530: 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  <2 ){.        in
b540: 74 20 76 61 6c 20 3d 20 28 70 46 75 6e 63 2d 3e  t val = (pFunc->
b550: 7a 4e 61 6d 65 3d 3d 6c 65 61 64 4e 61 6d 65 20  zName==leadName 
b560: 3f 20 31 20 3a 20 2d 31 29 3b 0a 20 20 20 20 20  ? 1 : -1);.     
b570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b580: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
b590: 6d 2c 20 74 6d 70 52 65 67 2c 20 76 61 6c 29 3b  m, tmpReg, val);
b5a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b5b0: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 28        int op = (
b5c0: 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  pFunc->zName==le
b5d0: 61 64 4e 61 6d 65 20 3f 20 4f 50 5f 41 64 64 20  adName ? OP_Add 
b5e0: 3a 20 4f 50 5f 53 75 62 74 72 61 63 74 29 3b 0a  : OP_Subtract);.
b5f0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6d 70 52          int tmpR
b600: 65 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  eg2 = sqlite3Get
b610: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
b620: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b630: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b640: 5f 43 6f 6c 75 6d 6e 2c 20 69 45 70 68 2c 20 70  _Column, iEph, p
b650: 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2b 31 2c 20  Win->iArgCol+1, 
b660: 74 6d 70 52 65 67 32 29 3b 0a 20 20 20 20 20 20  tmpReg2);.      
b670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b680: 4f 70 33 28 76 2c 20 6f 70 2c 20 74 6d 70 52 65  Op3(v, op, tmpRe
b690: 67 32 2c 20 74 6d 70 52 65 67 2c 20 74 6d 70 52  g2, tmpReg, tmpR
b6a0: 65 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eg);.        sql
b6b0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
b6c0: 65 67 28 70 50 61 72 73 65 2c 20 74 6d 70 52 65  eg(pParse, tmpRe
b6d0: 67 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  g2);.      }..  
b6e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b6f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b  ddOp3(v, OP_Seek
b700: 52 6f 77 69 64 2c 20 63 73 72 2c 20 6c 62 6c 2c  Rowid, csr, lbl,
b710: 20 74 6d 70 52 65 67 29 3b 0a 20 20 20 20 20 20   tmpReg);.      
b720: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b740: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
b750: 6f 6c 75 6d 6e 2c 20 63 73 72 2c 20 70 57 69 6e  olumn, csr, pWin
b760: 2d 3e 69 41 72 67 43 6f 6c 2c 20 70 57 69 6e 2d  ->iArgCol, pWin-
b770: 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20  >regResult);.   
b780: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
b790: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
b7a0: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
b7b0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
b7c0: 70 50 61 72 73 65 2c 20 74 6d 70 52 65 67 29 3b  pParse, tmpReg);
b7d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
b7e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b7f0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 47  , OP_Gosub, regG
b800: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29  osub, addrGosub)
b810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
b820: 65 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  e the code gener
b830: 61 74 65 64 20 62 79 20 77 69 6e 64 6f 77 52 65  ated by windowRe
b840: 74 75 72 6e 4f 6e 65 52 6f 77 28 29 20 61 6e 64  turnOneRow() and
b850: 2c 20 6f 70 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  , optionally, th
b860: 65 0a 2a 2a 20 78 49 6e 76 65 72 73 65 28 29 20  e.** xInverse() 
b870: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63  function for eac
b880: 68 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  h window functio
b890: 6e 2c 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f  n, for one or mo
b8a0: 72 65 20 72 6f 77 73 0a 2a 2a 20 66 72 6f 6d 20  re rows.** from 
b8b0: 74 68 65 20 57 69 6e 64 6f 77 2e 69 45 70 68 43  the Window.iEphC
b8c0: 73 72 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 54  sr temp table. T
b8d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
b8e0: 72 61 74 65 73 20 56 4d 20 63 6f 64 65 0a 2a 2a  rates VM code.**
b8f0: 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   similar to:.**.
b900: 2a 2a 20 20 20 77 68 69 6c 65 28 20 72 65 67 43  **   while( regC
b910: 74 72 3e 30 20 29 7b 0a 2a 2a 20 20 20 20 20 72  tr>0 ){.**     r
b920: 65 67 43 74 72 2d 2d 3b 0a 2a 2a 20 20 20 20 20  egCtr--;.**     
b930: 77 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52  windowReturnOneR
b940: 6f 77 28 29 0a 2a 2a 20 20 20 20 20 69 66 28 20  ow().**     if( 
b950: 62 49 6e 76 65 72 73 65 20 29 7b 0a 2a 2a 20 20  bInverse ){.**  
b960: 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65 0a       AggInverse.
b970: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20  **     }.**     
b980: 4e 65 78 74 20 28 57 69 6e 64 6f 77 2e 69 45 70  Next (Window.iEp
b990: 68 43 73 72 29 0a 2a 2a 20 20 20 7d 0a 2a 2f 0a  hCsr).**   }.*/.
b9a0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 64  static void wind
b9b0: 6f 77 52 65 74 75 72 6e 52 6f 77 73 28 0a 20 20  owReturnRows(.  
b9c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
b9d0: 20 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 2c 20   Window *pMWin, 
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 77 69 6e 64   /* List of wind
ba00: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  ow functions */.
ba10: 20 20 69 6e 74 20 72 65 67 43 74 72 2c 20 20 20    int regCtr,   
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 63 6f    /* Register co
ba40: 6e 74 61 69 6e 69 6e 67 20 6e 75 6d 62 65 72 20  ntaining number 
ba50: 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
ba60: 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20 20 20   regGosub,      
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba80: 52 65 67 69 73 74 65 72 20 66 6f 72 20 47 6f 73  Register for Gos
ba90: 75 62 20 61 64 64 72 47 6f 73 75 62 20 2a 2f 0a  ub addrGosub */.
baa0: 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 2c    int addrGosub,
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
bad0: 73 75 62 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20  sub-routine for 
bae0: 52 65 74 75 72 6e 4f 6e 65 52 6f 77 20 2a 2f 0a  ReturnOneRow */.
baf0: 20 20 69 6e 74 20 72 65 67 49 6e 76 41 72 67 2c    int regInvArg,
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb10: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
bb20: 67 69 73 74 65 72 73 20 66 6f 72 20 78 49 6e 76  gisters for xInv
bb30: 65 72 73 65 20 61 72 67 73 20 2a 2f 0a 20 20 69  erse args */.  i
bb40: 6e 74 20 72 65 67 49 6e 76 53 69 7a 65 20 20 20  nt regInvSize   
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb60: 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6e 74 61  * Register conta
bb70: 69 6e 69 6e 67 20 73 69 7a 65 20 6f 66 20 70 61  ining size of pa
bb80: 72 74 69 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  rtition */.){.  
bb90: 69 6e 74 20 61 64 64 72 3b 0a 20 20 56 64 62 65  int addr;.  Vdbe
bba0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
bbb0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
bbc0: 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70  windowAggFinal(p
bbd0: 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 30 29  Parse, pMWin, 0)
bbe0: 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74  ;.  addr = sqlit
bbf0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
bc00: 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67 43 74 72  OP_IfPos, regCtr
bc10: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
bc20: 72 65 6e 74 41 64 64 72 28 76 29 2b 32 20 2c 31  rentAddr(v)+2 ,1
bc30: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
bc40: 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
bc50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
bc60: 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20 77  Goto, 0, 0);.  w
bc70: 69 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f  indowReturnOneRo
bc80: 77 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c  w(pParse, pMWin,
bc90: 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47   regGosub, addrG
bca0: 6f 73 75 62 29 3b 0a 20 20 69 66 28 20 72 65 67  osub);.  if( reg
bcb0: 49 6e 76 41 72 67 20 29 7b 0a 20 20 20 20 77 69  InvArg ){.    wi
bcc0: 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72  ndowAggStep(pPar
bcd0: 73 65 2c 20 70 4d 57 69 6e 2c 20 70 4d 57 69 6e  se, pMWin, pMWin
bce0: 2d 3e 69 45 70 68 43 73 72 2c 20 31 2c 20 72 65  ->iEphCsr, 1, re
bcf0: 67 49 6e 76 41 72 67 2c 20 72 65 67 49 6e 76 53  gInvArg, regInvS
bd00: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ize);.  }.  sqli
bd10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bd20: 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69 6e 2d   OP_Next, pMWin-
bd30: 3e 69 45 70 68 43 73 72 2c 20 61 64 64 72 29 3b  >iEphCsr, addr);
bd40: 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  .  VdbeCoverage(
bd50: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
bd60: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
bd70: 72 2b 31 29 3b 20 20 20 2f 2a 20 54 68 65 20 4f  r+1);   /* The O
bd80: 50 5f 47 6f 74 6f 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  P_Goto */.}../*.
bd90: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
bda0: 20 74 6f 20 73 65 74 20 74 68 65 20 61 63 63 75   to set the accu
bdb0: 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
bdc0: 20 66 6f 72 20 65 61 63 68 20 77 69 6e 64 6f 77   for each window
bdd0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
bde0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
bdf0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
be00: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
be10: 20 4e 55 4c 4c 2e 20 41 6e 64 20 70 65 72 66 6f   NULL. And perfo
be20: 72 6d 0a 2a 2a 20 61 6e 79 20 65 71 75 69 76 61  rm.** any equiva
be30: 6c 65 6e 74 20 69 6e 69 74 69 61 6c 69 7a 61 74  lent initializat
be40: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
be50: 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 77 69 6e  any built-in win
be60: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  dow functions.**
be70: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
be80: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 64  .static int wind
be90: 6f 77 49 6e 69 74 41 63 63 75 6d 28 50 61 72 73  owInitAccum(Pars
bea0: 65 20 2a 70 50 61 72 73 65 2c 20 57 69 6e 64 6f  e *pParse, Windo
beb0: 77 20 2a 70 4d 57 69 6e 29 7b 0a 20 20 56 64 62  w *pMWin){.  Vdb
bec0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
bed0: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
bee0: 20 69 6e 74 20 72 65 67 41 72 67 3b 0a 20 20 69   int regArg;.  i
bef0: 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 57  nt nArg = 0;.  W
bf00: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 66  indow *pWin;.  f
bf10: 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e 3b 20 70  or(pWin=pMWin; p
bf20: 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69 6e 2d 3e  Win; pWin=pWin->
bf30: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 46  pNextWin){.    F
bf40: 75 6e 63 44 65 66 20 2a 70 46 75 6e 63 20 3d 20  uncDef *pFunc = 
bf50: 70 57 69 6e 2d 3e 70 46 75 6e 63 3b 0a 20 20 20  pWin->pFunc;.   
bf60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bf70: 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
bf80: 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d  , pWin->regAccum
bf90: 29 3b 0a 20 20 20 20 6e 41 72 67 20 3d 20 4d 41  );.    nArg = MA
bfa0: 58 28 6e 41 72 67 2c 20 77 69 6e 64 6f 77 41 72  X(nArg, windowAr
bfb0: 67 43 6f 75 6e 74 28 70 57 69 6e 29 29 3b 0a 20  gCount(pWin));. 
bfc0: 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 7a 4e     if( pFunc->zN
bfd0: 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75 65 4e 61  ame==nth_valueNa
bfe0: 6d 65 0a 20 20 20 20 20 7c 7c 20 70 46 75 6e 63  me.     || pFunc
bff0: 2d 3e 7a 4e 61 6d 65 3d 3d 66 69 72 73 74 5f 76  ->zName==first_v
c000: 61 6c 75 65 4e 61 6d 65 0a 20 20 20 20 29 7b 0a  alueName.    ){.
c010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c020: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
c030: 74 65 67 65 72 2c 20 30 2c 20 70 57 69 6e 2d 3e  teger, 0, pWin->
c040: 72 65 67 41 70 70 29 3b 0a 20 20 20 20 20 20 73  regApp);.      s
c050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c060: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
c070: 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41 70 70 2b  0, pWin->regApp+
c080: 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  1);.    }..    i
c090: 66 28 20 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46  f( (pFunc->funcF
c0a0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
c0b0: 4e 43 5f 4d 49 4e 4d 41 58 29 20 26 26 20 70 57  NC_MINMAX) && pW
c0c0: 69 6e 2d 3e 63 73 72 41 70 70 20 29 7b 0a 20 20  in->csrApp ){.  
c0d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
c0e0: 2d 3e 65 53 74 61 72 74 21 3d 54 4b 5f 55 4e 42  ->eStart!=TK_UNB
c0f0: 4f 55 4e 44 45 44 20 29 3b 0a 20 20 20 20 20 20  OUNDED );.      
c100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c110: 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72  1(v, OP_ResetSor
c120: 74 65 72 2c 20 70 57 69 6e 2d 3e 63 73 72 41 70  ter, pWin->csrAp
c130: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
c140: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c150: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 57  P_Integer, 0, pW
c160: 69 6e 2d 3e 72 65 67 41 70 70 2b 31 29 3b 0a 20  in->regApp+1);. 
c170: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 67 41 72     }.  }.  regAr
c180: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
c190: 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  +1;.  pParse->nM
c1a0: 65 6d 20 2b 3d 20 6e 41 72 67 3b 0a 20 20 72 65  em += nArg;.  re
c1b0: 74 75 72 6e 20 72 65 67 41 72 67 3b 0a 7d 0a 0a  turn regArg;.}..
c1c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c1d0: 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 77 6f  tion does the wo
c1e0: 72 6b 20 6f 66 20 73 71 6c 69 74 65 33 57 69 6e  rk of sqlite3Win
c1f0: 64 6f 77 43 6f 64 65 53 74 65 70 28 29 20 66 6f  dowCodeStep() fo
c200: 72 20 61 6c 6c 20 22 52 4f 57 53 22 0a 2a 2a 20  r all "ROWS".** 
c210: 77 69 6e 64 6f 77 20 66 72 61 6d 65 20 74 79 70  window frame typ
c220: 65 73 20 65 78 63 65 70 74 20 66 6f 72 20 22 42  es except for "B
c230: 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44  ETWEEN UNBOUNDED
c240: 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43   PRECEDING AND C
c250: 55 52 52 45 4e 54 0a 2a 2a 20 52 4f 57 22 2e 20  URRENT.** ROW". 
c260: 50 73 65 75 64 6f 2d 63 6f 64 65 20 66 6f 72 20  Pseudo-code for 
c270: 65 61 63 68 20 66 6f 6c 6c 6f 77 73 2e 0a 2a 2a  each follows..**
c280: 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45 4e  .** ROWS BETWEEN
c290: 20 3c 65 78 70 72 31 3e 20 50 52 45 43 45 44 49   <expr1> PRECEDI
c2a0: 4e 47 20 41 4e 44 20 3c 65 78 70 72 32 3e 20 46  NG AND <expr2> F
c2b0: 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20  OLLOWING.**.**  
c2c0: 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
c2d0: 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
c2e0: 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  n ){.**         
c2f0: 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74  Gosub flush_part
c300: 69 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 7d  ition.**       }
c310: 0a 2a 2a 20 20 20 20 20 20 20 49 6e 73 65 72 74  .**       Insert
c320: 20 28 72 65 63 6f 72 64 20 69 6e 20 65 70 68 2d   (record in eph-
c330: 74 61 62 6c 65 29 0a 2a 2a 20 20 20 20 20 73 71  table).**     sq
c340: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
c350: 2a 2a 20 20 20 20 20 47 6f 73 75 62 20 66 6c 75  **     Gosub flu
c360: 73 68 5f 70 61 72 74 69 74 69 6f 6e 0a 2a 2a 20  sh_partition.** 
c370: 20 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72   .**   flush_par
c380: 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f  tition:.**     O
c390: 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f  nce {.**       O
c3a0: 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20  penDup (iEphCsr 
c3b0: 2d 3e 20 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  -> csrStart).** 
c3c0: 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28 69        OpenDup (i
c3d0: 45 70 68 43 73 72 20 2d 3e 20 63 73 72 45 6e 64  EphCsr -> csrEnd
c3e0: 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20  ).**     }.**   
c3f0: 20 20 72 65 67 53 74 61 72 74 20 3d 20 3c 65 78    regStart = <ex
c400: 70 72 31 3e 20 20 20 20 20 20 20 20 20 20 20 20  pr1>            
c410: 20 20 20 20 2f 2f 20 50 52 45 43 45 44 49 4e 47      // PRECEDING
c420: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 20   expression.**  
c430: 20 20 20 72 65 67 45 6e 64 20 3d 20 3c 65 78 70     regEnd = <exp
c440: 72 32 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  r2>             
c450: 20 20 20 20 20 2f 2f 20 46 4f 4c 4c 4f 57 49 4e       // FOLLOWIN
c460: 47 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  G expression.** 
c470: 20 20 20 20 69 66 28 20 72 65 67 53 74 61 72 74      if( regStart
c480: 3c 30 20 7c 7c 20 72 65 67 45 6e 64 3c 30 20 29  <0 || regEnd<0 )
c490: 7b 20 65 72 72 6f 72 21 20 7d 0a 2a 2a 20 20 20  { error! }.**   
c4a0: 20 20 52 65 77 69 6e 64 20 28 63 73 72 2c 63 73    Rewind (csr,cs
c4b0: 72 53 74 61 72 74 2c 63 73 72 45 6e 64 29 20 20  rStart,csrEnd)  
c4c0: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
c4d0: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
c4e0: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  on_done.**      
c4f0: 20 4e 65 78 74 28 63 73 72 45 6e 64 29 20 20 20   Next(csrEnd)   
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 20 2f 2f 20 69 66 20 45 4f 46 20 73 6b 69 70 20   // if EOF skip 
c520: 41 67 67 73 74 65 70 0a 2a 2a 20 20 20 20 20 20  Aggstep.**      
c530: 20 41 67 67 73 74 65 70 20 28 63 73 72 45 6e 64   Aggstep (csrEnd
c540: 29 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 28  ).**       if( (
c550: 72 65 67 45 6e 64 2d 2d 29 3c 3d 30 20 29 7b 0a  regEnd--)<=0 ){.
c560: 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67 46 69  **         AggFi
c570: 6e 61 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20  nal (xValue).** 
c580: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64          Gosub ad
c590: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
c5a0: 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20     Next(csr)    
c5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 69              // i
c5c0: 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73 68  f EOF goto flush
c5d0: 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 0a  _partition_done.
c5e0: 2a 2a 20 20 20 20 20 20 20 20 20 69 66 28 20 28  **         if( (
c5f0: 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30 20 29  regStart--)<=0 )
c600: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  {.**           A
c610: 67 67 49 6e 76 65 72 73 65 20 28 63 73 72 53 74  ggInverse (csrSt
c620: 61 72 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  art).**         
c630: 20 20 4e 65 78 74 28 63 73 72 53 74 61 72 74 29    Next(csrStart)
c640: 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
c650: 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 66 6c         }.**   fl
c660: 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f  ush_partition_do
c670: 6e 65 3a 0a 2a 2a 20 20 20 20 20 52 65 73 65 74  ne:.**     Reset
c680: 53 6f 72 74 65 72 20 28 63 73 72 29 0a 2a 2a 20  Sorter (csr).** 
c690: 20 20 20 20 52 65 74 75 72 6e 0a 2a 2a 0a 2a 2a      Return.**.**
c6a0: 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 3c 65   ROWS BETWEEN <e
c6b0: 78 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 20  xpr> PRECEDING  
c6c0: 20 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f    AND CURRENT RO
c6d0: 57 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57 45 45  W.** ROWS BETWEE
c6e0: 4e 20 43 55 52 52 45 4e 54 20 52 4f 57 20 20 20  N CURRENT ROW   
c6f0: 20 20 20 20 20 20 41 4e 44 20 3c 65 78 70 72 3e        AND <expr>
c700: 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f   FOLLOWING.** RO
c710: 57 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  WS BETWEEN UNBOU
c720: 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
c730: 4e 44 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57  ND <expr> FOLLOW
c740: 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ING.**.**   Thes
c750: 65 20 61 72 65 20 73 69 6d 69 6c 61 72 20 74 6f  e are similar to
c760: 20 74 68 65 20 61 62 6f 76 65 2e 20 46 6f 72 20   the above. For 
c770: 22 43 55 52 52 45 4e 54 20 52 4f 57 22 2c 20 69  "CURRENT ROW", i
c780: 6e 74 69 61 6c 69 7a 65 20 74 68 65 0a 2a 2a 20  ntialize the.** 
c790: 20 20 72 65 67 69 73 74 65 72 20 74 6f 20 30 2e    register to 0.
c7a0: 20 46 6f 72 20 22 55 4e 42 4f 55 4e 44 45 44 20   For "UNBOUNDED 
c7b0: 50 52 45 43 45 44 49 4e 47 22 20 74 6f 20 69 6e  PRECEDING" to in
c7c0: 66 69 6e 69 74 79 2e 0a 2a 2a 0a 2a 2a 20 52 4f  finity..**.** RO
c7d0: 57 53 20 42 45 54 57 45 45 4e 20 3c 65 78 70 72  WS BETWEEN <expr
c7e0: 3e 20 50 52 45 43 45 44 49 4e 47 20 20 20 20 41  > PRECEDING    A
c7f0: 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
c800: 4c 4f 57 49 4e 47 0a 2a 2a 20 52 4f 57 53 20 42  LOWING.** ROWS B
c810: 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52  ETWEEN CURRENT R
c820: 4f 57 20 20 20 20 20 20 20 20 20 41 4e 44 20 55  OW         AND U
c830: 4e 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49  NBOUNDED FOLLOWI
c840: 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 77  NG.**.**     Rew
c850: 69 6e 64 20 28 63 73 72 2c 63 73 72 53 74 61 72  ind (csr,csrStar
c860: 74 2c 63 73 72 45 6e 64 29 20 20 20 20 2f 2f 20  t,csrEnd)    // 
c870: 69 66 20 45 4f 46 20 67 6f 74 6f 20 66 6c 75 73  if EOF goto flus
c880: 68 5f 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65  h_partition_done
c890: 0a 2a 2a 20 20 20 20 20 77 68 69 6c 65 28 20 31  .**     while( 1
c8a0: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 4e 65 78   ){.**       Nex
c8b0: 74 28 63 73 72 45 6e 64 29 20 20 20 20 20 20 20  t(csrEnd)       
c8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 45 78             // Ex
c8d0: 69 74 20 77 68 69 6c 65 28 31 29 20 61 74 20 45  it while(1) at E
c8e0: 4f 46 0a 2a 2a 20 20 20 20 20 20 20 41 67 67 73  OF.**       Aggs
c8f0: 74 65 70 20 28 63 73 72 45 6e 64 29 0a 2a 2a 20  tep (csrEnd).** 
c900: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 77 68 69      }.**     whi
c910: 6c 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20  le( 1 ){.**     
c920: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
c930: 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73  ue).**       Gos
c940: 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20  ub addrGosub.** 
c950: 20 20 20 20 20 20 4e 65 78 74 28 63 73 72 29 20        Next(csr) 
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f      // if EOF go
c980: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
c990: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20  on_done.**      
c9a0: 20 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d   if( (regStart--
c9b0: 29 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20  )<=0 ){.**      
c9c0: 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28 63     AggInverse (c
c9d0: 73 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20  srStart).**     
c9e0: 20 20 20 20 4e 65 78 74 28 63 73 72 53 74 61 72      Next(csrStar
c9f0: 74 29 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a 2a  t).**       }.**
ca00: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 46       }.**.**   F
ca10: 6f 72 20 74 68 65 20 22 43 55 52 52 45 4e 54 20  or the "CURRENT 
ca20: 52 4f 57 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45  ROW AND UNBOUNDE
ca30: 44 20 46 4f 4c 4c 4f 57 49 4e 47 22 20 63 61 73  D FOLLOWING" cas
ca40: 65 2c 20 74 68 65 20 66 69 6e 61 6c 20 69 66 28  e, the final if(
ca50: 29 20 0a 2a 2a 20 20 20 63 6f 6e 64 69 74 69 6f  ) .**   conditio
ca60: 6e 20 69 73 20 61 6c 77 61 79 73 20 74 72 75 65  n is always true
ca70: 20 28 61 73 20 69 66 20 72 65 67 53 74 61 72 74   (as if regStart
ca80: 20 77 65 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   were initialize
ca90: 64 20 74 6f 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 52  d to 0)..**.** R
caa0: 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52  ANGE BETWEEN CUR
cab0: 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e 42  RENT ROW AND UNB
cac0: 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47  OUNDED FOLLOWING
cad0: 0a 2a 2a 20 0a 2a 2a 20 20 20 54 68 69 73 20 69  .** .**   This i
cae0: 73 20 74 68 65 20 6f 6e 6c 79 20 52 41 4e 47 45  s the only RANGE
caf0: 20 63 61 73 65 20 68 61 6e 64 6c 65 64 20 62 79   case handled by
cb00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 49   this routine. I
cb10: 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65 0a 2a  t modifies the.*
cb20: 2a 20 20 20 73 65 63 6f 6e 64 20 77 68 69 6c 65  *   second while
cb30: 28 20 31 20 29 20 6c 6f 6f 70 20 69 6e 20 22 52  ( 1 ) loop in "R
cb40: 4f 57 53 20 42 45 54 57 45 45 4e 20 43 55 52 52  OWS BETWEEN CURR
cb50: 45 4e 54 20 2e 2e 2e 20 55 4e 42 4f 55 4e 44 45  ENT ... UNBOUNDE
cb60: 44 2e 2e 2e 22 20 74 6f 0a 2a 2a 20 20 20 62 65  D..." to.**   be
cb70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 77 68 69 6c  :.**.**     whil
cb80: 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
cb90: 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c 75   AggFinal (xValu
cba0: 65 29 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c  e).**       whil
cbb0: 65 28 20 31 20 29 7b 0a 2a 2a 20 20 20 20 20 20  e( 1 ){.**      
cbc0: 20 20 20 72 65 67 50 65 65 72 2b 2b 0a 2a 2a 20     regPeer++.** 
cbd0: 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61 64          Gosub ad
cbe0: 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20  drGosub.**      
cbf0: 20 20 20 4e 65 78 74 28 63 73 72 29 20 20 20 20     Next(csr)    
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20   // if EOF goto 
cc20: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
cc30: 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  done.**         
cc40: 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 20 62  if( new peer ) b
cc50: 72 65 61 6b 3b 0a 2a 2a 20 20 20 20 20 20 20 7d  reak;.**       }
cc60: 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 6c 65 28  .**       while(
cc70: 20 28 72 65 67 50 65 65 72 2d 2d 29 3e 30 20 29   (regPeer--)>0 )
cc80: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 41 67 67  {.**         Agg
cc90: 49 6e 76 65 72 73 65 20 28 63 73 72 53 74 61 72  Inverse (csrStar
cca0: 74 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 4e 65  t).**         Ne
ccb0: 78 74 28 63 73 72 53 74 61 72 74 29 0a 2a 2a 20  xt(csrStart).** 
ccc0: 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 7d        }.**     }
ccd0: 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  .**.** ROWS BETW
cce0: 45 45 4e 20 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f  EEN <expr> FOLLO
ccf0: 57 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70  WING    AND <exp
cd00: 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a 2a 0a  r> FOLLOWING.**.
cd10: 2a 2a 20 20 20 72 65 67 45 6e 64 20 3d 20 72 65  **   regEnd = re
cd20: 67 45 6e 64 20 2d 20 72 65 67 53 74 61 72 74 0a  gEnd - regStart.
cd30: 2a 2a 20 20 20 52 65 77 69 6e 64 20 28 63 73 72  **   Rewind (csr
cd40: 2c 63 73 72 53 74 61 72 74 2c 63 73 72 45 6e 64  ,csrStart,csrEnd
cd50: 29 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f  )   // if EOF go
cd60: 74 6f 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69  to flush_partiti
cd70: 6f 6e 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 41  on_done.**     A
cd80: 67 67 73 74 65 70 20 28 63 73 72 45 6e 64 29 0a  ggstep (csrEnd).
cd90: 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72 45  **     Next(csrE
cda0: 6e 64 29 20 20 20 20 20 20 20 20 20 20 20 20 20  nd)             
cdb0: 20 20 20 20 2f 2f 20 69 66 20 45 4f 46 20 66 61      // if EOF fa
cdc0: 6c 6c 2d 74 68 72 6f 75 67 68 0a 2a 2a 20 20 20  ll-through.**   
cdd0: 20 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29    if( (regEnd--)
cde0: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
cdf0: 69 66 28 20 28 72 65 67 53 74 61 72 74 2d 2d 29  if( (regStart--)
ce00: 3c 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  <=0 ){.**       
ce10: 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56 61 6c    AggFinal (xVal
ce20: 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 47  ue).**         G
ce30: 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a 2a  osub addrGosub.*
ce40: 2a 20 20 20 20 20 20 20 20 20 4e 65 78 74 28 63  *         Next(c
ce50: 73 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  sr)             
ce60: 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f 20   // if EOF goto 
ce70: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 5f  flush_partition_
ce80: 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 7d 0a  done.**       }.
ce90: 2a 2a 20 20 20 20 20 20 20 41 67 67 49 6e 76 65  **       AggInve
cea0: 72 73 65 20 28 63 73 72 53 74 61 72 74 29 0a 2a  rse (csrStart).*
ceb0: 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28 63 73  *       Next (cs
cec0: 72 53 74 61 72 74 29 0a 2a 2a 20 20 20 20 20 7d  rStart).**     }
ced0: 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45 54 57  .**.** ROWS BETW
cee0: 45 45 4e 20 3c 65 78 70 72 3e 20 50 52 45 43 45  EEN <expr> PRECE
cef0: 44 49 4e 47 20 20 20 20 41 4e 44 20 3c 65 78 70  DING    AND <exp
cf00: 72 3e 20 50 52 45 43 45 44 49 4e 47 0a 2a 2a 0a  r> PRECEDING.**.
cf10: 2a 2a 20 20 20 52 65 70 6c 61 63 65 20 74 68 65  **   Replace the
cf20: 20 62 69 74 20 61 66 74 65 72 20 22 52 65 77 69   bit after "Rewi
cf30: 6e 64 22 20 69 6e 20 74 68 65 20 61 62 6f 76 65  nd" in the above
cf40: 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   with:.**.**    
cf50: 20 69 66 28 20 28 72 65 67 45 6e 64 2d 2d 29 3c   if( (regEnd--)<
cf60: 3d 30 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  =0 ){.**       A
cf70: 67 67 53 74 65 70 20 28 63 73 72 45 6e 64 29 0a  ggStep (csrEnd).
cf80: 2a 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28 63  **       Next (c
cf90: 73 72 45 6e 64 29 0a 2a 2a 20 20 20 20 20 7d 0a  srEnd).**     }.
cfa0: 2a 2a 20 20 20 20 20 41 67 67 46 69 6e 61 6c 20  **     AggFinal 
cfb0: 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20  (xValue).**     
cfc0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
cfd0: 2a 2a 20 20 20 20 20 4e 65 78 74 28 63 73 72 29  **     Next(csr)
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 20 2f 2f 20 69 66 20 45 4f 46 20 67 6f 74 6f    // if EOF goto
d000: 20 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e   flush_partition
d010: 5f 64 6f 6e 65 0a 2a 2a 20 20 20 20 20 69 66 28  _done.**     if(
d020: 20 28 72 65 67 53 74 61 72 74 2d 2d 29 3c 3d 30   (regStart--)<=0
d030: 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67   ){.**       Agg
d040: 49 6e 76 65 72 73 65 20 28 63 73 72 32 29 0a 2a  Inverse (csr2).*
d050: 2a 20 20 20 20 20 20 20 4e 65 78 74 20 28 63 73  *       Next (cs
d060: 72 32 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a  r2).**     }.**.
d070: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
d080: 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72  indowCodeRowExpr
d090: 53 74 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70  Step(.  Parse *p
d0a0: 50 61 72 73 65 2c 20 0a 20 20 53 65 6c 65 63 74  Parse, .  Select
d0b0: 20 2a 70 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f   *p,.  WhereInfo
d0c0: 20 2a 70 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20   *pWInfo,.  int 
d0d0: 72 65 67 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74  regGosub, .  int
d0e0: 20 61 64 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20   addrGosub.){.  
d0f0: 57 69 6e 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20  Window *pMWin = 
d100: 70 2d 3e 70 57 69 6e 3b 0a 20 20 56 64 62 65 20  p->pWin;.  Vdbe 
d110: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
d120: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
d130: 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74 3b  nt regFlushPart;
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d150: 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 22  * Register for "
d160: 47 6f 73 75 62 20 66 6c 75 73 68 5f 70 61 72 74  Gosub flush_part
d170: 69 74 69 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20  ition" */.  int 
d180: 6c 62 6c 46 6c 75 73 68 50 61 72 74 3b 20 20 20  lblFlushPart;   
d190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d1a0: 61 62 65 6c 20 66 6f 72 20 22 47 6f 73 75 62 20  abel for "Gosub 
d1b0: 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 22  flush_partition"
d1c0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75   */.  int lblFlu
d1d0: 73 68 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20  shDone;         
d1e0: 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
d1f0: 6f 72 20 22 47 6f 73 75 62 20 66 6c 75 73 68 5f  or "Gosub flush_
d200: 70 61 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 22 20  partition_done" 
d210: 2a 2f 0a 0a 20 20 69 6e 74 20 72 65 67 41 72 67  */..  int regArg
d220: 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  ;.  int addr;.  
d230: 69 6e 74 20 63 73 72 53 74 61 72 74 20 3d 20 70  int csrStart = p
d240: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
d250: 20 69 6e 74 20 63 73 72 45 6e 64 20 3d 20 70 50   int csrEnd = pP
d260: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
d270: 69 6e 74 20 72 65 67 53 74 61 72 74 3b 20 20 20  int regStart;   
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 3c 65 78   /* Value of <ex
d2a0: 70 72 3e 20 50 52 45 43 45 44 49 4e 47 20 2a 2f  pr> PRECEDING */
d2b0: 0a 20 20 69 6e 74 20 72 65 67 45 6e 64 3b 20 20  .  int regEnd;  
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
d2e0: 3c 65 78 70 72 3e 20 46 4f 4c 4c 4f 57 49 4e 47  <expr> FOLLOWING
d2f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 47 6f   */.  int addrGo
d300: 74 6f 3b 0a 20 20 69 6e 74 20 61 64 64 72 54 6f  to;.  int addrTo
d310: 70 3b 0a 20 20 69 6e 74 20 61 64 64 72 49 66 50  p;.  int addrIfP
d320: 6f 73 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  os1 = 0;.  int a
d330: 64 64 72 49 66 50 6f 73 32 20 3d 20 30 3b 0a 20  ddrIfPos2 = 0;. 
d340: 20 69 6e 74 20 72 65 67 53 69 7a 65 20 3d 20 30   int regSize = 0
d350: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57  ;..  assert( pMW
d360: 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 50  in->eStart==TK_P
d370: 52 45 43 45 44 49 4e 47 20 0a 20 20 20 20 20 20  RECEDING .      
d380: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72   || pMWin->eStar
d390: 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20  t==TK_CURRENT . 
d3a0: 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
d3b0: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
d3c0: 57 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c 20  WING .       || 
d3d0: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
d3e0: 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20 20 29  K_UNBOUNDED .  )
d3f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 57 69  ;.  assert( pMWi
d400: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
d410: 4f 57 49 4e 47 20 0a 20 20 20 20 20 20 20 7c 7c  OWING .       ||
d420: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
d430: 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 20 20 20  _CURRENT .      
d440: 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   || pMWin->eEnd=
d450: 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 0a 20  =TK_UNBOUNDED . 
d460: 20 20 20 20 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e        || pMWin->
d470: 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49  eEnd==TK_PRECEDI
d480: 4e 47 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 41  NG .  );..  /* A
d490: 6c 6c 6f 63 61 74 65 20 72 65 67 69 73 74 65 72  llocate register
d4a0: 20 61 6e 64 20 6c 61 62 65 6c 20 66 6f 72 20 74   and label for t
d4b0: 68 65 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74  he "flush_partit
d4c0: 69 6f 6e 22 20 73 75 62 2d 72 6f 75 74 69 6e 65  ion" sub-routine
d4d0: 2e 20 2a 2f 0a 20 20 72 65 67 46 6c 75 73 68 50  . */.  regFlushP
d4e0: 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  art = ++pParse->
d4f0: 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46 6c 75 73 68  nMem;.  lblFlush
d500: 50 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Part = sqlite3Vd
d510: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
d520: 20 20 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 20 3d    lblFlushDone =
d530: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d540: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 72 65 67  Label(v);..  reg
d550: 53 74 61 72 74 20 3d 20 2b 2b 70 50 61 72 73 65  Start = ++pParse
d560: 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6e 64  ->nMem;.  regEnd
d570: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d580: 6d 3b 0a 0a 20 20 77 69 6e 64 6f 77 50 61 72 74  m;..  windowPart
d590: 69 74 69 6f 6e 43 61 63 68 65 28 70 50 61 72 73  itionCache(pPars
d5a0: 65 2c 20 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65  e, p, pWInfo, re
d5b0: 67 46 6c 75 73 68 50 61 72 74 2c 20 6c 62 6c 46  gFlushPart, lblF
d5c0: 6c 75 73 68 50 61 72 74 2c 20 26 72 65 67 53 69  lushPart, &regSi
d5d0: 7a 65 29 3b 0a 0a 20 20 61 64 64 72 47 6f 74 6f  ze);..  addrGoto
d5e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d5f0: 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
d600: 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ;..  /* Start of
d610: 20 22 66 6c 75 73 68 5f 70 61 72 74 69 74 69 6f   "flush_partitio
d620: 6e 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  n" */.  sqlite3V
d630: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
d640: 76 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72 74 29  v, lblFlushPart)
d650: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
d660: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 6e 63 65  ddOp2(v, OP_Once
d670: 2c 20 30 2c 20 73 71 6c 69 74 65 33 56 64 62 65  , 0, sqlite3Vdbe
d680: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33  CurrentAddr(v)+3
d690: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
d6a0: 65 28 76 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  e(v);.  VdbeComm
d6b0: 65 6e 74 28 28 76 2c 20 22 46 6c 75 73 68 5f 70  ent((v, "Flush_p
d6c0: 61 72 74 69 74 69 6f 6e 20 73 75 62 72 6f 75 74  artition subrout
d6d0: 69 6e 65 22 29 29 3b 0a 20 20 73 71 6c 69 74 65  ine"));.  sqlite
d6e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d6f0: 50 5f 4f 70 65 6e 44 75 70 2c 20 63 73 72 53 74  P_OpenDup, csrSt
d700: 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  art, pMWin->iEph
d710: 43 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Csr);.  sqlite3V
d720: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
d730: 4f 70 65 6e 44 75 70 2c 20 63 73 72 45 6e 64 2c  OpenDup, csrEnd,
d740: 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 29   pMWin->iEphCsr)
d750: 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 69 74 68 65  ;..  /* If eithe
d760: 72 20 72 65 67 53 74 61 72 74 20 6f 72 20 72 65  r regStart or re
d770: 67 45 6e 64 20 61 72 65 20 6e 6f 74 20 6e 6f 6e  gEnd are not non
d780: 2d 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65  -negative intege
d790: 72 73 2c 20 74 68 72 6f 77 20 0a 20 20 2a 2a 20  rs, throw .  ** 
d7a0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 2e 20 20 2a  an exception.  *
d7b0: 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70  /.  if( pMWin->p
d7c0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 73 71 6c  Start ){.    sql
d7d0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
d7e0: 72 73 65 2c 20 70 4d 57 69 6e 2d 3e 70 53 74 61  rse, pMWin->pSta
d7f0: 72 74 2c 20 72 65 67 53 74 61 72 74 29 3b 0a 20  rt, regStart);. 
d800: 20 20 20 77 69 6e 64 6f 77 43 68 65 63 6b 49 6e     windowCheckIn
d810: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 72  tValue(pParse, r
d820: 65 67 53 74 61 72 74 2c 20 30 29 3b 0a 20 20 7d  egStart, 0);.  }
d830: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 45  .  if( pMWin->pE
d840: 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nd ){.    sqlite
d850: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d860: 2c 20 70 4d 57 69 6e 2d 3e 70 45 6e 64 2c 20 72  , pMWin->pEnd, r
d870: 65 67 45 6e 64 29 3b 0a 20 20 20 20 77 69 6e 64  egEnd);.    wind
d880: 6f 77 43 68 65 63 6b 49 6e 74 56 61 6c 75 65 28  owCheckIntValue(
d890: 70 50 61 72 73 65 2c 20 72 65 67 45 6e 64 2c 20  pParse, regEnd, 
d8a0: 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  1);.  }..  /* If
d8b0: 20 74 68 69 73 20 69 73 20 22 52 4f 57 53 20 3c   this is "ROWS <
d8c0: 65 78 70 72 31 3e 20 46 4f 4c 4c 4f 57 49 4e 47  expr1> FOLLOWING
d8d0: 20 41 4e 44 20 52 4f 57 53 20 3c 65 78 70 72 32   AND ROWS <expr2
d8e0: 3e 20 46 4f 4c 4c 4f 57 49 4e 47 22 2c 20 64 6f  > FOLLOWING", do
d8f0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 69 66  :.  **.  **   if
d900: 28 20 72 65 67 45 6e 64 3c 72 65 67 53 74 61 72  ( regEnd<regStar
d910: 74 20 29 7b 0a 20 20 2a 2a 20 20 20 20 20 2f 2f  t ){.  **     //
d920: 20 54 68 65 20 66 72 61 6d 65 20 61 6c 77 61 79   The frame alway
d930: 73 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  s consists of 0 
d940: 72 6f 77 73 0a 20 20 2a 2a 20 20 20 20 20 72 65  rows.  **     re
d950: 67 53 74 61 72 74 20 3d 20 72 65 67 53 69 7a 65  gStart = regSize
d960: 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20 20 2a 2a 20  ;.  **   }.  ** 
d970: 20 20 72 65 67 45 6e 64 20 3d 20 72 65 67 45 6e    regEnd = regEn
d980: 64 20 2d 20 72 65 67 53 74 61 72 74 3b 0a 20 20  d - regStart;.  
d990: 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  */.  if( pMWin->
d9a0: 70 45 6e 64 20 26 26 20 70 4d 57 69 6e 2d 3e 65  pEnd && pMWin->e
d9b0: 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57  Start==TK_FOLLOW
d9c0: 49 4e 47 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ING ){.    asser
d9d0: 74 28 20 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74  t( pMWin->pStart
d9e0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
d9f0: 74 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  t( pMWin->eEnd==
da00: 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 3b 0a  TK_FOLLOWING );.
da10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
da20: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  ddOp3(v, OP_Ge, 
da30: 72 65 67 53 74 61 72 74 2c 20 73 71 6c 69 74 65  regStart, sqlite
da40: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
da50: 28 76 29 2b 32 2c 20 72 65 67 45 6e 64 29 3b 0a  (v)+2, regEnd);.
da60: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
da70: 4e 65 76 65 72 4e 75 6c 6c 28 76 29 3b 0a 20 20  NeverNull(v);.  
da80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
da90: 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
daa0: 72 65 67 53 69 7a 65 2c 20 72 65 67 53 74 61 72  regSize, regStar
dab0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
dac0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
dad0: 53 75 62 74 72 61 63 74 2c 20 72 65 67 53 74 61  Subtract, regSta
dae0: 72 74 2c 20 72 65 67 45 6e 64 2c 20 72 65 67 45  rt, regEnd, regE
daf0: 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nd);.  }..  if( 
db00: 70 4d 57 69 6e 2d 3e 70 53 74 61 72 74 20 26 26  pMWin->pStart &&
db10: 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b   pMWin->eEnd==TK
db20: 5f 50 52 45 43 45 44 49 4e 47 20 29 7b 0a 20 20  _PRECEDING ){.  
db30: 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
db40: 3e 70 45 6e 64 21 3d 30 20 29 3b 0a 20 20 20 20  >pEnd!=0 );.    
db50: 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d 3e 65  assert( pMWin->e
db60: 53 74 61 72 74 3d 3d 54 4b 5f 50 52 45 43 45 44  Start==TK_PRECED
db70: 49 4e 47 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ING );.    sqlit
db80: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
db90: 4f 50 5f 4c 65 2c 20 72 65 67 53 74 61 72 74 2c  OP_Le, regStart,
dba0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
dbb0: 65 6e 74 41 64 64 72 28 76 29 2b 33 2c 20 72 65  entAddr(v)+3, re
dbc0: 67 45 6e 64 29 3b 0a 20 20 20 20 56 64 62 65 43  gEnd);.    VdbeC
dbd0: 6f 76 65 72 61 67 65 4e 65 76 65 72 4e 75 6c 6c  overageNeverNull
dbe0: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
dbf0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
dc00: 5f 43 6f 70 79 2c 20 72 65 67 53 69 7a 65 2c 20  _Copy, regSize, 
dc10: 72 65 67 53 74 61 72 74 29 3b 0a 20 20 20 20 73  regStart);.    s
dc20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dc30: 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
dc40: 53 69 7a 65 2c 20 72 65 67 45 6e 64 29 3b 0a 20  Size, regEnd);. 
dc50: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
dc60: 69 7a 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ize the accumula
dc70: 74 6f 72 20 72 65 67 69 73 74 65 72 20 66 6f 72  tor register for
dc80: 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66 75 6e   each window fun
dc90: 63 74 69 6f 6e 20 74 6f 20 4e 55 4c 4c 20 2a 2f  ction to NULL */
dca0: 0a 20 20 72 65 67 41 72 67 20 3d 20 77 69 6e 64  .  regArg = wind
dcb0: 6f 77 49 6e 69 74 41 63 63 75 6d 28 70 50 61 72  owInitAccum(pPar
dcc0: 73 65 2c 20 70 4d 57 69 6e 29 3b 0a 0a 20 20 73  se, pMWin);..  s
dcd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dce0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
dcf0: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 6c  MWin->iEphCsr, l
dd00: 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20  blFlushDone);.  
dd10: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
dd20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
dd30: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
dd40: 64 2c 20 63 73 72 53 74 61 72 74 2c 20 6c 62 6c  d, csrStart, lbl
dd50: 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 56 64  FlushDone);.  Vd
dd60: 62 65 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54  beCoverageNeverT
dd70: 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71 6c 69 74  aken(v);.  sqlit
dd80: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
dd90: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
dda0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ddb0: 52 65 77 69 6e 64 2c 20 63 73 72 45 6e 64 2c 20  Rewind, csrEnd, 
ddc0: 6c 62 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20  lblFlushDone);. 
ddd0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 4e 65 76   VdbeCoverageNev
dde0: 65 72 54 61 6b 65 6e 28 76 29 3b 0a 20 20 73 71  erTaken(v);.  sq
ddf0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
de00: 35 28 76 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 49  5(v, 1);..  /* I
de10: 6e 76 6f 6b 65 20 41 67 67 53 74 65 70 20 66 75  nvoke AggStep fu
de20: 6e 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  nction for each 
de30: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
de40: 75 73 69 6e 67 20 74 68 65 20 72 6f 77 20 74 68  using the row th
de50: 61 74 0a 20 20 2a 2a 20 63 73 72 45 6e 64 20 63  at.  ** csrEnd c
de60: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
de70: 74 6f 2e 20 4f 72 2c 20 69 66 20 63 73 72 45 6e  to. Or, if csrEn
de80: 64 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  d is already at 
de90: 45 4f 46 2c 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74  EOF,.  ** do not
dea0: 68 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 64 64 72  hing.  */.  addr
deb0: 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
dec0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
ded0: 0a 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 45  .  if( pMWin->eE
dee0: 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47  nd==TK_PRECEDING
def0: 20 29 7b 0a 20 20 20 20 61 64 64 72 49 66 50 6f   ){.    addrIfPo
df00: 73 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  s1 = sqlite3Vdbe
df10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50  AddOp3(v, OP_IfP
df20: 6f 73 2c 20 72 65 67 45 6e 64 2c 20 30 20 2c 20  os, regEnd, 0 , 
df30: 31 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  1);.    VdbeCove
df40: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
df50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
df60: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72  (v, OP_Next, csr
df70: 45 6e 64 2c 20 73 71 6c 69 74 65 33 56 64 62 65  End, sqlite3Vdbe
df80: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32  CurrentAddr(v)+2
df90: 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67  );.  VdbeCoverag
dfa0: 65 28 76 29 3b 0a 20 20 61 64 64 72 20 3d 20 73  e(v);.  addr = s
dfb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
dfc0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
dfd0: 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70 50  windowAggStep(pP
dfe0: 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72  arse, pMWin, csr
dff0: 45 6e 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20  End, 0, regArg, 
e000: 72 65 67 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  regSize);.  if( 
e010: 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f  pMWin->eEnd==TK_
e020: 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20  UNBOUNDED ){.   
e030: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e040: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
e050: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
e060: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e070: 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
e080: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
e090: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e0a0: 64 72 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dr(v);.  }else{.
e0b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
e0c0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
e0d0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d  ;.    if( pMWin-
e0e0: 3e 65 45 6e 64 3d 3d 54 4b 5f 50 52 45 43 45 44  >eEnd==TK_PRECED
e0f0: 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ING ){.      sql
e100: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e110: 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29 3b  (v, addrIfPos1);
e120: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
e130: 28 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  ( pMWin->eEnd==T
e140: 4b 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20  K_FOLLOWING ){. 
e150: 20 20 20 61 64 64 72 49 66 50 6f 73 31 20 3d 20     addrIfPos1 = 
e160: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e170: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72  3(v, OP_IfPos, r
e180: 65 67 45 6e 64 2c 20 30 20 2c 20 31 29 3b 0a 20  egEnd, 0 , 1);. 
e190: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
e1a0: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d  v);.  }.  if( pM
e1b0: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
e1c0: 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20 20  FOLLOWING ){.   
e1d0: 20 61 64 64 72 49 66 50 6f 73 32 20 3d 20 73 71   addrIfPos2 = sq
e1e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
e1f0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 65 67  v, OP_IfPos, reg
e200: 53 74 61 72 74 2c 20 30 20 2c 20 31 29 3b 0a 20  Start, 0 , 1);. 
e210: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
e220: 76 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 64 6f 77  v);.  }.  window
e230: 41 67 67 46 69 6e 61 6c 28 70 50 61 72 73 65 2c  AggFinal(pParse,
e240: 20 70 4d 57 69 6e 2c 20 30 29 3b 0a 20 20 77 69   pMWin, 0);.  wi
e250: 6e 64 6f 77 52 65 74 75 72 6e 4f 6e 65 52 6f 77  ndowReturnOneRow
e260: 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20  (pParse, pMWin, 
e270: 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72 47 6f  regGosub, addrGo
e280: 73 75 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  sub);.  sqlite3V
e290: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e2a0: 4e 65 78 74 2c 20 70 4d 57 69 6e 2d 3e 69 45 70  Next, pMWin->iEp
e2b0: 68 43 73 72 2c 20 73 71 6c 69 74 65 33 56 64 62  hCsr, sqlite3Vdb
e2c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e2d0: 32 29 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61  2);.  VdbeCovera
e2e0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
e2f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e300: 5f 47 6f 74 6f 2c 20 30 2c 20 6c 62 6c 46 6c 75  _Goto, 0, lblFlu
e310: 73 68 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 70  shDone);.  if( p
e320: 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b  MWin->eStart==TK
e330: 5f 46 4f 4c 4c 4f 57 49 4e 47 20 29 7b 0a 20 20  _FOLLOWING ){.  
e340: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
e350: 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 66 50  pHere(v, addrIfP
e360: 6f 73 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  os2);.  }..  if(
e370: 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d   pMWin->eStart==
e380: 54 4b 5f 43 55 52 52 45 4e 54 20 0a 20 20 20 7c  TK_CURRENT .   |
e390: 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  | pMWin->eStart=
e3a0: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 0a 20  =TK_PRECEDING . 
e3b0: 20 20 7c 7c 20 70 4d 57 69 6e 2d 3e 65 53 74 61    || pMWin->eSta
e3c0: 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f 57 49 4e 47  rt==TK_FOLLOWING
e3d0: 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c   .  ){.    int l
e3e0: 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 20 3d 20  blSkipInverse = 
e3f0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
e400: 61 62 65 6c 28 76 29 3b 3b 0a 20 20 20 20 69 66  abel(v);;.    if
e410: 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  ( pMWin->eStart=
e420: 3d 54 4b 5f 50 52 45 43 45 44 49 4e 47 20 29 7b  =TK_PRECEDING ){
e430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e440: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
e450: 66 50 6f 73 2c 20 72 65 67 53 74 61 72 74 2c 20  fPos, regStart, 
e460: 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 2c 20  lblSkipInverse, 
e470: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
e480: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d  verage(v);.    }
e490: 0a 20 20 20 20 69 66 28 20 70 4d 57 69 6e 2d 3e  .    if( pMWin->
e4a0: 65 53 74 61 72 74 3d 3d 54 4b 5f 46 4f 4c 4c 4f  eStart==TK_FOLLO
e4b0: 57 49 4e 47 20 29 7b 0a 20 20 20 20 20 20 73 71  WING ){.      sq
e4c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
e4d0: 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 53  v, OP_Next, csrS
e4e0: 74 61 72 74 2c 20 73 71 6c 69 74 65 33 56 64 62  tart, sqlite3Vdb
e4f0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
e500: 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
e510: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
e520: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e530: 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
e540: 2c 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65  , lblSkipInverse
e550: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
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 4e 65 78 74  ddOp2(v, OP_Next
e580: 2c 20 63 73 72 53 74 61 72 74 2c 20 73 71 6c 69  , csrStart, sqli
e590: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
e5a0: 64 72 28 76 29 2b 31 29 3b 0a 20 20 20 20 20 20  dr(v)+1);.      
e5b0: 56 64 62 65 43 6f 76 65 72 61 67 65 41 6c 77 61  VdbeCoverageAlwa
e5c0: 79 73 54 61 6b 65 6e 28 76 29 3b 0a 20 20 20 20  ysTaken(v);.    
e5d0: 7d 0a 20 20 20 20 77 69 6e 64 6f 77 41 67 67 53  }.    windowAggS
e5e0: 74 65 70 28 70 50 61 72 73 65 2c 20 70 4d 57 69  tep(pParse, pMWi
e5f0: 6e 2c 20 63 73 72 53 74 61 72 74 2c 20 31 2c 20  n, csrStart, 1, 
e600: 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a 65 29  regArg, regSize)
e610: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
e620: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
e630: 20 6c 62 6c 53 6b 69 70 49 6e 76 65 72 73 65 29   lblSkipInverse)
e640: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4d 57 69  ;.  }.  if( pMWi
e650: 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 46 4f 4c 4c  n->eEnd==TK_FOLL
e660: 4f 57 49 4e 47 20 29 7b 0a 20 20 20 20 73 71 6c  OWING ){.    sql
e670: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e680: 28 76 2c 20 61 64 64 72 49 66 50 6f 73 31 29 3b  (v, addrIfPos1);
e690: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
e6a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
e6b0: 6f 74 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  oto, 0, addrTop)
e6c0: 3b 0a 0a 20 20 2f 2a 20 66 6c 75 73 68 5f 70 61  ;..  /* flush_pa
e6d0: 72 74 69 74 69 6f 6e 5f 64 6f 6e 65 3a 20 2a 2f  rtition_done: */
e6e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
e6f0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62  solveLabel(v, lb
e700: 6c 46 6c 75 73 68 44 6f 6e 65 29 3b 0a 20 20 73  lFlushDone);.  s
e710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
e720: 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f 72 74  (v, OP_ResetSort
e730: 65 72 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68 43  er, pMWin->iEphC
e740: 73 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  sr);.  sqlite3Vd
e750: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
e760: 65 74 75 72 6e 2c 20 72 65 67 46 6c 75 73 68 50  eturn, regFlushP
e770: 61 72 74 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d  art);.  VdbeComm
e780: 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 66 6c 75  ent((v, "end flu
e790: 73 68 5f 70 61 72 74 69 74 69 6f 6e 20 73 75 62  sh_partition sub
e7a0: 72 6f 75 74 69 6e 65 22 29 29 3b 0a 0a 20 20 2f  routine"));..  /
e7b0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74  * Jump to here t
e7c0: 6f 20 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73  o skip over flus
e7d0: 68 5f 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20  h_partition */. 
e7e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
e7f0: 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f  Here(v, addrGoto
e800: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e810: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74   function does t
e820: 68 65 20 77 6f 72 6b 20 6f 66 20 73 71 6c 69 74  he work of sqlit
e830: 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70  e3WindowCodeStep
e840: 28 29 20 66 6f 72 20 63 61 73 65 73 20 74 68 61  () for cases tha
e850: 74 0a 2a 2a 20 77 6f 75 6c 64 20 6e 6f 72 6d 61  t.** would norma
e860: 6c 6c 79 20 62 65 20 68 61 6e 64 6c 65 64 20 62  lly be handled b
e870: 79 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61  y windowCodeDefa
e880: 75 6c 74 53 74 65 70 28 29 20 77 68 65 6e 20 74  ultStep() when t
e890: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 6e 65 20  here are.** one 
e8a0: 6f 72 20 6d 6f 72 65 20 62 75 69 6c 74 2d 69 6e  or more built-in
e8b0: 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f 6e   window-function
e8c0: 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 74  s that require t
e8d0: 68 65 20 65 6e 74 69 72 65 20 70 61 72 74 69 74  he entire partit
e8e0: 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 63 61 63  ion.** to be cac
e8f0: 68 65 64 20 69 6e 20 61 20 74 65 6d 70 20 74 61  hed in a temp ta
e900: 62 6c 65 20 62 65 66 6f 72 65 20 61 6e 79 20 72  ble before any r
e910: 6f 77 73 20 63 61 6e 20 62 65 20 72 65 74 75 72  ows can be retur
e920: 6e 65 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ned. Additionall
e930: 79 2e 0a 2a 2a 20 22 52 41 4e 47 45 20 42 45 54  y..** "RANGE BET
e940: 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
e950: 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
e960: 4f 4c 4c 4f 57 49 4e 47 22 20 69 73 20 61 6c 77  OLLOWING" is alw
e970: 61 79 73 20 68 61 6e 64 6c 65 64 20 62 79 0a 2a  ays handled by.*
e980: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  * this function.
e990: 0a 2a 2a 0a 2a 2a 20 50 73 65 75 64 6f 2d 63 6f  .**.** Pseudo-co
e9a0: 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  de corresponding
e9b0: 20 74 6f 20 74 68 65 20 56 4d 20 63 6f 64 65 20   to the VM code 
e9c0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 69  generated by thi
e9d0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  s function.** fo
e9e0: 72 20 65 61 63 68 20 74 79 70 65 20 6f 66 20 77  r each type of w
e9f0: 69 6e 64 6f 77 20 66 6f 6c 6c 6f 77 73 2e 0a 2a  indow follows..*
ea00: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
ea10: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
ea20: 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45  CEDING AND CURRE
ea30: 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20 20 20 66  NT ROW.**.**   f
ea40: 6c 75 73 68 5f 70 61 72 74 69 74 69 6f 6e 3a 0a  lush_partition:.
ea50: 2a 2a 20 20 20 20 20 4f 6e 63 65 20 7b 0a 2a 2a  **     Once {.**
ea60: 20 20 20 20 20 20 20 4f 70 65 6e 44 75 70 20 28         OpenDup (
ea70: 69 45 70 68 43 73 72 20 2d 3e 20 63 73 72 4c 65  iEphCsr -> csrLe
ea80: 61 64 29 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20  ad).**     }.** 
ea90: 20 20 20 20 49 6e 74 65 67 65 72 20 63 74 72 20      Integer ctr 
eaa0: 30 0a 2a 2a 20 20 20 20 20 66 6f 72 65 61 63 68  0.**     foreach
eab0: 20 72 6f 77 20 28 63 73 72 4c 65 61 64 29 7b 0a   row (csrLead){.
eac0: 2a 2a 20 20 20 20 20 20 20 69 66 28 20 6e 65 77  **       if( new
ead0: 20 70 65 65 72 20 29 7b 0a 2a 2a 20 20 20 20 20   peer ){.**     
eae0: 20 20 20 20 41 67 67 46 69 6e 61 6c 20 28 78 56      AggFinal (xV
eaf0: 61 6c 75 65 29 0a 2a 2a 20 20 20 20 20 20 20 20  alue).**        
eb00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74 72 3b   for(i=0; i<ctr;
eb10: 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20 20 20   i++){.**       
eb20: 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
eb30: 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  sub.**          
eb40: 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a   Next iEphCsr.**
eb50: 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20           }.**   
eb60: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 74        Integer ct
eb70: 72 20 30 0a 2a 2a 20 20 20 20 20 20 20 7d 0a 2a  r 0.**       }.*
eb80: 2a 20 20 20 20 20 20 20 41 67 67 53 74 65 70 20  *       AggStep 
eb90: 28 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20 20 20  (csrLead).**    
eba0: 20 20 20 49 6e 63 72 20 63 74 72 0a 2a 2a 20 20     Incr ctr.**  
ebb0: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41     }.**.**     A
ebc0: 67 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69  ggFinal (xFinali
ebd0: 7a 65 29 0a 2a 2a 20 20 20 20 20 66 6f 72 28 69  ze).**     for(i
ebe0: 3d 30 3b 20 69 3c 63 74 72 3b 20 69 2b 2b 29 7b  =0; i<ctr; i++){
ebf0: 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75 62 20  .**       Gosub 
ec00: 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20  addrGosub.**    
ec10: 20 20 20 4e 65 78 74 20 69 45 70 68 43 73 72 0a     Next iEphCsr.
ec20: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20  **     }.**.**  
ec30: 20 20 20 52 65 73 65 74 53 6f 72 74 65 72 20 28     ResetSorter (
ec40: 63 73 72 29 0a 2a 2a 20 20 20 20 20 52 65 74 75  csr).**     Retu
ec50: 72 6e 0a 2a 2a 0a 2a 2a 20 52 4f 57 53 20 42 45  rn.**.** ROWS BE
ec60: 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20  TWEEN UNBOUNDED 
ec70: 50 52 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55  PRECEDING AND CU
ec80: 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a 20  RRENT ROW.**.** 
ec90: 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63 65    As above, exce
eca0: 70 74 20 74 68 61 74 20 74 68 65 20 22 69 66 28  pt that the "if(
ecb0: 20 6e 65 77 20 70 65 65 72 20 29 22 20 62 72 61   new peer )" bra
ecc0: 6e 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 61  nch is always ta
ecd0: 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 52 41 4e 47 45  ken..**.** RANGE
ece0: 20 42 45 54 57 45 45 4e 20 43 55 52 52 45 4e 54   BETWEEN CURRENT
ecf0: 20 52 4f 57 20 41 4e 44 20 43 55 52 52 45 4e 54   ROW AND CURRENT
ed00: 20 52 4f 57 20 0a 2a 2a 0a 2a 2a 20 20 20 41 73   ROW .**.**   As
ed10: 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
ed20: 68 61 74 20 65 61 63 68 20 6f 66 20 74 68 65 20  hat each of the 
ed30: 66 6f 72 28 29 20 6c 6f 6f 70 73 20 62 65 63 6f  for() loops beco
ed40: 6d 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  mes:.**.**      
ed50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 74     for(i=0; i<ct
ed60: 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20 20 20 20  r; i++){.**     
ed70: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
ed80: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 20  Gosub.**        
ed90: 20 20 20 41 67 67 49 6e 76 65 72 73 65 20 28 69     AggInverse (i
eda0: 45 70 68 43 73 72 29 0a 2a 2a 20 20 20 20 20 20  EphCsr).**      
edb0: 20 20 20 20 20 4e 65 78 74 20 69 45 70 68 43 73       Next iEphCs
edc0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  r.**         }.*
edd0: 2a 0a 2a 2a 20 52 41 4e 47 45 20 42 45 54 57 45  *.** RANGE BETWE
ede0: 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45  EN UNBOUNDED PRE
edf0: 43 45 44 49 4e 47 20 41 4e 44 20 55 4e 42 4f 55  CEDING AND UNBOU
ee00: 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 0a 2a  NDED FOLLOWING.*
ee10: 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f 70 61 72  *.**   flush_par
ee20: 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20 20 20 4f  tition:.**     O
ee30: 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 4f  nce {.**       O
ee40: 70 65 6e 44 75 70 20 28 69 45 70 68 43 73 72 20  penDup (iEphCsr 
ee50: 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a 2a 20 20  -> csrLead).**  
ee60: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66 6f 72 65     }.**     fore
ee70: 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65 61 64  ach row (csrLead
ee80: 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67 67  ) {.**       Agg
ee90: 53 74 65 70 20 28 63 73 72 4c 65 61 64 29 0a 2a  Step (csrLead).*
eea0: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66  *     }.**     f
eeb0: 6f 72 65 61 63 68 20 72 6f 77 20 28 69 45 70 68  oreach row (iEph
eec0: 43 73 72 29 20 7b 0a 2a 2a 20 20 20 20 20 20 20  Csr) {.**       
eed0: 47 6f 73 75 62 20 61 64 64 72 47 6f 73 75 62 0a  Gosub addrGosub.
eee0: 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 0a 2a 2a 20  **     }.** .** 
eef0: 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55  RANGE BETWEEN CU
ef00: 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 55 4e  RRENT ROW AND UN
ef10: 42 4f 55 4e 44 45 44 20 46 4f 4c 4c 4f 57 49 4e  BOUNDED FOLLOWIN
ef20: 47 0a 2a 2a 0a 2a 2a 20 20 20 66 6c 75 73 68 5f  G.**.**   flush_
ef30: 70 61 72 74 69 74 69 6f 6e 3a 0a 2a 2a 20 20 20  partition:.**   
ef40: 20 20 4f 6e 63 65 20 7b 0a 2a 2a 20 20 20 20 20    Once {.**     
ef50: 20 20 4f 70 65 6e 44 75 70 20 28 69 45 70 68 43    OpenDup (iEphC
ef60: 73 72 20 2d 3e 20 63 73 72 4c 65 61 64 29 0a 2a  sr -> csrLead).*
ef70: 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 66  *     }.**     f
ef80: 6f 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c  oreach row (csrL
ef90: 65 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41  ead){.**       A
efa0: 67 67 53 74 65 70 20 28 63 73 72 4c 65 61 64 29  ggStep (csrLead)
efb0: 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20  .**     }.**    
efc0: 20 52 65 77 69 6e 64 20 28 63 73 72 4c 65 61 64   Rewind (csrLead
efd0: 29 0a 2a 2a 20 20 20 20 20 49 6e 74 65 67 65 72  ).**     Integer
efe0: 20 63 74 72 20 30 0a 2a 2a 20 20 20 20 20 66 6f   ctr 0.**     fo
eff0: 72 65 61 63 68 20 72 6f 77 20 28 63 73 72 4c 65  reach row (csrLe
f000: 61 64 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  ad){.**       if
f010: 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a 2a 2a  ( new peer ){.**
f020: 20 20 20 20 20 20 20 20 20 41 67 67 46 69 6e 61           AggFina
f030: 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
f040: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f050: 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20 20  <ctr; i++){.**  
f060: 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 61           Gosub a
f070: 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20  ddrGosub.**     
f080: 20 20 20 20 20 20 41 67 67 49 6e 76 65 72 73 65        AggInverse
f090: 20 28 69 45 70 68 43 73 72 29 0a 2a 2a 20 20 20   (iEphCsr).**   
f0a0: 20 20 20 20 20 20 20 20 4e 65 78 74 20 69 45 70          Next iEp
f0b0: 68 43 73 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  hCsr.**         
f0c0: 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 6e 74  }.**         Int
f0d0: 65 67 65 72 20 63 74 72 20 30 0a 2a 2a 20 20 20  eger ctr 0.**   
f0e0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 49      }.**       I
f0f0: 6e 63 72 20 63 74 72 0a 2a 2a 20 20 20 20 20 7d  ncr ctr.**     }
f100: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 67 67 46 69  .**.**     AggFi
f110: 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65 29 0a  nal (xFinalize).
f120: 2a 2a 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  **     for(i=0; 
f130: 69 3c 63 74 72 3b 20 69 2b 2b 29 7b 0a 2a 2a 20  i<ctr; i++){.** 
f140: 20 20 20 20 20 20 47 6f 73 75 62 20 61 64 64 72        Gosub addr
f150: 47 6f 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 4e  Gosub.**       N
f160: 65 78 74 20 69 45 70 68 43 73 72 0a 2a 2a 20 20  ext iEphCsr.**  
f170: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52     }.**.**     R
f180: 65 73 65 74 53 6f 72 74 65 72 20 28 63 73 72 29  esetSorter (csr)
f190: 0a 2a 2a 20 20 20 20 20 52 65 74 75 72 6e 0a 2a  .**     Return.*
f1a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
f1b0: 6e 64 6f 77 43 6f 64 65 43 61 63 68 65 53 74 65  ndowCodeCacheSte
f1c0: 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
f1d0: 73 65 2c 20 0a 20 20 53 65 6c 65 63 74 20 2a 70  se, .  Select *p
f1e0: 2c 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  ,.  WhereInfo *p
f1f0: 57 49 6e 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67  WInfo,.  int reg
f200: 47 6f 73 75 62 2c 20 0a 20 20 69 6e 74 20 61 64  Gosub, .  int ad
f210: 64 72 47 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e  drGosub.){.  Win
f220: 64 6f 77 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e  dow *pMWin = p->
f230: 70 57 69 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20  pWin;.  Vdbe *v 
f240: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f250: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
f260: 6b 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  k;.  int addr;. 
f270: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74   ExprList *pPart
f280: 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74 69   = pMWin->pParti
f290: 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74  tion;.  ExprList
f2a0: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d 57   *pOrderBy = pMW
f2b0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  in->pOrderBy;.  
f2c0: 69 6e 74 20 6e 50 65 65 72 20 3d 20 70 4f 72 64  int nPeer = pOrd
f2d0: 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42 79 2d  erBy ? pOrderBy-
f2e0: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 69 6e  >nExpr : 0;.  in
f2f0: 74 20 72 65 67 4e 65 77 50 65 65 72 3b 0a 0a 20  t regNewPeer;.. 
f300: 20 69 6e 74 20 61 64 64 72 47 6f 74 6f 3b 20 20   int addrGoto;  
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 47   /* Address of G
f330: 6f 74 6f 20 75 73 65 64 20 74 6f 20 6a 75 6d 70  oto used to jump
f340: 20 66 6c 75 73 68 5f 70 61 72 2e 2e 20 2a 2f 0a   flush_par.. */.
f350: 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 3b 20    int addrNext; 
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
f380: 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  or next iteratio
f390: 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  n of loop */.  i
f3a0: 6e 74 20 72 65 67 46 6c 75 73 68 50 61 72 74 3b  nt regFlushPart;
f3b0: 0a 20 20 69 6e 74 20 6c 62 6c 46 6c 75 73 68 50  .  int lblFlushP
f3c0: 61 72 74 3b 0a 20 20 69 6e 74 20 63 73 72 4c 65  art;.  int csrLe
f3d0: 61 64 3b 0a 20 20 69 6e 74 20 72 65 67 43 74 72  ad;.  int regCtr
f3e0: 3b 0a 20 20 69 6e 74 20 72 65 67 41 72 67 3b 20  ;.  int regArg; 
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
f410: 61 72 72 61 79 20 74 6f 20 6d 61 72 74 69 61 6c  array to martial
f420: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 73 20 2a   function args *
f430: 2f 0a 20 20 69 6e 74 20 72 65 67 53 69 7a 65 3b  /.  int regSize;
f440: 0a 20 20 69 6e 74 20 6c 62 6c 45 6d 70 74 79 3b  .  int lblEmpty;
f450: 0a 20 20 69 6e 74 20 62 52 65 76 65 72 73 65 20  .  int bReverse 
f460: 3d 20 70 4d 57 69 6e 2d 3e 70 4f 72 64 65 72 42  = pMWin->pOrderB
f470: 79 20 26 26 20 70 4d 57 69 6e 2d 3e 65 53 74 61  y && pMWin->eSta
f480: 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 0a  rt==TK_CURRENT .
f490: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4d 57            && pMW
f4a0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
f4b0: 4f 55 4e 44 45 44 3b 0a 0a 20 20 61 73 73 65 72  OUNDED;..  asser
f4c0: 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72  t( (pMWin->eStar
f4d0: 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 20  t==TK_UNBOUNDED 
f4e0: 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  && pMWin->eEnd==
f4f0: 54 4b 5f 43 55 52 52 45 4e 54 29 20 0a 20 20 20  TK_CURRENT) .   
f500: 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
f510: 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
f520: 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
f530: 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
f540: 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  ) .       || (pM
f550: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
f560: 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
f570: 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
f580: 4e 54 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  NT) .       || (
f590: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
f5a0: 4b 5f 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57  K_CURRENT && pMW
f5b0: 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42  in->eEnd==TK_UNB
f5c0: 4f 55 4e 44 45 44 29 20 0a 20 20 29 3b 0a 0a 20  OUNDED) .  );.. 
f5d0: 20 6c 62 6c 45 6d 70 74 79 20 3d 20 73 71 6c 69   lblEmpty = sqli
f5e0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f5f0: 28 76 29 3b 0a 20 20 72 65 67 4e 65 77 50 65 65  (v);.  regNewPee
f600: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  r = pParse->nMem
f610: 2b 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d  +1;.  pParse->nM
f620: 65 6d 20 2b 3d 20 6e 50 65 65 72 3b 0a 0a 20 20  em += nPeer;..  
f630: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 72 65 67 69  /* Allocate regi
f640: 73 74 65 72 20 61 6e 64 20 6c 61 62 65 6c 20 66  ster and label f
f650: 6f 72 20 74 68 65 20 22 66 6c 75 73 68 5f 70 61  or the "flush_pa
f660: 72 74 69 74 69 6f 6e 22 20 73 75 62 2d 72 6f 75  rtition" sub-rou
f670: 74 69 6e 65 2e 20 2a 2f 0a 20 20 72 65 67 46 6c  tine. */.  regFl
f680: 75 73 68 50 61 72 74 20 3d 20 2b 2b 70 50 61 72  ushPart = ++pPar
f690: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6c 62 6c 46  se->nMem;.  lblF
f6a0: 6c 75 73 68 50 61 72 74 20 3d 20 73 71 6c 69 74  lushPart = sqlit
f6b0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
f6c0: 76 29 3b 0a 0a 20 20 63 73 72 4c 65 61 64 20 3d  v);..  csrLead =
f6d0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f6e0: 0a 20 20 72 65 67 43 74 72 20 3d 20 2b 2b 70 50  .  regCtr = ++pP
f6f0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 77  arse->nMem;..  w
f700: 69 6e 64 6f 77 50 61 72 74 69 74 69 6f 6e 43 61  indowPartitionCa
f710: 63 68 65 28 70 50 61 72 73 65 2c 20 70 2c 20 70  che(pParse, p, p
f720: 57 49 6e 66 6f 2c 20 72 65 67 46 6c 75 73 68 50  WInfo, regFlushP
f730: 61 72 74 2c 20 6c 62 6c 46 6c 75 73 68 50 61 72  art, lblFlushPar
f740: 74 2c 20 26 72 65 67 53 69 7a 65 29 3b 0a 20 20  t, &regSize);.  
f750: 61 64 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74  addrGoto = sqlit
f760: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
f770: 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 20 20 2f 2a 20  OP_Goto);..  /* 
f780: 53 74 61 72 74 20 6f 66 20 22 66 6c 75 73 68 5f  Start of "flush_
f790: 70 61 72 74 69 74 69 6f 6e 22 20 2a 2f 0a 20 20  partition" */.  
f7a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f7b0: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 46 6c  veLabel(v, lblFl
f7c0: 75 73 68 50 61 72 74 29 3b 0a 20 20 73 71 6c 69  ushPart);.  sqli
f7d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f7e0: 20 4f 50 5f 4f 6e 63 65 2c 20 30 2c 20 73 71 6c   OP_Once, 0, sql
f7f0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
f800: 64 64 72 28 76 29 2b 32 29 3b 0a 20 20 56 64 62  ddr(v)+2);.  Vdb
f810: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
f820: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
f830: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
f840: 20 63 73 72 4c 65 61 64 2c 20 70 4d 57 69 6e 2d   csrLead, pMWin-
f850: 3e 69 45 70 68 43 73 72 29 3b 0a 0a 20 20 2f 2a  >iEphCsr);..  /*
f860: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
f870: 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
f880: 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77 69  ster for each wi
f890: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ndow function to
f8a0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 72 65 67 41 72   NULL */.  regAr
f8b0: 67 20 3d 20 77 69 6e 64 6f 77 49 6e 69 74 41 63  g = windowInitAc
f8c0: 63 75 6d 28 70 50 61 72 73 65 2c 20 70 4d 57 69  cum(pParse, pMWi
f8d0: 6e 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  n);..  sqlite3Vd
f8e0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
f8f0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 43 74  nteger, 0, regCt
f900: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r);.  sqlite3Vdb
f910: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f920: 77 69 6e 64 2c 20 63 73 72 4c 65 61 64 2c 20 6c  wind, csrLead, l
f930: 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64 62 65  blEmpty);.  Vdbe
f940: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
f950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
f960: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70  (v, OP_Rewind, p
f970: 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 6c  MWin->iEphCsr, l
f980: 62 6c 45 6d 70 74 79 29 3b 0a 20 20 56 64 62 65  blEmpty);.  Vdbe
f990: 43 6f 76 65 72 61 67 65 4e 65 76 65 72 54 61 6b  CoverageNeverTak
f9a0: 65 6e 28 76 29 3b 0a 0a 20 20 69 66 28 20 62 52  en(v);..  if( bR
f9b0: 65 76 65 72 73 65 20 29 7b 0a 20 20 20 20 69 6e  everse ){.    in
f9c0: 74 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65  t addr2 = sqlite
f9d0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
f9e0: 28 76 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 41  (v);.    windowA
f9f0: 67 67 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ggStep(pParse, p
fa00: 4d 57 69 6e 2c 20 63 73 72 4c 65 61 64 2c 20 30  MWin, csrLead, 0
fa10: 2c 20 72 65 67 41 72 67 2c 20 72 65 67 53 69 7a  , regArg, regSiz
fa20: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
fa30: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
fa40: 4e 65 78 74 2c 20 63 73 72 4c 65 61 64 2c 20 61  Next, csrLead, a
fa50: 64 64 72 32 29 3b 0a 20 20 20 20 56 64 62 65 43  ddr2);.    VdbeC
fa60: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
fa70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fa80: 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
fa90: 63 73 72 4c 65 61 64 2c 20 6c 62 6c 45 6d 70 74  csrLead, lblEmpt
faa0: 79 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  y);.    VdbeCove
fab0: 72 61 67 65 4e 65 76 65 72 54 61 6b 65 6e 28 76  rageNeverTaken(v
fac0: 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 4e 65 78  );.  }.  addrNex
fad0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
fae0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
faf0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
fb00: 26 20 28 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d  & (pMWin->eEnd==
fb10: 54 4b 5f 43 55 52 52 45 4e 54 20 7c 7c 20 70 4d  TK_CURRENT || pM
fb20: 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
fb30: 43 55 52 52 45 4e 54 29 20 29 7b 0a 20 20 20 20  CURRENT) ){.    
fb40: 69 6e 74 20 62 43 75 72 72 65 6e 74 20 3d 20 28  int bCurrent = (
fb50: 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54  pMWin->eStart==T
fb60: 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20 20 20  K_CURRENT);.    
fb70: 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20 30  int addrJump = 0
fb80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
fb90: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4a   Address of OP_J
fba0: 75 6d 70 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ump below */.   
fbb0: 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70   if( pMWin->eTyp
fbc0: 65 3d 3d 54 4b 5f 52 41 4e 47 45 20 29 7b 0a 20  e==TK_RANGE ){. 
fbd0: 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
fbe0: 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
fbf0: 6c 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50 61  l + (pPart ? pPa
fc00: 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a  rt->nExpr : 0);.
fc10: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 65 65        int regPee
fc20: 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65 67 50 61  r = pMWin->regPa
fc30: 72 74 20 2b 20 28 70 50 61 72 74 20 3f 20 70 50  rt + (pPart ? pP
fc40: 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  art->nExpr : 0);
fc50: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
fc60: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
fc70: 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  e3KeyInfoFromExp
fc80: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
fc90: 72 64 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20  rderBy, 0, 0);. 
fca0: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
fcb0: 6e 50 65 65 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nPeer; k++){.   
fcc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
fcd0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
fce0: 75 6d 6e 2c 20 63 73 72 4c 65 61 64 2c 20 69 4f  umn, csrLead, iO
fcf0: 66 66 2b 6b 2c 20 72 65 67 4e 65 77 50 65 65 72  ff+k, regNewPeer
fd00: 2b 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +k);.      }.   
fd10: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
fd20: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fd30: 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
fd40: 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20  wPeer, regPeer, 
fd50: 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 73 71  nPeer);.      sq
fd60: 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
fd70: 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79  4(v, (void*)pKey
fd80: 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
fd90: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4a 75 6d  );.      addrJum
fda0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
fdb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
fdc0: 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64  , addr+2, 0, add
fdd0: 72 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  r+2);.      Vdbe
fde0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
fdf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fe00: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
fe10: 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72 65 67   regNewPeer, reg
fe20: 50 65 65 72 2c 20 6e 50 65 65 72 2d 31 29 3b 0a  Peer, nPeer-1);.
fe30: 20 20 20 20 7d 0a 0a 20 20 20 20 77 69 6e 64 6f      }..    windo
fe40: 77 52 65 74 75 72 6e 52 6f 77 73 28 70 50 61 72  wReturnRows(pPar
fe50: 73 65 2c 20 70 4d 57 69 6e 2c 20 72 65 67 43 74  se, pMWin, regCt
fe60: 72 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64  r, regGosub, add
fe70: 72 47 6f 73 75 62 2c 20 0a 20 20 20 20 20 20 20  rGosub, .       
fe80: 20 28 62 43 75 72 72 65 6e 74 20 3f 20 72 65 67   (bCurrent ? reg
fe90: 41 72 67 20 3a 20 30 29 2c 20 28 62 43 75 72 72  Arg : 0), (bCurr
fea0: 65 6e 74 20 3f 20 72 65 67 53 69 7a 65 20 3a 20  ent ? regSize : 
feb0: 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  0).    );.    if
fec0: 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73 71 6c  ( addrJump ) sql
fed0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fee0: 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b 0a 20  (v, addrJump);. 
fef0: 20 7d 0a 0a 20 20 69 66 28 20 62 52 65 76 65 72   }..  if( bRever
ff00: 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e  se==0 ){.    win
ff10: 64 6f 77 41 67 67 53 74 65 70 28 70 50 61 72 73  dowAggStep(pPars
ff20: 65 2c 20 70 4d 57 69 6e 2c 20 63 73 72 4c 65 61  e, pMWin, csrLea
ff30: 64 2c 20 30 2c 20 72 65 67 41 72 67 2c 20 72 65  d, 0, regArg, re
ff40: 67 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 73 71  gSize);.  }.  sq
ff50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ff60: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 72 65  v, OP_AddImm, re
ff70: 67 43 74 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69  gCtr, 1);.  sqli
ff80: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
ff90: 20 4f 50 5f 4e 65 78 74 2c 20 63 73 72 4c 65 61   OP_Next, csrLea
ffa0: 64 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  d, addrNext);.  
ffb0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
ffc0: 0a 0a 20 20 77 69 6e 64 6f 77 52 65 74 75 72 6e  ..  windowReturn
ffd0: 52 6f 77 73 28 70 50 61 72 73 65 2c 20 70 4d 57  Rows(pParse, pMW
ffe0: 69 6e 2c 20 72 65 67 43 74 72 2c 20 72 65 67 47  in, regCtr, regG
fff0: 6f 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 2c  osub, addrGosub,
10000 20 30 2c 20 30 29 3b 0a 0a 20 20 73 71 6c 69 74   0, 0);..  sqlit
10010 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
10020 65 6c 28 76 2c 20 6c 62 6c 45 6d 70 74 79 29 3b  el(v, lblEmpty);
10030 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
10040 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74  dOp1(v, OP_Reset
10050 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d 3e 69  Sorter, pMWin->i
10060 45 70 68 43 73 72 29 3b 0a 20 20 73 71 6c 69 74  EphCsr);.  sqlit
10070 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10080 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 46 6c  OP_Return, regFl
10090 75 73 68 50 61 72 74 29 3b 0a 0a 20 20 2f 2a 20  ushPart);..  /* 
100a0 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 74 6f 20  Jump to here to 
100b0 73 6b 69 70 20 6f 76 65 72 20 66 6c 75 73 68 5f  skip over flush_
100c0 70 61 72 74 69 74 69 6f 6e 20 2a 2f 0a 20 20 73  partition */.  s
100d0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
100e0 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b  re(v, addrGoto);
100f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 41 4e 47 45  .}.../*.** RANGE
10100 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e 44   BETWEEN UNBOUND
10110 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e 44  ED PRECEDING AND
10120 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a   CURRENT ROW.**.
10130 2a 2a 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20  **   ....**     
10140 69 66 28 20 6e 65 77 20 70 61 72 74 69 74 69 6f  if( new partitio
10150 6e 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 41 67  n ){.**       Ag
10160 67 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a  gFinal (xFinaliz
10170 65 29 0a 2a 2a 20 20 20 20 20 20 20 47 6f 73 75  e).**       Gosu
10180 62 20 61 64 64 72 47 6f 73 75 62 0a 2a 2a 20 20  b addrGosub.**  
10190 20 20 20 20 20 52 65 73 65 74 53 6f 72 74 65 72       ResetSorter
101a0 20 65 70 68 2d 74 61 62 6c 65 0a 2a 2a 20 20 20   eph-table.**   
101b0 20 20 7d 0a 2a 2a 20 20 20 20 20 65 6c 73 65 20    }.**     else 
101c0 69 66 28 20 6e 65 77 20 70 65 65 72 20 29 7b 0a  if( new peer ){.
101d0 2a 2a 20 20 20 20 20 20 20 41 67 67 46 69 6e 61  **       AggFina
101e0 6c 20 28 78 56 61 6c 75 65 29 0a 2a 2a 20 20 20  l (xValue).**   
101f0 20 20 20 20 47 6f 73 75 62 20 61 64 64 72 47 6f      Gosub addrGo
10200 73 75 62 0a 2a 2a 20 20 20 20 20 20 20 52 65 73  sub.**       Res
10210 65 74 53 6f 72 74 65 72 20 65 70 68 2d 74 61 62  etSorter eph-tab
10220 6c 65 0a 2a 2a 20 20 20 20 20 7d 0a 2a 2a 20 20  le.**     }.**  
10230 20 20 20 41 67 67 53 74 65 70 0a 2a 2a 20 20 20     AggStep.**   
10240 20 20 49 6e 73 65 72 74 20 28 72 65 63 6f 72 64    Insert (record
10250 20 69 6e 74 6f 20 65 70 68 2d 74 61 62 6c 65 29   into eph-table)
10260 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 57 68 65  .**   sqlite3Whe
10270 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 41 67 67  reEnd().**   Agg
10280 46 69 6e 61 6c 20 28 78 46 69 6e 61 6c 69 7a 65  Final (xFinalize
10290 29 0a 2a 2a 20 20 20 47 6f 73 75 62 20 61 64 64  ).**   Gosub add
102a0 72 47 6f 73 75 62 0a 2a 2a 0a 2a 2a 20 52 41 4e  rGosub.**.** RAN
102b0 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55  GE BETWEEN UNBOU
102c0 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41  NDED PRECEDING A
102d0 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f 4c  ND UNBOUNDED FOL
102e0 4c 4f 57 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 41  LOWING.**.**   A
102f0 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
10300 74 61 6b 65 20 6e 6f 20 61 63 74 69 6f 6e 20 66  take no action f
10310 6f 72 20 61 20 22 6e 65 77 20 70 65 65 72 22 2e  or a "new peer".
10320 20 49 6e 76 6f 6b 65 0a 2a 2a 20 20 20 74 68 65   Invoke.**   the
10330 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 6f 6e 63   sub-routine onc
10340 65 20 6f 6e 6c 79 20 66 6f 72 20 65 61 63 68 20  e only for each 
10350 70 61 72 74 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  partition..**.**
10360 20 52 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43   RANGE BETWEEN C
10370 55 52 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43  URRENT ROW AND C
10380 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a 0a 2a 2a  URRENT ROW.**.**
10390 20 20 20 41 73 20 61 62 6f 76 65 2c 20 65 78 63     As above, exc
103a0 65 70 74 20 74 68 61 74 20 74 68 65 20 22 6e 65  ept that the "ne
103b0 77 20 70 65 65 72 22 20 63 6f 6e 64 69 74 69 6f  w peer" conditio
103c0 6e 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  n is handled in 
103d0 74 68 65 0a 2a 2a 20 20 20 73 61 6d 65 20 77 61  the.**   same wa
103e0 79 20 61 73 20 22 6e 65 77 20 70 61 72 74 69 74  y as "new partit
103f0 69 6f 6e 22 20 28 73 6f 20 74 68 65 72 65 20 69  ion" (so there i
10400 73 20 6e 6f 20 22 65 6c 73 65 20 69 66 22 20 62  s no "else if" b
10410 6c 6f 63 6b 29 2e 0a 2a 2a 0a 2a 2a 20 52 4f 57  lock)..**.** ROW
10420 53 20 42 45 54 57 45 45 4e 20 55 4e 42 4f 55 4e  S BETWEEN UNBOUN
10430 44 45 44 20 50 52 45 43 45 44 49 4e 47 20 41 4e  DED PRECEDING AN
10440 44 20 43 55 52 52 45 4e 54 20 52 4f 57 0a 2a 2a  D CURRENT ROW.**
10450 20 0a 2a 2a 20 20 20 41 73 20 61 62 6f 76 65 2c   .**   As above,
10460 20 65 78 63 65 70 74 20 61 73 73 75 6d 65 20 65   except assume e
10470 76 65 72 79 20 72 6f 77 20 69 73 20 61 20 22 6e  very row is a "n
10480 65 77 20 70 65 65 72 22 2e 0a 2a 2f 0a 73 74 61  ew peer"..*/.sta
10490 74 69 63 20 76 6f 69 64 20 77 69 6e 64 6f 77 43  tic void windowC
104a0 6f 64 65 44 65 66 61 75 6c 74 53 74 65 70 28 0a  odeDefaultStep(.
104b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
104c0 20 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 0a 20   .  Select *p,. 
104d0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
104e0 66 6f 2c 0a 20 20 69 6e 74 20 72 65 67 47 6f 73  fo,.  int regGos
104f0 75 62 2c 20 0a 20 20 69 6e 74 20 61 64 64 72 47  ub, .  int addrG
10500 6f 73 75 62 0a 29 7b 0a 20 20 57 69 6e 64 6f 77  osub.){.  Window
10510 20 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69   *pMWin = p->pWi
10520 6e 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  n;.  Vdbe *v = s
10530 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10540 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 6b 3b 0a  arse);.  int k;.
10550 20 20 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20    int iSubCsr = 
10560 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43  p->pSrc->a[0].iC
10570 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6e 53 75  ursor;.  int nSu
10580 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
10590 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20  ].pTab->nCol;.  
105a0 69 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73 65  int reg = pParse
105b0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 69 6e 74 20  ->nMem+1;.  int 
105c0 72 65 67 52 65 63 6f 72 64 20 3d 20 72 65 67 2b  regRecord = reg+
105d0 6e 53 75 62 3b 0a 20 20 69 6e 74 20 72 65 67 52  nSub;.  int regR
105e0 6f 77 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64  owid = regRecord
105f0 2b 31 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  +1;.  int addr;.
10600 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 61 72    ExprList *pPar
10610 74 20 3d 20 70 4d 57 69 6e 2d 3e 70 50 61 72 74  t = pMWin->pPart
10620 69 74 69 6f 6e 3b 0a 20 20 45 78 70 72 4c 69 73  ition;.  ExprLis
10630 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 4d  t *pOrderBy = pM
10640 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  Win->pOrderBy;..
10650 20 20 61 73 73 65 72 74 28 20 70 4d 57 69 6e 2d    assert( pMWin-
10660 3e 65 54 79 70 65 3d 3d 54 4b 5f 52 41 4e 47 45  >eType==TK_RANGE
10670 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 4d 57 69   .      || (pMWi
10680 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 55 4e  n->eStart==TK_UN
10690 42 4f 55 4e 44 45 44 20 26 26 20 70 4d 57 69 6e  BOUNDED && pMWin
106a0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45  ->eEnd==TK_CURRE
106b0 4e 54 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  NT).  );..  asse
106c0 72 74 28 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61  rt( (pMWin->eSta
106d0 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  rt==TK_UNBOUNDED
106e0 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d   && pMWin->eEnd=
106f0 3d 54 4b 5f 43 55 52 52 45 4e 54 29 0a 20 20 20  =TK_CURRENT).   
10700 20 20 20 20 7c 7c 20 28 70 4d 57 69 6e 2d 3e 65      || (pMWin->e
10710 53 74 61 72 74 3d 3d 54 4b 5f 55 4e 42 4f 55 4e  Start==TK_UNBOUN
10720 44 45 44 20 26 26 20 70 4d 57 69 6e 2d 3e 65 45  DED && pMWin->eE
10730 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44  nd==TK_UNBOUNDED
10740 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d 57  ).       || (pMW
10750 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f 43  in->eStart==TK_C
10760 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e 2d  URRENT && pMWin-
10770 3e 65 45 6e 64 3d 3d 54 4b 5f 43 55 52 52 45 4e  >eEnd==TK_CURREN
10780 54 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 4d  T).       || (pM
10790 57 69 6e 2d 3e 65 53 74 61 72 74 3d 3d 54 4b 5f  Win->eStart==TK_
107a0 43 55 52 52 45 4e 54 20 26 26 20 70 4d 57 69 6e  CURRENT && pMWin
107b0 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55 4e 42 4f 55  ->eEnd==TK_UNBOU
107c0 4e 44 45 44 20 26 26 20 21 70 4f 72 64 65 72 42  NDED && !pOrderB
107d0 79 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70  y).  );..  if( p
107e0 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54 4b 5f 55  MWin->eEnd==TK_U
107f0 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20 20 20 20  NBOUNDED ){.    
10800 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
10810 7d 0a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  }..  pParse->nMe
10820 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 32 3b 0a 0a  m += nSub + 2;..
10830 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 69 6e    /* Load the in
10840 64 69 76 69 64 75 61 6c 20 63 6f 6c 75 6d 6e 20  dividual column 
10850 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 72 6f  values of the ro
10860 77 20 72 65 74 75 72 6e 65 64 20 62 79 0a 20 20  w returned by.  
10870 2a 2a 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  ** the sub-selec
10880 74 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20  t into an array 
10890 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f  of registers. */
108a0 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 53  .  for(k=0; k<nS
108b0 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 73 71  ub; k++){.    sq
108c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
108d0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
108e0 75 62 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29  ubCsr, k, reg+k)
108f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
10900 6b 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  k if this is the
10910 20 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20   start of a new 
10920 70 61 72 74 69 74 69 6f 6e 20 6f 72 20 70 65 65  partition or pee
10930 72 20 67 72 6f 75 70 2e 20 2a 2f 0a 20 20 69 66  r group. */.  if
10940 28 20 70 50 61 72 74 20 7c 7c 20 70 4f 72 64 65  ( pPart || pOrde
10950 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
10960 50 61 72 74 20 3d 20 28 70 50 61 72 74 20 3f 20  Part = (pPart ? 
10970 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pPart->nExpr : 0
10980 29 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 47  );.    int addrG
10990 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  oto = 0;.    int
109a0 20 61 64 64 72 4a 75 6d 70 20 3d 20 30 3b 0a 20   addrJump = 0;. 
109b0 20 20 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 28     int nPeer = (
109c0 70 4f 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65  pOrderBy ? pOrde
109d0 72 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  rBy->nExpr : 0);
109e0 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72 74 20  ..    if( pPart 
109f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  ){.      int reg
10a00 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b 20  NewPart = reg + 
10a10 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
10a20 6c 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  l;.      KeyInfo
10a30 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c   *pKeyInfo = sql
10a40 69 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45  ite3KeyInfoFromE
10a50 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
10a60 70 50 61 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20  pPart, 0, 0);.  
10a70 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
10a80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10a90 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e  OP_Compare, regN
10aa0 65 77 50 61 72 74 2c 20 70 4d 57 69 6e 2d 3e 72  ewPart, pMWin->r
10ab0 65 67 50 61 72 74 2c 6e 50 61 72 74 29 3b 0a 20  egPart,nPart);. 
10ac0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10ad0 41 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69  AppendP4(v, (voi
10ae0 64 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  d*)pKeyInfo, P4_
10af0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
10b00 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74  addrJump = sqlit
10b10 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10b20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c  OP_Jump, addr+2,
10b30 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20   0, addr+2);.   
10b40 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 45     VdbeCoverageE
10b50 71 4e 65 28 76 29 3b 0a 20 20 20 20 20 20 77 69  qNe(v);.      wi
10b60 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28 70 50 61  ndowAggFinal(pPa
10b70 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31 29 3b 0a  rse, pMWin, 1);.
10b80 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
10b90 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  By ){.        ad
10ba0 64 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33  drGoto = sqlite3
10bb0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
10bc0 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  _Goto);.      }.
10bd0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
10be0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
10bf0 20 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20   int regNewPeer 
10c00 3d 20 72 65 67 20 2b 20 70 4d 57 69 6e 2d 3e 6e  = reg + pMWin->n
10c10 42 75 66 66 65 72 43 6f 6c 20 2b 20 6e 50 61 72  BufferCol + nPar
10c20 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  t;.      int reg
10c30 50 65 65 72 20 3d 20 70 4d 57 69 6e 2d 3e 72 65  Peer = pMWin->re
10c40 67 50 61 72 74 20 2b 20 6e 50 61 72 74 3b 0a 0a  gPart + nPart;..
10c50 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4a 75        if( addrJu
10c60 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  mp ) sqlite3Vdbe
10c70 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
10c80 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 69 66 28  Jump);.      if(
10c90 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65 3d 3d 54   pMWin->eType==T
10ca0 4b 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20  K_RANGE ){.     
10cb0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
10cc0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
10cd0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
10ce0 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
10cf0 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  By, 0, 0);.     
10d00 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
10d10 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
10d20 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65  P_Compare, regNe
10d30 77 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20  wPeer, regPeer, 
10d40 6e 50 65 65 72 29 3b 0a 20 20 20 20 20 20 20 20  nPeer);.        
10d50 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
10d60 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b  dP4(v, (void*)pK
10d70 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
10d80 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  FO);.        add
10d90 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  rJump = sqlite3V
10da0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
10db0 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c  Jump, addr+2, 0,
10dc0 20 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20   addr+2);.      
10dd0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
10de0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10df0 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d 70          addrJump
10e00 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
10e10 20 20 20 20 77 69 6e 64 6f 77 41 67 67 46 69 6e      windowAggFin
10e20 61 6c 28 70 50 61 72 73 65 2c 20 70 4d 57 69 6e  al(pParse, pMWin
10e30 2c 20 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 3d  , pMWin->eStart=
10e40 3d 54 4b 5f 43 55 52 52 45 4e 54 29 3b 0a 20 20  =TK_CURRENT);.  
10e50 20 20 20 20 69 66 28 20 61 64 64 72 47 6f 74 6f      if( addrGoto
10e60 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
10e70 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f  mpHere(v, addrGo
10e80 74 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  to);.    }..    
10e90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10ea0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
10eb0 70 4d 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 73  pMWin->iEphCsr,s
10ec0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
10ed0 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 20  tAddr(v)+3);.   
10ee0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10ef0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10f00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
10f10 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20 61  sub, regGosub, a
10f20 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 73  ddrGosub);.    s
10f30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10f40 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57  (v, OP_Next, pMW
10f50 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c  in->iEphCsr, sql
10f60 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10f70 64 64 72 28 76 29 2d 31 29 3b 0a 20 20 20 20 56  ddr(v)-1);.    V
10f80 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10f90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10fa0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
10fb0 65 74 53 6f 72 74 65 72 2c 20 70 4d 57 69 6e 2d  etSorter, pMWin-
10fc0 3e 69 45 70 68 43 73 72 29 3b 0a 20 20 20 20 73  >iEphCsr);.    s
10fd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10fe0 28 0a 20 20 20 20 20 20 20 20 76 2c 20 4f 50 5f  (.        v, OP_
10ff0 43 6f 70 79 2c 20 72 65 67 2b 70 4d 57 69 6e 2d  Copy, reg+pMWin-
11000 3e 6e 42 75 66 66 65 72 43 6f 6c 2c 20 70 4d 57  >nBufferCol, pMW
11010 69 6e 2d 3e 72 65 67 50 61 72 74 2c 20 6e 50 61  in->regPart, nPa
11020 72 74 2b 6e 50 65 65 72 2d 31 0a 20 20 20 20 29  rt+nPeer-1.    )
11030 3b 0a 0a 20 20 20 20 69 66 28 20 61 64 64 72 4a  ;..    if( addrJ
11040 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62  ump ) sqlite3Vdb
11050 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11060 72 4a 75 6d 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rJump);.  }..  /
11070 2a 20 49 6e 76 6f 6b 65 20 73 74 65 70 20 66 75  * Invoke step fu
11080 6e 63 74 69 6f 6e 20 66 6f 72 20 77 69 6e 64 6f  nction for windo
11090 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  w functions */. 
110a0 20 77 69 6e 64 6f 77 41 67 67 53 74 65 70 28 70   windowAggStep(p
110b0 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 2d 31  Parse, pMWin, -1
110c0 2c 20 30 2c 20 72 65 67 2c 20 30 29 3b 0a 0a 20  , 0, reg, 0);.. 
110d0 20 2f 2a 20 42 75 66 66 65 72 20 74 68 65 20 63   /* Buffer the c
110e0 75 72 72 65 6e 74 20 72 6f 77 20 69 6e 20 74 68  urrent row in th
110f0 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
11100 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4d 57 69  e. */.  if( pMWi
11110 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30 20  n->nBufferCol>0 
11120 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
11130 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
11140 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 2c 20  akeRecord, reg, 
11150 70 4d 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f  pMWin->nBufferCo
11160 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
11170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
11180 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11190 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65 67   OP_Blob, 0, reg
111a0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 73 71 6c  Record);.    sql
111b0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
111c0 28 76 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20 30  (v, (void*)"", 0
111d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
111e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
111f0 5f 4e 65 77 52 6f 77 69 64 2c 20 70 4d 57 69 6e  _NewRowid, pMWin
11200 2d 3e 69 45 70 68 43 73 72 2c 20 72 65 67 52 6f  ->iEphCsr, regRo
11210 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  wid);.  sqlite3V
11220 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11230 49 6e 73 65 72 74 2c 20 70 4d 57 69 6e 2d 3e 69  Insert, pMWin->i
11240 45 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72  EphCsr, regRecor
11250 64 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  d, regRowid);.. 
11260 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
11270 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 20  base scan loop. 
11280 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  */.  sqlite3Wher
11290 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
112a0 20 77 69 6e 64 6f 77 41 67 67 46 69 6e 61 6c 28   windowAggFinal(
112b0 70 50 61 72 73 65 2c 20 70 4d 57 69 6e 2c 20 31  pParse, pMWin, 1
112c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
112d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
112e0 69 6e 64 2c 20 70 4d 57 69 6e 2d 3e 69 45 70 68  ind, pMWin->iEph
112f0 43 73 72 2c 73 71 6c 69 74 65 33 56 64 62 65 43  Csr,sqlite3VdbeC
11300 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
11310 3b 0a 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;.  VdbeCoverage
11320 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
11330 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
11340 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20  osub, regGosub, 
11350 61 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 73 71  addrGosub);.  sq
11360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11370 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4d 57 69  v, OP_Next, pMWi
11380 6e 2d 3e 69 45 70 68 43 73 72 2c 20 73 71 6c 69  n->iEphCsr, sqli
11390 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
113a0 64 72 28 76 29 2d 31 29 3b 0a 20 20 56 64 62 65  dr(v)-1);.  Vdbe
113b0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 7d 0a 0a  Coverage(v);.}..
113c0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
113d0 6e 64 20 72 65 74 75 72 6e 20 61 20 64 75 70 6c  nd return a dupl
113e0 69 63 61 74 65 20 6f 66 20 74 68 65 20 57 69 6e  icate of the Win
113f0 64 6f 77 20 6f 62 6a 65 63 74 20 69 6e 64 69 63  dow object indic
11400 61 74 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 74  ated by the.** t
11410 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 20 53  hird argument. S
11420 65 74 20 74 68 65 20 57 69 6e 64 6f 77 2e 70 4f  et the Window.pO
11430 77 6e 65 72 20 66 69 65 6c 64 20 6f 66 20 74 68  wner field of th
11440 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 74 6f 0a  e new object to.
11450 2a 2a 20 70 4f 77 6e 65 72 2e 0a 2a 2f 0a 57 69  ** pOwner..*/.Wi
11460 6e 64 6f 77 20 2a 73 71 6c 69 74 65 33 57 69 6e  ndow *sqlite3Win
11470 64 6f 77 44 75 70 28 73 71 6c 69 74 65 33 20 2a  dowDup(sqlite3 *
11480 64 62 2c 20 45 78 70 72 20 2a 70 4f 77 6e 65 72  db, Expr *pOwner
11490 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a 20 20  , Window *p){.  
114a0 57 69 6e 64 6f 77 20 2a 70 4e 65 77 20 3d 20 30  Window *pNew = 0
114b0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
114c0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
114d0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
114e0 73 69 7a 65 6f 66 28 57 69 6e 64 6f 77 29 29 3b  sizeof(Window));
114f0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
11500 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  .      pNew->zNa
11510 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
11520 72 44 75 70 28 64 62 2c 20 70 2d 3e 7a 4e 61 6d  rDup(db, p->zNam
11530 65 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  e);.      pNew->
11540 70 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65  pFilter = sqlite
11550 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e  3ExprDup(db, p->
11560 70 46 69 6c 74 65 72 2c 20 30 29 3b 0a 20 20 20  pFilter, 0);.   
11570 20 20 20 70 4e 65 77 2d 3e 70 50 61 72 74 69 74     pNew->pPartit
11580 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ion = sqlite3Exp
11590 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
115a0 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a  pPartition, 0);.
115b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4f 72 64        pNew->pOrd
115c0 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
115d0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
115e0 3e 70 4f 72 64 65 72 42 79 2c 20 30 29 3b 0a 20  >pOrderBy, 0);. 
115f0 20 20 20 20 20 70 4e 65 77 2d 3e 65 54 79 70 65       pNew->eType
11600 20 3d 20 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20   = p->eType;.   
11610 20 20 20 70 4e 65 77 2d 3e 65 45 6e 64 20 3d 20     pNew->eEnd = 
11620 70 2d 3e 65 45 6e 64 3b 0a 20 20 20 20 20 20 70  p->eEnd;.      p
11630 4e 65 77 2d 3e 65 53 74 61 72 74 20 3d 20 70 2d  New->eStart = p-
11640 3e 65 53 74 61 72 74 3b 0a 20 20 20 20 20 20 70  >eStart;.      p
11650 4e 65 77 2d 3e 70 53 74 61 72 74 20 3d 20 73 71  New->pStart = sq
11660 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
11670 20 70 2d 3e 70 53 74 61 72 74 2c 20 30 29 3b 0a   p->pStart, 0);.
11680 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 45 6e 64        pNew->pEnd
11690 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
116a0 70 28 64 62 2c 20 70 2d 3e 70 45 6e 64 2c 20 30  p(db, p->pEnd, 0
116b0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
116c0 4f 77 6e 65 72 20 3d 20 70 4f 77 6e 65 72 3b 0a  Owner = pOwner;.
116d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
116e0 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
116f0 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20  * Return a copy 
11700 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  of the linked li
11710 73 74 20 6f 66 20 57 69 6e 64 6f 77 20 6f 62 6a  st of Window obj
11720 65 63 74 73 20 70 61 73 73 65 64 20 61 73 20 74  ects passed as t
11730 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67  he.** second arg
11740 75 6d 65 6e 74 2e 0a 2a 2f 0a 57 69 6e 64 6f 77  ument..*/.Window
11750 20 2a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c   *sqlite3WindowL
11760 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  istDup(sqlite3 *
11770 64 62 2c 20 57 69 6e 64 6f 77 20 2a 70 29 7b 0a  db, Window *p){.
11780 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
11790 20 20 57 69 6e 64 6f 77 20 2a 70 52 65 74 20 3d    Window *pRet =
117a0 20 30 3b 0a 20 20 57 69 6e 64 6f 77 20 2a 2a 70   0;.  Window **p
117b0 70 20 3d 20 26 70 52 65 74 3b 0a 0a 20 20 66 6f  p = &pRet;..  fo
117c0 72 28 70 57 69 6e 3d 70 3b 20 70 57 69 6e 3b 20  r(pWin=p; pWin; 
117d0 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74  pWin=pWin->pNext
117e0 57 69 6e 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20  Win){.    *pp = 
117f0 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 75 70  sqlite3WindowDup
11800 28 64 62 2c 20 30 2c 20 70 57 69 6e 29 3b 0a 20  (db, 0, pWin);. 
11810 20 20 20 69 66 28 20 2a 70 70 3d 3d 30 20 29 20     if( *pp==0 ) 
11820 62 72 65 61 6b 3b 0a 20 20 20 20 70 70 20 3d 20  break;.    pp = 
11830 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69  &((*pp)->pNextWi
11840 6e 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  n);.  }..  retur
11850 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
11860 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
11870 69 6e 28 29 20 68 61 73 20 61 6c 72 65 61 64 79  in() has already
11880 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f 72   been called for
11890 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
118a0 65 6d 65 6e 74 20 0a 2a 2a 20 70 61 73 73 65 64  ement .** passed
118b0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
118c0 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 69  rgument when thi
118d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
118e0 76 6f 6b 65 64 2e 20 49 74 20 67 65 6e 65 72 61  voked. It genera
118f0 74 65 73 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 70  tes.** code to p
11900 6f 70 75 6c 61 74 65 20 74 68 65 20 57 69 6e 64  opulate the Wind
11910 6f 77 2e 72 65 67 52 65 73 75 6c 74 20 72 65 67  ow.regResult reg
11920 69 73 74 65 72 20 66 6f 72 20 65 61 63 68 20 77  ister for each w
11930 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 61  indow function a
11940 6e 64 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  nd.** invoke the
11950 20 73 75 62 2d 72 6f 75 74 69 6e 65 20 61 74 20   sub-routine at 
11960 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
11970 47 6f 73 75 62 20 6f 6e 63 65 20 66 6f 72 20 65  Gosub once for e
11980 61 63 68 20 72 6f 77 2e 0a 2a 2a 20 54 68 69 73  ach row..** This
11990 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
119a0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
119b0 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
119c0 6e 67 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ng. .*/.void sql
119d0 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
119e0 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
119f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
11a00 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
11a10 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
11a20 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
11a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11a40 65 77 72 69 74 74 65 6e 20 53 45 4c 45 43 54 20  ewritten SELECT 
11a50 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 57  statement */.  W
11a60 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
11a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11a80 2a 20 43 6f 6e 74 65 78 74 20 72 65 74 75 72 6e  * Context return
11a90 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
11aa0 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  reBegin() */.  i
11ab0 6e 74 20 72 65 67 47 6f 73 75 62 2c 20 20 20 20  nt regGosub,    
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ad0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 4f  * Register for O
11ae0 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 69 6e 74  P_Gosub */.  int
11af0 20 61 64 64 72 47 6f 73 75 62 20 20 20 20 20 20   addrGosub      
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b10 4f 50 5f 47 6f 73 75 62 20 68 65 72 65 20 74 6f  OP_Gosub here to
11b20 20 72 65 74 75 72 6e 20 65 61 63 68 20 72 6f 77   return each row
11b30 20 2a 2f 0a 29 7b 0a 20 20 57 69 6e 64 6f 77 20   */.){.  Window 
11b40 2a 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e  *pMWin = p->pWin
11b50 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 61 72  ;..  /* There ar
11b60 65 20 74 68 72 65 65 20 64 69 66 66 65 72 65 6e  e three differen
11b70 74 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  t functions that
11b80 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
11b90 64 6f 20 74 68 65 20 77 6f 72 6b 0a 20 20 2a 2a  do the work.  **
11ba0 20 6f 66 20 74 68 69 73 20 6f 6e 65 2c 20 64 65   of this one, de
11bb0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 77  pending on the w
11bc0 69 6e 64 6f 77 20 66 72 61 6d 65 20 61 6e 64 20  indow frame and 
11bd0 74 68 65 20 73 70 65 63 69 66 69 63 20 62 75 69  the specific bui
11be0 6c 74 2d 69 6e 0a 20 20 2a 2a 20 77 69 6e 64 6f  lt-in.  ** windo
11bf0 77 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  w functions used
11c00 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 2a 2a 0a   (if any)..  **.
11c10 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f 64 65 52    ** windowCodeR
11c20 6f 77 45 78 70 72 53 74 65 70 28 29 20 68 61 6e  owExprStep() han
11c30 64 6c 65 73 20 61 6c 6c 20 22 52 4f 57 53 22 20  dles all "ROWS" 
11c40 77 69 6e 64 6f 77 20 66 72 61 6d 65 73 2c 20 65  window frames, e
11c50 78 63 65 70 74 20 66 6f 72 3a 0a 20 20 2a 2a 0a  xcept for:.  **.
11c60 20 20 2a 2a 20 20 20 52 4f 57 53 20 42 45 54 57    **   ROWS BETW
11c70 45 45 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52  EEN UNBOUNDED PR
11c80 45 43 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52  ECEDING AND CURR
11c90 45 4e 54 20 52 4f 57 0a 20 20 2a 2a 0a 20 20 2a  ENT ROW.  **.  *
11ca0 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20  * The exception 
11cb0 69 73 20 62 65 63 61 75 73 65 20 77 69 6e 64 6f  is because windo
11cc0 77 43 6f 64 65 52 6f 77 45 78 70 72 53 74 65 70  wCodeRowExprStep
11cd0 28 29 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6c  () implements al
11ce0 6c 20 77 69 6e 64 6f 77 0a 20 20 2a 2a 20 66 72  l window.  ** fr
11cf0 61 6d 65 20 74 79 70 65 73 20 62 79 20 63 61 63  ame types by cac
11d00 68 69 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20  hing the entire 
11d10 70 61 72 74 69 74 69 6f 6e 20 69 6e 20 61 20 74  partition in a t
11d20 65 6d 70 20 74 61 62 6c 65 2c 20 61 6e 64 0a 20  emp table, and. 
11d30 20 2a 2a 20 22 52 4f 57 53 20 42 45 54 57 45 45   ** "ROWS BETWEE
11d40 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
11d50 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
11d60 54 20 52 4f 57 22 20 69 73 20 65 61 73 79 20 65  T ROW" is easy e
11d70 6e 6f 75 67 68 20 74 6f 0a 20 20 2a 2a 20 69 6d  nough to.  ** im
11d80 70 6c 65 6d 65 6e 74 20 77 69 74 68 6f 75 74 20  plement without 
11d90 73 75 63 68 20 61 20 63 61 63 68 65 2e 0a 20 20  such a cache..  
11da0 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64 6f 77 43 6f  **.  ** windowCo
11db0 64 65 43 61 63 68 65 53 74 65 70 28 29 20 69 73  deCacheStep() is
11dc0 20 75 73 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a   used for:.  **.
11dd0 20 20 2a 2a 20 20 20 52 41 4e 47 45 20 42 45 54    **   RANGE BET
11de0 57 45 45 4e 20 43 55 52 52 45 4e 54 20 52 4f 57  WEEN CURRENT ROW
11df0 20 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46   AND UNBOUNDED F
11e00 4f 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 0a 20 20  OLLOWING.  **.  
11e10 2a 2a 20 49 74 20 69 73 20 61 6c 73 6f 20 75 73  ** It is also us
11e20 65 64 20 66 6f 72 20 61 6e 79 74 68 69 6e 67 20  ed for anything 
11e30 6e 6f 74 20 68 61 6e 64 6c 65 64 20 62 79 20 77  not handled by w
11e40 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45 78 70 72  indowCodeRowExpr
11e50 53 74 65 70 28 29 20 0a 20 20 2a 2a 20 74 68 61  Step() .  ** tha
11e60 74 20 69 6e 76 6f 6b 65 73 20 61 20 62 75 69 6c  t invokes a buil
11e70 74 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63  t-in window func
11e80 74 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72  tion that requir
11e90 65 73 20 74 68 65 20 65 6e 74 69 72 65 20 0a 20  es the entire . 
11ea0 20 2a 2a 20 70 61 72 74 69 74 69 6f 6e 20 74 6f   ** partition to
11eb0 20 62 65 20 63 61 63 68 65 64 20 69 6e 20 61 20   be cached in a 
11ec0 74 65 6d 70 20 74 61 62 6c 65 20 62 65 66 6f 72  temp table befor
11ed0 65 20 61 6e 79 20 72 6f 77 73 20 61 72 65 20 72  e any rows are r
11ee0 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 28 65 2e  eturned.  ** (e.
11ef0 67 2e 20 6e 74 68 5f 76 61 6c 75 65 28 29 20 6f  g. nth_value() o
11f00 72 20 70 65 72 63 65 6e 74 5f 72 61 6e 6b 28 29  r percent_rank()
11f10 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 69 6e  )..  **.  ** Fin
11f20 61 6c 6c 79 2c 20 61 73 73 75 6d 69 6e 67 20 74  ally, assuming t
11f30 68 65 72 65 20 69 73 20 6e 6f 20 62 75 69 6c 74  here is no built
11f40 2d 69 6e 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  -in window funct
11f50 69 6f 6e 20 74 68 61 74 20 72 65 71 75 69 72 65  ion that require
11f60 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 72 74 69  s.  ** the parti
11f70 74 69 6f 6e 20 74 6f 20 62 65 20 63 61 63 68 65  tion to be cache
11f80 64 2c 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66  d, windowCodeDef
11f90 61 75 6c 74 53 74 65 70 28 29 20 69 73 20 75 73  aultStep() is us
11fa0 65 64 20 66 6f 72 3a 0a 20 20 2a 2a 0a 20 20 2a  ed for:.  **.  *
11fb0 2a 20 20 20 52 41 4e 47 45 20 42 45 54 57 45 45  *   RANGE BETWEE
11fc0 4e 20 55 4e 42 4f 55 4e 44 45 44 20 50 52 45 43  N UNBOUNDED PREC
11fd0 45 44 49 4e 47 20 41 4e 44 20 43 55 52 52 45 4e  EDING AND CURREN
11fe0 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20 20 52 41  T ROW .  **   RA
11ff0 4e 47 45 20 42 45 54 57 45 45 4e 20 55 4e 42 4f  NGE BETWEEN UNBO
12000 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e 47 20  UNDED PRECEDING 
12010 41 4e 44 20 55 4e 42 4f 55 4e 44 45 44 20 46 4f  AND UNBOUNDED FO
12020 4c 4c 4f 57 49 4e 47 0a 20 20 2a 2a 20 20 20 52  LLOWING.  **   R
12030 41 4e 47 45 20 42 45 54 57 45 45 4e 20 43 55 52  ANGE BETWEEN CUR
12040 52 45 4e 54 20 52 4f 57 20 41 4e 44 20 43 55 52  RENT ROW AND CUR
12050 52 45 4e 54 20 52 4f 57 20 0a 20 20 2a 2a 20 20  RENT ROW .  **  
12060 20 52 4f 57 53 20 42 45 54 57 45 45 4e 20 55 4e   ROWS BETWEEN UN
12070 42 4f 55 4e 44 45 44 20 50 52 45 43 45 44 49 4e  BOUNDED PRECEDIN
12080 47 20 41 4e 44 20 43 55 52 52 45 4e 54 20 52 4f  G AND CURRENT RO
12090 57 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 69 6e 64  W.  **.  ** wind
120a0 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53 74 65  owCodeDefaultSte
120b0 70 28 29 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  p() is the only 
120c0 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 65  one of the three
120d0 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 0a   functions that.
120e0 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 63 61    ** does not ca
120f0 63 68 65 20 65 61 63 68 20 70 61 72 74 69 74 69  che each partiti
12100 6f 6e 20 69 6e 20 61 20 74 65 6d 70 20 74 61 62  on in a temp tab
12110 6c 65 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e  le before beginn
12120 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 72 65 74 75  ing to.  ** retu
12130 72 6e 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  rn rows..  */.  
12140 69 66 28 20 70 4d 57 69 6e 2d 3e 65 54 79 70 65  if( pMWin->eType
12150 3d 3d 54 4b 5f 52 4f 57 53 20 0a 20 20 20 26 26  ==TK_ROWS .   &&
12160 20 28 70 4d 57 69 6e 2d 3e 65 53 74 61 72 74 21   (pMWin->eStart!
12170 3d 54 4b 5f 55 4e 42 4f 55 4e 44 45 44 7c 7c 70  =TK_UNBOUNDED||p
12180 4d 57 69 6e 2d 3e 65 45 6e 64 21 3d 54 4b 5f 43  MWin->eEnd!=TK_C
12190 55 52 52 45 4e 54 7c 7c 21 70 4d 57 69 6e 2d 3e  URRENT||!pMWin->
121a0 70 4f 72 64 65 72 42 79 29 0a 20 20 29 7b 0a 20  pOrderBy).  ){. 
121b0 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
121c0 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56  ment((pParse->pV
121d0 64 62 65 2c 20 22 42 65 67 69 6e 20 52 6f 77 45  dbe, "Begin RowE
121e0 78 70 72 53 74 65 70 28 29 22 29 29 3b 0a 20 20  xprStep()"));.  
121f0 20 20 77 69 6e 64 6f 77 43 6f 64 65 52 6f 77 45    windowCodeRowE
12200 78 70 72 53 74 65 70 28 70 50 61 72 73 65 2c 20  xprStep(pParse, 
12210 70 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f  p, pWInfo, regGo
12220 73 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b  sub, addrGosub);
12230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 57 69  .  }else{.    Wi
12240 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20  ndow *pWin;.    
12250 69 6e 74 20 62 43 61 63 68 65 20 3d 20 30 3b 20  int bCache = 0; 
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12270 20 54 72 75 65 20 74 6f 20 75 73 65 20 43 61 63   True to use Cac
12280 68 65 53 74 65 70 28 29 20 2a 2f 0a 0a 20 20 20  heStep() */..   
12290 20 69 66 28 20 70 4d 57 69 6e 2d 3e 65 53 74 61   if( pMWin->eSta
122a0 72 74 3d 3d 54 4b 5f 43 55 52 52 45 4e 54 20 26  rt==TK_CURRENT &
122b0 26 20 70 4d 57 69 6e 2d 3e 65 45 6e 64 3d 3d 54  & pMWin->eEnd==T
122c0 4b 5f 55 4e 42 4f 55 4e 44 45 44 20 29 7b 0a 20  K_UNBOUNDED ){. 
122d0 20 20 20 20 20 62 43 61 63 68 65 20 3d 20 31 3b       bCache = 1;
122e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
122f0 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d 57 69 6e    for(pWin=pMWin
12300 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57 69  ; pWin; pWin=pWi
12310 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20  n->pNextWin){.  
12320 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
12330 46 75 6e 63 20 3d 20 70 57 69 6e 2d 3e 70 46 75  Func = pWin->pFu
12340 6e 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  nc;.        if( 
12350 28 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  (pFunc->funcFlag
12360 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
12370 57 49 4e 44 4f 57 5f 53 49 5a 45 29 0a 20 20 20  WINDOW_SIZE).   
12380 20 20 20 20 20 20 7c 7c 20 28 70 46 75 6e 63 2d        || (pFunc-
12390 3e 7a 4e 61 6d 65 3d 3d 6e 74 68 5f 76 61 6c 75  >zName==nth_valu
123a0 65 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  eName).         
123b0 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65  || (pFunc->zName
123c0 3d 3d 66 69 72 73 74 5f 76 61 6c 75 65 4e 61 6d  ==first_valueNam
123d0 65 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  e).         || (
123e0 70 46 75 6e 63 2d 3e 7a 4e 61 6d 65 3d 3d 6c 65  pFunc->zName==le
123f0 61 64 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20  adName).        
12400 20 7c 7c 20 28 70 46 75 6e 63 2d 3e 7a 4e 61 6d   || (pFunc->zNam
12410 65 3d 3d 6c 61 67 4e 61 6d 65 29 0a 20 20 20 20  e==lagName).    
12420 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
12430 20 62 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20   bCache = 1;.   
12440 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12460 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74      }..    /* Ot
12470 68 65 72 77 69 73 65 2c 20 63 61 6c 6c 20 77 69  herwise, call wi
12480 6e 64 6f 77 43 6f 64 65 44 65 66 61 75 6c 74 53  ndowCodeDefaultS
12490 74 65 70 28 29 2e 20 20 2a 2f 0a 20 20 20 20 69  tep().  */.    i
124a0 66 28 20 62 43 61 63 68 65 20 29 7b 0a 20 20 20  f( bCache ){.   
124b0 20 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d     VdbeModuleCom
124c0 6d 65 6e 74 28 28 70 50 61 72 73 65 2d 3e 70 56  ment((pParse->pV
124d0 64 62 65 2c 20 22 42 65 67 69 6e 20 43 61 63 68  dbe, "Begin Cach
124e0 65 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20  eStep()"));.    
124f0 20 20 77 69 6e 64 6f 77 43 6f 64 65 43 61 63 68    windowCodeCach
12500 65 53 74 65 70 28 70 50 61 72 73 65 2c 20 70 2c  eStep(pParse, p,
12510 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75   pWInfo, regGosu
12520 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a 20  b, addrGosub);. 
12530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12540 56 64 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e  VdbeModuleCommen
12550 74 28 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  t((pParse->pVdbe
12560 2c 20 22 42 65 67 69 6e 20 44 65 66 61 75 6c 74  , "Begin Default
12570 53 74 65 70 28 29 22 29 29 3b 0a 20 20 20 20 20  Step()"));.     
12580 20 77 69 6e 64 6f 77 43 6f 64 65 44 65 66 61 75   windowCodeDefau
12590 6c 74 53 74 65 70 28 70 50 61 72 73 65 2c 20 70  ltStep(pParse, p
125a0 2c 20 70 57 49 6e 66 6f 2c 20 72 65 67 47 6f 73  , pWInfo, regGos
125b0 75 62 2c 20 61 64 64 72 47 6f 73 75 62 29 3b 0a  ub, addrGosub);.
125c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
125d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
125e0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
125f0 0a                                               .